fscrypt
ext4, F2FS, UBIFS ファイルシステムは fscrypt (旧名 "ext4 encryption") と呼ばれる共通 API によるファイル暗号化にネイティブで対応しています。fscrypt ではディレクトリ単位で暗号化を適用できます。ディレクトリごとに別々の暗号鍵を使用することが可能です。ディレクトリを暗号化するとファイルの中身、ファイル名、シンボリックリンク全てが暗号化されます。サブディレクトリも全て暗号化されます。ファイル名以外のメタデータ、タイムスタンプや容量、ファイルの数、拡張属性などは暗号化されません。
fscrypt はカーネルの機能を使うための同名のユーザースペースツールの名前でもあります。この記事では fscrypt ツール を使ってホームディレクトリなどを暗号化する方法を説明します。
目次
検討すべき代替案
ファイルシステム全体をひとつのパスワードで保護したい場合、dm-crypt でブロックデバイス暗号化するほうが良いでしょう。その場合、ファイルシステムのメタデータも全て暗号化されます。特定のディレクトリだけを暗号化したい場合や、それぞれのディレクトリのロックを別個に解除したい場合 (ユーザーごとにホームディレクトリを暗号化するなど) は fscrypt が相応しいと思われます。
eCryptfs とは異なり、fscrypt はスタックファイルシステムではありません。ファイルシステムによってネイティブでサポートされています。そのため fscrypt はメモリの使用量が低くなっています。また、fscrypt は最新の暗号技術を使用し、setuid バイナリを必要としません。さらに、eCryptfs は開発が止まっているため、主要なユーザーは dm-crypt (Ubuntu) や fscrypt (Android と Chrome OS) に移っています。
他の暗号化手段に関する詳細についてはディスク暗号化を参照してください。
準備
カーネル
公式サポートされているカーネルでは ext4, F2FS, UBIFS で fscrypt に対応しています。
カスタムカーネルのバージョン 5.1 以上を使っている場合、CONFIG_FS_ENCRYPTION=y
を設定してください。古いカーネルの場合は ドキュメント を見てください。
ファイルシステム
ext4
ext4 の場合、暗号化が使用されるファイルシステムでは、encrypt
機能フラグが有効になっている必要があります。有効にするには、次を実行します。
# tune2fs -O encrypt /dev/device
F2FS
F2FS の場合、fsck.f2fs -O encrypt
または mkfs.f2fs -O encrypt
を使ってください。
ユーザースペースツール
fscrypt-gitAUR をインストールしてください。または、以前インストールしていた場合は最新版にアップグレードしてください。それから以下のコマンドを実行:
# fscrypt setup
上記のコマンドで /etc/fscrypt.conf
ファイルと /.fscrypt
ディレクトリが作成されます。
そして、暗号化したいファイルシステムがルートファイルシステムではない場合、以下のコマンドを実行してください:
# fscrypt setup mountpoint
mountpoint
はファイルシステムがマウントされているディレクトリに置き換えてください (例: /home
)。
上記のコマンドで fscrypt のポリシーとプロテクターを保存するための mountpoint/.fscrypt
ディレクトリが作成されます。
PAM モジュール
ログイン時にログインパスフレーズで保護されたディレクトリのロックを自動的に解除し、ログインパスフレーズで保護されたディレクトリをログインパスフレーズの変更と同期させておくには、システム PAM 構成を調整して pam_fscrypt を有効にします。
/etc/pam.d/system-login
の auth セクションに次の行を 追加 します。
/etc/pam.d/system-login
auth optional pam_fscrypt.so
session セクションの session include system-auth
の 前 に次の行を挿入します。
/etc/pam.d/system-login
session [success=1 default=ignore] pam_succeed_if.so service = systemd-user quiet session optional pam_fscrypt.so
最後に、次の行を /etc/pam.d/passwd
に 追加 します。
/etc/pam.d/passwd
password optional pam_fscrypt.so
ディレクトリの暗号化
空のディレクトリを暗号化したい場合、以下のコマンドを実行:
$ fscrypt encrypt dir
プロンプトに従って「プロテクター」を作成あるいは選択してください。プロテクターはディレクトリの暗号鍵を保護する秘密鍵です。プロテクターの種類:
- "custom_passphrase" - 名前の通り、あなたが設定するパスフレーズです。
- "pam_passphrase" - 特定のユーザーのログインパスフレーズです。このタイプのプロテクターを使用するディレクトリはユーザーのログイン時に自動的に
pam_fscrypt
によって解錠されます (有効化されている場合)。
どちらの場合でも、パスフレーズは後から変更が可能で、他の方法でディレクトリを再保護することもできます。
カスタムパスフレーズの例:
$ fscrypt encrypt private/
Should we create a new protector? [y/N] y Your data can be protected with one of the following sources: 1 - Your login passphrase (pam_passphrase) 2 - A custom passphrase (custom_passphrase) 3 - A raw 256-bit key (raw_key) Enter the source number for the new protector [2 - custom_passphrase]: 2 Enter a name for the new protector: Super Secret Enter custom passphrase for protector "Super Secret": Confirm passphrase: "private/" is now encrypted, unlocked, and ready for use.
PAM パスフレーズの例:
$ fscrypt encrypt private/
Should we create a new protector? [y/N] y Your data can be protected with one of the following sources: 1 - Your login passphrase (pam_passphrase) 2 - A custom passphrase (custom_passphrase) 3 - A raw 256-bit key (raw_key) Enter the source number for the new protector [2 - custom_passphrase]: 1 Enter login passphrase for testuser: "private/" is now encrypted, unlocked, and ready for use.
ディレクトリの手動アンロック
手動で暗号化ディレクトリを解錠するには、以下のコマンドを実行:
$ fscrypt unlock dir
fscrypt
はパスフレーズの入力を要求します。
ホームディレクトリの暗号化
ユーザーのホームディレクトリを暗号化するには、最初に pam_fscrypt
の有効化などの準備を行ってください。
それから、新しい暗号化ディレクトリを作成:
# mkdir /home/newhome # chown user:user /home/newhome # fscrypt encrypt /home/newhome --user=user
ユーザーのログインパスフレーズを使ってディレクトリを保護するオプションを選択してください。
それからユーザーのホームディレクトリの中身を暗号化ディレクトリにコピーしてください:
# cp -a -T /home/user /home/newhome
cp
を使用した場合、実用前にログインでディレクトリが自動的に解除されるか確認できます。一番簡単な方法は再起動してそのユーザーでログインすることです。その後、以下のコマンドを実行:
$ fscrypt status /home/newhome
"/home/newhome" is encrypted with fscrypt. Policy: d80f252996aae181 Options: padding:32 contents:AES_256_XTS filenames:AES_256_CTS Unlocked: Yes Protected with 1 protector: PROTECTOR LINKED DESCRIPTION 5952c84ebaf0f98d No login protector for testuser
Unlocked: No
と表示される場合、PAM の設定に問題があるか、あるいは適切なタイプのプロテクターを選択していなかったことになります。
そうでない場合、ホームディレクトリを置き換えてください:
# mv /home/user /home/oldhome # mv /home/newhome /home/user # reboot
問題なく動いたら、古いホームディレクトリを削除できます:
# find /home/oldhome -type f -print0 | xargs -0 shred -n1 --remove=unlink # rm -rf /home/oldhome
Linux コンテナ内の暗号化 (lxc)
Linux Containers(lxc)内、またはより一般的にはファイルシステムのルートディレクトリが表示されない mount_namespaces(7) での fscrypt の使用のサポートが v0.2.8 で追加されました。
コンテナ停止時にディレクトリをロック
コンテナ内の systemd/ユーザー ユニットは、コンテナの停止時に暗号化されたディレクトリをロックすることができます。
~/.config/systemd/user/lock-directory.service
[Unit] Description=lock encrypted directory on shutdown DefaultDependencies=no Before=shutdown.target [Service] Type=oneshot ExecStart=/bin/sh -c "/usr/bin/fscrypt lock /home/facade/target" TimeoutStartSec=0 [Install] WantedBy=shutdown.target
トラブルシューティング
基本的な問題に対する解決方法は https://github.com/google/fscrypt/blob/master/README.md#troubleshooting や open issues on Github を見てください。