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 -l /dev/device | grep 'Block size'
Block size: 4096
# getconf PAGE_SIZE
4096
上記の値が異なっている場合、ファイルシステムを暗号化することはできません。
ファイルシステムの 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
ディレクトリが作成されます。
ディレクトリの自動アンロック
If you want any encrypted directories to be protected by your login passphrase and be automatically unlocked when you log in, edit your PAM configuration to enable pam_fscrypt
:
In /etc/pam.d/system-login
, append the following line to the "auth" section:
auth optional pam_fscrypt.so
Also in /etc/pam.d/system-login
, append the following line to the "session" section:
session optional pam_fscrypt.so drop_caches lock_policies
Finally, append the following line to /etc/pam.d/passwd
:
password optional pam_fscrypt.so
ディレクトリの暗号化
To encrypt an empty directory, run:
$ fscrypt encrypt dir
Follow the prompts to create or choose a "protector". A protector is the secret or information that protects the directory's encryption key. The types of protectors include:
- "custom_passphrase". This is exactly what it sounds like—just a passphrase that you specify.
- "pam_passphrase". This is the login passphrase for a particular user. Directories using this type of protector will be automatically unlocked by
pam_fscrypt
(if enabled) when that user logs in.
In both cases, the passphrase can be changed later, or the directory can be re-protected with another method.
Example for custom passphrase:
$ 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.
Example for PAM passphrase:
$ 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.
ディレクトリの手動アンロック
To manually unlock an encrypted directory, run:
$ fscrypt unlock dir
fscrypt
will prompt you for the passphrase.
ホームディレクトリの暗号化
To encrypt a user's home directory, first ensure you have completed all preparations, including enabling pam_fscrypt
.
Then, create a new encrypted directory for the user:
# mkdir /home/newhome # chown user:user /home/newhome # fscrypt encrypt /home/newhome --user=user
Select the option to protect the directory with the user's login passphrase.
Then copy the contents of the user's old home directory into the encrypted directory:
# cp -a -T /home/user /home/newhome
If you used the cp
method, you can check whether the directory is being automatically unlocked on login before you actually switch to using it. The simplest way to do this is to reboot and log in as that user. Afterwards, run:
$ 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
If it says Unlocked: No
instead, then something is wrong with your PAM configuration, or you did not choose the correct type of protector.
Otherwise, replace the home directory:
# mv /home/user /home/oldhome # mv /home/newhome /home/user # reboot
If everything is working as expected, you can delete the old home directory:
# find /home/oldhome -type f -print0 | xargs -0 shred -n1 --remove=unlink # rm -rf /home/oldhome
トラブルシューティング
See https://github.com/google/fscrypt/blob/master/README.md#troubleshooting for solutions to some common problems and also the open issues on Github.