Linuxのディスク暗号化機能にはいくつかの選択肢がありますが、
fscryptはLinuxで普及しているext4ファイルシステムの標準機能を操作するユーティリティです。
標準カーネルに組込まれているため、多くの場合特殊なセットアップが不要で、Debian系ではapt-get install fscryptでインストールできます。Raspberry Pi上のUbuntuでもx64 PCと同様に動作します。
ディレクトリ単位で細かく暗号化制御できるほか、リムーバブルディスクでも使えます。
機能の有効化
利用開始時には、rootでfscrypt setupを実行する必要があります。
# configファイルのセットアップ
$ sudo fscrypt setup
encryptionが有効になっていないためセットアップ時にエラーが出る場合には、以下のコマンドで有効にできます。
$ sudo tune2fs -O encrypt /dev/<target-device-name>
encryptionの状態は、fscrypt statusコマンドでマウントポイント別に確認できます。
複数パーティション構成の場合
パーティションを分割している場合には、暗号化するパーティションのマウントポイントをそれぞれセットアップする必要があります。
# パーティションのセットアップ(/は上のコマンドに含まれている)
$ [sudo] fscrypt setup <target-dir>
<target-dir>はデバイスファイルではなくファイルシステム上のディレクトリで指定します。
root権限が必要であるか否かは<target-dir>のファイルパーミッションしだいです。アクセスパスのファイルに加えて、各デバイスの.fscrypt/ディレクトリ内のfscryptリソースにもアクセス権があれば、sudoは不要です。
リムーバブルディスク
USBメモリースティックなどのリムーバブルディスクも、あらかじめfdiskなどでパーティション設定をLinuxに変更のうえ、ext4ファイルシステムでフォーマットしておくことで同様に動作します。
$ sudo mkfs.ext4 /dev/<target-device-name>
また、mkfs.f2fs -O encryptを用いて
F2FSでフォーマットしたデバイスも同様に機能します。F2FSのツールはDebian系ではf2fs-toolsに入っています。
リムーバブルディスクは、メディア取り出し操作を行うとロック状態になります。
ディレクトリごとの暗号化設定
空のディレクトリにfscrypt encryptコマンドを実行すると暗号化の対象にできます。
デバイスのトップディレクトリには少なくとも.fscrypt/が存在するため、サブディレクトリが必要です。
また、既存のディレクトリを直接暗号化する手段はありません。
$ mkdir /home/user/somedir
$ fscrypt encrypt /home/user/somedir
# 非インタラクティブに実行する場合
$ echo "some-passphrase" | fscrypt encrypt /home/user/somedir --source=custom_passphrase --name=<ProtectorName> --quiet
fscryptの認証方式(Protector)は3種類あり、任意の文字列で認証する方式はCustom Passphraseです。
1つのディレクトリに複数のProtectorを指定することも可能で、同一ホスト上でディレクトリを共有する場合に活用できます。Protectorには名前を指定して区別します。
また、ディレクトリごとに認証方法を替えることも可能です。
パスフレーズ変更など
パスフレーズ変更などProtectorやPolicyの設定変更はfscrypt metadataサブコマンドで実行します。
Changing a custom passphraseに実例の説明があります。
暗号化と解除
暗号化ディレクトリは、LockedとUnlockedを切り替えて保護します。
読み書きする際には、fscrypt unlockでUnlockedモードにする必要があります。
パスフレーズを要求されますが、標準入力から指定しても動作します。
$ echo "some-passphrase" | fscrypt unlock /home/user/somedir --quiet
読み書きできない状態にするには、fscrypt lockを使います。また、おそらくアンマウントと連動してOSシャットダウン時にもlockされます。
ターゲットディレクトリ外へのロック波及
unlock状態の暗号化ディレクトリにファイルを作成すると、そのファイルは対象ディレクトリ外にmvしても暗号化ファイルのままです。
よってlock状態の場合、過去の操作の影響で対象ディレクトリ外にも暗号化されたファイルが存在するシナリオがあります。
lock状態で暗号化ファイルにアクセスするとRequired key not availableというエラーとともに異常終了します。
このエラーがfscrypt由来のメッセージであることが分かりづらいため、適切な解決にたどり着きにくいことがあります。
典型的には、GitHubのReleaseページからバイナリを直接取得するようなシナリオで、一時的に暗号化ディレクトリでアーカイブ操作すると遭遇します。
lock状態でも利用するファイルは、一貫して暗号化ディレクトリ外で操作することで解決します。
個別のファイルを修復するには、原因となった暗号化ディレクトリをunlockしファイルを読める状態にしたうえで、catとteeの組み合わせなどを用いて、ファイルの内容を非暗号化ディレクトリの新規ファイルに書き込む方法があります。
旧バージョンに関する補足
Linuxカーネルv5.4以降、fscrypt v0.2.6以降の組み合わせでPolicy Version 2をサポートしています。Ubuntuの例では、22.04LTSはVersion 2の構成になっています。
Policy Version 1では
Some processes can’t access unlocked encrypted filesの解説のとおり、デーモンプロセスなどの動作に支障があり、ディストリビューションが古い場合には、注意が必要です。
Ubuntu20.04の例ではカーネルはv5.4ですが、fscryptがv0.2.5のためデフォルト構成ではv1セットアップとなります。GitHubのReleaseページからfscrypt v0.2.9を入手するとv2セットアップに変更できました。
また古いバージョンにはfscrypt lockがなく、rootでfscrypt purgeを実行する必要があります。
fscrypt purgeはインタラクティブに承諾を求められますが、yesコマンドで標準入力から承諾できます。
$ yes | sudo fscrypt purge --user=user /
なおfscrypt purgeの対象は、ディレクトリではなくパーティション(のマウントポイント)です。また、利用ユーザーも指定する必要があります。