fscrypt

提供: ArchWiki
2022年3月1日 (火) 21:30時点におけるKgx (トーク | 投稿記録)による版 (Linux コンテナ内の暗号化 (lxc)を翻訳して追加)
ナビゲーションに移動 検索に移動

関連記事

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

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

ノート: e2fsprogse4crypt ツールを fscrypt ツールの代わりとして使うことができます。ただし、e4crypt には基本的な機能が存在せず既に開発されていないため使用は推奨されません。

準備

カーネル

公式サポートされているカーネルでは 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
警告: encrypt 機能が一度有効になると、4.1 以前の Linux はそのファイルシステムをマウントできなくなります。
ヒント:
  • 機能の有効化は debugfs -w -R "feature -encrypt" /dev/device で解除できます。fsck を実行してファイルシステムの整合性を確認してください。
  • 新しいファイルシステムを作成する際に mkfs.ext4 -O encrypt -b 4096 とすることで 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_fscrypt を有効化してください:

/etc/pam.d/system-login の "auth" セクションに以下の行を追加:

auth            optional   pam_fscrypt.so

また、/etc/pam.d/system-login の "session" セクションに以下の行を追加:

session         optional   pam_fscrypt.so       drop_caches lock_policies

最後に、/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 はパスフレーズの入力を要求します。

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

警告: ユーザーのホームディレクトリが暗号化されている場合、ホームディレクトリの暗号化が解除されるまでそのユーザーに 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 を見てください。

参照