Clevis

提供: ArchWiki
2022年12月4日 (日) 13:08時点におけるNy-a (トーク | 投稿記録)による版 (→‎Mkinitcpio hook: 訳出)
ナビゲーションに移動 検索に移動

関連記事

clevis は TPM を使用してキーの作成と暗号化をすることにより、LUKS ボリュームのシステムへのバインディングを可能にします。そして、Clevis の pin を作成したときのシステムの状態を表現する PCR の値を使用してキーを閉じ込めます。

暗号化された LUKS パーティションの解錠に、ユーザーによるパスワードの入力を使うというのは伝統的で広く使われる方法ですが、デメリットも存在します:

  • 手動で入力する必要があるため、自動的に起動したい場合には使えません (例: 巨大なサーバーファーム)。
  • 普通の人間が覚えられるパスワードの長さには限界があり (エントロピーにして ~20-30 ビット)、近代的なブロック暗号に使う鍵としては弱すぎます (128/256 ビット)。

解決策としては強固な鍵を別のどこかに保持しておくという方法があります。例えば TPM チップや Yubikey、あるいは他のネットワークサービスなどが考えられます。Clevis はこのアイデアを実現するフレームワークです。抜き差し可能な pin を使ってデータを暗号化します (clevis の用語では bind)。現在 clevis には3つの pin が存在します:

警告: この方法をルートボリュームで使用すると、上記で述べたいくつかの条件を満たす限り、コンピュータは起動時に、暗号化パスワードを入力することなく 自動的にアンロック されます。
  • これは、ハードウェアが盗まれた場合には、データへのアクセスが保護されないことを意味します。
  • この方法は コールドブートアタック に対してより脆弱になることに注意してください。なぜなら、コンピュータの電源が長い間切られて (メモリが完全にクリアされて) いたとしても、攻撃者は単に電源を入れて TPM が自動的にキーを読み込むのを待てばよいからです。これは価値の高い対象にとっては懸念事項となるでしょう。

インストール

clevis を使うには clevis パッケージを インストール します。

データをバインドする

TPM2 のデータバインディングの例です。

$ clevis encrypt tpm2 '{}' <<< 'hello, world'
eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA

この長い base64 でエンコードされたメッセージは、内部の TPM キーで暗号化されたテキストです。これは現在のコンピュータのみで復号できます。他のコンピュータから (あるいは他の TPM チップを用いて) 復号しようとするとエラーが返されます。

$ clevis decrypt tpm2 '{}' <<< 'eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA'
hello, world

LUKS ボリュームをマウントする

この記事あるいはセクションで使われている用語や表現には問題が存在します。
議論: please use the first argument of the template to provide a brief explanation. (議論: トーク:Clevis#)
警告: TPM による開錠に失敗したときのために、以下のコマンドで強いバックアップパスワードを設定しておいてください。
# cryptsetup luksAddKey /dev/sdX

TPM に LUKS ボリュームをバインドするには、以下のコマンドを使用します。

# clevis luks bind -d /dev/sdX tpm2 '{}'

'{}' には設定が入ります。パラメータがなかったとしても、攻撃者がバックアップパスワードを入手しない限り、他のコンピュータからドライブを復号することはできません。

ノート: UEFI 設定と Secure Boot ポリシーから LUKS キーを守るには、次の設定を使ってください。
'{"pcr_ids":"1,7"}'

UEFI や Secure Boot の設定が変更された場合、TPM は異なる PCR の値を出力して、復号に失敗します。これは 悪意あるメイド攻撃 への防御となります。

パラメータのリストは clevis-encrypt-tpm2(1) § CONFIG を参照してください。

PCR の意味の全ての説明は、 TCG specification (§ 2.3.4) を参照してください。

もしこれが ERROR: pcr-input-file filesize does not match pcr set-list のエラーで失敗する場合には、別の PCR バンクを指定する必要があります。

'{"pcr_bank":"sha256","pcr_ids":"1,7"}'

2022年8月現在、Clevis は sha1 (デフォルト) と sha256 バンクのみをサポートしています。つまり、唯一異なるオプションは sha256 です。利用可能な、または使用中のバンクは # tpm2_pcrread を使用して調べることができます。

PCR の値に変更が生じるシステム設定の変更を行った後 (例えば PCR 0 が使用されているときに UEFI の更新を行った場合) に新しい Clevis の pin を生成する場合には、以下のコマンドを実行してください。

# cryptsetup luksDump /dev/sdX
Tokens:
  token slot: clevis
        Keyslot:  keyslot

Clevis の pin に使用されているスロットを探すには、

# clevis luks regen -d /dev/sdX -s keyslot

Clevis バインディングを削除するには、次のコマンドを実行します。

# clevis luks unbind -d /dev/sdX -s keyslot 
警告: 正しいスロットを選択していることを再確認してください。さもないと、ボリュームへのアクセスを失うことになります。

TPM にバインドされたボリュームは以下を使用してアンロックできます。

# clevis luks unlock -d /dev/sdX

/etc/crypttab にあるボリュームの自動復号をするには、clevis-luks-askpass.path有効化 してください。

ルートボリュームの自動復号をするには、Initramfs ジェネレータに変更を加える必要があります。

Mkinitcpio hook

mkinitcpio-clevis-hookAUR パッケージをインストールしてください。その後、mkinitcpio.conf を編集して clevis フックを有効にしてください。

/etc/mkinitcpio.conf
# Edit the hooks and add clevis before the 'encrypt' hook. Eg:
HOOKS=(.. clevis encrypt ..)
ノート: If you are using plymouth, replace the plymouth-encrypt hook with encrypt. plymouth-encrypt is reported to be buggy when the device is already unlocked. More info.

最後に Initramfs を再生成します

Booster

Luckily Booster automatically decrypts LUKS volumes bound using Clevis out of the box!

Booster is also able to read the LUKS tokens, decode clevis information, reconstruct the password and unlock the partition automatically.

Tang (network binding) pin requires network enabled. Please refer to Booster#Configuration section for more information on network configuration with booster.

Dracut

Dracut needs the following extra packages:

Followed by an initramfs regeneration:

# dracut -f

Tips and tricks

YubiKey binding

Clevis allows binding a LUKS partition using YubiKey's challenge-response mode. To bind a LUKS partition, run

# clevis luks bind -d /dev/sdX yubikey '{"slot":1}'

Install yubikey-personalization. Edit the configuration file and add following option:

/etc/booster.yaml
extra_files: ykchalresp

Regenerate the booster images. Booster will detect this configuration during boot and use the present YubiKey to unlock the drive.

See also