Linux Advent Calendar 2017、 Debian/Ubuntu Advent Calendar 2017 兼用の 10日目の記事です。
FIXME: Debian sid の systemd では動かないようです。 core: link user session keyring to session keyring #6286 https://github.com/systemd/systemd/pull/6286 参照。
某弊社 では「社外に持ち出すノート PC のファイルシステムは暗号化してね」って言われているのですが、 システムまるごと暗号化するのは面倒そう(やったことがないので想像)だったので、 Linux-CryptHome というものを作ってホームディレクトリだけ暗号化しています。 今回はこれを紹介したいと思います。
- Linux-CryptHome - Mount/Unmount an encrypted user’s home directory at login/logout
 
要件
Linux と以下のパッケージが必要です。ディストリビューションは新し目の Debian / Ubuntu なら大丈夫だと思います。恐らく RHEL / CentOS も大丈夫です。
- systemd
 - keyutils
 - cryptsetup
 - lvm2
 
Linux-CryptHome 用の暗号化ホームディレクトリの作成
下記の手順で LVM 上に LUKS 暗号化ボリュームを作成し、 さらにその上にユーザーのホームディレクトリとして利用するファイルシステムを作成します。
- LVM で 
crypthome.<ユーザー名>という名前の論理ボリュームを作成する。 - 作成した論理ボリュームを LUKS ボリュームとして初期化する。 パスフレーズにはユーザーのログインパスワードを設定すること。
 - LUKS ボリュームをオープンする。 先に設定したパスフレーズ(パスワード)の入力が必要です。
 - LUKS ボリュームにファイルシステムを作成する。
 - LUKS ボリュームをクローズする。
 
TODO: 管理者が保守するためのパスフレーズを cryptsetup luksAddKey 〜 で追加する手順を追加。
ユーザー名 alice、論理ボリュームを作成する LVM
ボリュームグループ名 VolGroup、ボリュームサイズ 10 GB、
ファイルシステム XFS を利用する場合の実行例を示します。
# lvcreate -n crypthome.alice -L 10g VolGroup
  Logical volume "crypthome.alice" created.
# cryptsetup luksFormat /dev/VolGroup/crypthome.alice
WARNING!
========
This will overwrite data on /dev/VolGroup/crypthome.alice irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase: <ユーザー alice のログインパスワード>
Verify passphrase: <ユーザー alice のログインパスワード>
# cryptsetup luksDump /dev/VolGroup/crypthome.alice
LUKS header information for /dev/VolGroup/crypthome.alice
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha256
...省略...
# cryptsetup open /dev/VolGroup/crypthome.alice decrypthome.alice
Enter passphrase for /dev/VolGroup/crypthome.alice: <ユーザー alice のログインパスワード>
# mkfs -t xfs /dev/mapper/decrypthome.alice
...省略...
# mkdir -p -m 0755 ~alice
# mount /dev/mapper/decrypthome.alice ~alice
# cp -a /etc/skel/. ~alice/
# chown -R alice: ~alice
# chmod 0750 ~alice
# umount ~alice
# cryptsetup close decrypthome.alice
Linux-CryptHome のインストール
Linux-CryptHome
のソースツリーを git clone 〜 などでダウンロードし、
付属のシェルスクリプトと systemd unit ファイルをインストールします。
$ git clone https://github.com/fumiyas/linux-crypthome.git
...省略...
$ cd linux-crypthome
$ sudo install -m 0755 crypthome-{pam,mount,umount} /usr/local/sbin/
$ sudo install -m 0644 crypthome@.service /lib/systemd/system/
$ sudo systemctl daemon-reload
PAM の設定
Debian / Ubuntu の場合
/etc/pam.d/common-auth ファイル内の
# end of pam-auth-update config 行の後に pam_exec.so の行を追加します。
...省略...
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config
auth	optional			pam_exec.so expose_authtok /usr/local/sbin/crypthome-pam
RHEL / CentOS の場合
/etc/pam.d/postlogi ファイルに pam_exec.so の行を追加します。
追加する場所はどこでも構いません。
...省略...
auth        optional      pam_exec.so expose_authtok /usr/local/sbin/crypthome-pam
...省略...
SSH デーモンの設定
Linux-CryptHome で暗号化ホームディレクトリをマウント/アンマウントするユーザーは、 ログイン時に PAM によるパスワード認証を受ける必要があります。 このため、SSH でのログインを公開鍵認証でのみ許可している場合は、 追加でパスワード認証も要求するように設定変更が必要です。
SSH デーモンの設定ファイル sshd_config(5) の設定例を示します。
(直接関係するディレクティブだけを抜粋)
AuthorizedKeysFile .ssh/authorized_keys /srv/home/%u/etc/ssh/authorized_keys
PubkeyAuthentication yes
PasswordAuthentication no
UsePAM yes
Match User alice
  PasswordAuthentication yes
  AuthenticationMethods publickey,password
Match Group crypthome-users
  PasswordAuthentication yes
  AuthenticationMethods publickey,password
簡単に解説しましょう。
AuthorizedKeysFile .ssh/authorized_keys /srv/home/%u/etc/ssh/authorized_keys- 認証許可する SSH 公開鍵リストファイルの場所に
/srv/home/<ユーザー名>/etc/ssh/authorized_keysを追加します。 - 認証時は Linux-CryptHome 対象ユーザーのホームディレクトリ内は参照できないため、 ホームディレクトリ外に配置する必要があります。
 - Linux-CryptHome 対象ユーザーの 
<ユーザーホームディレクトリ>/.ssh/authorized_keysは/srv/home/<ユーザー名>/etc/ssh/authorized_keysへのシンボリックリンクにしておくとよいでしょう。 AuthorizedKeysCommandの利用も検討しましょう。
- 認証許可する SSH 公開鍵リストファイルの場所に
 UsePAM yes- PAM の利用を有効化します。
 - パスワード認証時に PAM の認証モジュールが利用され、 ログイン/ログアウト時に PAM セッションの開始/終了が実行されるようになります。
 
AuthenticationMethods publickey,password- ユーザーをパスワードと公開鍵で認証します。(多要素認証)
 - 各認証は記述した順番で試行されます。
 - この例では公開鍵認証が先に試行され、次に PAM によるパスワード認証が試行されます。
 
Match User aliceMatch Group crypthome-users- 続くディレクティブを特定のユーザーやグループ、IPアドレスやポート番号 に該当する場合にだけ適用します。
 - この例では Linux-CryptHome 対象のユーザーとグループにだけ 公開鍵認証とパスワード認証の多要素認証を適用しています。
 
制限など
su - alice には対応できません。代わりに次のような設定を sshd_config(5)
に追加して ssh alice@localhost で代用しましょう。
Match Address 127.0.0.1 Group crypthome-users
  PasswordAuthentication yes
  AuthenticationMethods password
Match Address ::1 Group crypthome-users
  PasswordAuthentication yes
  AuthenticationMethods password
TODO リスト:
- ログインパスワード変更時に暗号化ボリュームのパスフレーズも同時に変更。
 - 暗号化ボリュームが存在しなかった場合に自動作成するオプションの実装。
 - 暗号化ボリューム/ファイルシステムをリサイズするにはどう操作する?
 - デバッグしやすいようにログを出力するオプションの実装。
 - ログイン中にスクリーンロック/アンロックしたときに暗号化ボリュームも ロック/アンロック。
 
ところで、12月25日はクリスマスな上に、
OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
っ http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority
逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!
私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/
よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。
- Ansible Advent Calendar 2023
 - シェル芸 Advent Calendar 2023
 - 闇の魔術に対する防衛術 Advent Calendar 2023
 - Ansible Advent Calendar 2023
 - Ansible Advent Calendar 2020
 - DNS温泉 Advent Calendar 2019
 - OSSTech Advent Calendar 2019
 - Ansible Advent Calendar 2018
 - OSSTech Advent Calendar 2018
 - Debian/Ubuntu Advent Calendar 2017
 - Linux Advent Calendar 2017
 - Shell Script Advent Calendar 2017
 - Shell Script Advent Calendar 2016
 - OpenLDAP と仲間たち Advent Calendar 2015
 - Postfix Advent Calendar 2014
 - 拡張 POSIX シェルスクリプト Advent Calendar 2013