fscrypt

提供: ArchWiki
2023年7月3日 (月) 00:56時点におけるKgx (トーク | 投稿記録)による版 (→‎ディレクトリの手動アンロック: 同期)
ナビゲーションに移動 検索に移動

関連記事

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) に移っています。

他の暗号化手段に関する詳細についてはディスク暗号化を参照してください。

ノート:
  • fscryptdm-crypt と組み合わせて使用​​することが可能で、各暗号化層が異なる目的を果たします。たとえば、ファイルシステム自体は、セキュア ブート に関連付けられた TPM やシステムのすべてのユーザーに知られているパスワードなど、安全性の低い方法を使用して dm-crypt によって保護できますが、各ユーザーのホームディレクトリもそのユーザーのみが知っているパスワードを使用して fscrypt を実行します。
  • e2fsprogse4crypt ツールは、fscrypt ツールの代わりに使用できます。ただし、e4crypt には多くの基本機能が欠けており、現在は積極的に開発されていないため、これはお勧めできません。
  • f2fs-toolsf2fscrypte4crypt の単なるコピーであり、同様に推奨されません。

準備

カーネル

公式サポートされているカーネルでは ext4, F2FS, UBIFS で fscrypt に対応しています。

カスタムカーネルのバージョン 5.1 以上を使っている場合、CONFIG_FS_ENCRYPTION=y を設定してください。古いカーネルの場合は ドキュメント を見てください。

ファイルシステム

ext4

ext4 の場合、暗号化が使用されるファイルシステムでは、encrypt 機能フラグが有効になっている必要があります。有効にするには、次を実行します。

# tune2fs -O encrypt /dev/device
ヒント: 新しいファイルシステムを作成する際に mkfs.ext4 -O encrypt とすることで encrypt 機能をすぐに有効化できます。

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 ディレクトリが作成されます。

警告: .fscrypt ディレクトリを削除してはいけません。そうすると暗号化されたファイルにアクセスできなくなります。

PAM モジュール

ログイン時にログインパスフレーズで保護されたディレクトリのロックを自動的に解除し、ログインパスフレーズで保護されたディレクトリをログインパスフレーズの変更と同期させておくには、システム PAM 構成を調整して pam_fscrypt を有効にします。

/etc/pam.d/system-loginauth セクションに次の行を 追加 します。

/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
ノート: https://github.com/google/fscrypt/issues/95 から取得した最初の行は、systemd --user セッションのバイパスであり は PAM セッションを適切に閉じず ログアウト時のロックがブロックされます。

最後に、次の行を /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.
ノート: 暗号化は空のディレクトリでのみ有効化できます。既存のディレクトリを暗号化したい場合、ファイルをコピーしてから元のファイルを削除してください。例:
$ mkdir new_dir
$ fscrypt encrypt new_dir
$ cp -a -T old_dir new_dir
$ find old_dir -type f -print0 | xargs -0 shred -n1 --remove=unlink
$ rm -rf old_dir
元のファイルを削除してもディスクからフォレンジックによって復元できる可能性があります (特に SSD を使用している場合)。データは最初から暗号化された状態にすることを推奨します。

ディレクトリのロック/ロック解除

暗号化されたディレクトリのロックを解除するには、次を実行します。

$ fscrypt unlock dir

fscrypt はパスフレーズの入力を求めます。

暗号化されたディレクトリをロックするには、次を実行します。

$ fscrypt lock dir

ホームディレクトリの暗号化

警告: ユーザーのホームディレクトリが暗号化されている場合、ホームディレクトリの暗号化が解除されるまでそのユーザーに ssh でログインできなくなります。

ユーザーのホームディレクトリを暗号化するには、最初に pam_fscrypt の有効化などの準備を行ってください。

それから、新しい暗号化ディレクトリを作成:

# mkdir /home/newhome
# chown user:user /home/newhome 
# fscrypt encrypt /home/newhome --user=user

ユーザーのログインパスフレーズを使ってディレクトリを保護するオプションを選択してください。

それからユーザーのホームディレクトリの中身を暗号化ディレクトリにコピーしてください:

# cp -a -T /home/user /home/newhome
ヒント: ホームディレクトリのコピーのための容量がディスクに存在しない場合、mv -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
ヒント: shred の実行は任意ですが、強く推奨します。

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#troubleshootingopen issues on Github を見てください。

参照