Clevis

提供: ArchWiki
2022年12月17日 (土) 09:22時点におけるNy-a (トーク | 投稿記録)による版 (→‎YubiKey binding: セクション見出しを訳出)
ナビゲーションに移動 検索に移動

関連記事

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 フック

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

/etc/mkinitcpio.conf
# Edit the hooks and add clevis before the 'encrypt' hook. Eg:
HOOKS=(.. clevis encrypt ..)
ノート: plymouth を使用している場合は、plymouth-encrypt フックを encrypt で置き換えてください。plymouth-encrypt はデバイスが既にアンロックされているときに不具合を生じやすいと報告されています。詳しい情報。

最後に Initramfs を再生成します

Booster

幸いなことに、設定不要で Booster は自動的に LUKS ボリュームバインド を Clevis を使って復号することができます。

Booster は LUKS トークンを読むこと、clevis の情報をデコードすること、パスワードを再構築してパーティションを自動的にアンロックすることも可能です。

Tang (ネットワークバインディング) の pin はネットワークが有効になっていることが必要です。 booster を使用している場合のネットワーク設定については Booster#設定 セクションを参照してください。

Dracut

Dracut は次の追加のパッケージを必要とします。

次に、initramfs の再生成を実行してください。

# dracut -f

ヒントとテクニック

YubiKey バインド

Clevis は YubiKey の チャレンジレスポンスモードを使用して LUKS パーティションをバインドすることができます。LUKS パーティションをバインドするには、次のコマンドを実行してください。

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

yubikey-personalization をインストールします。設定ファイルを編集して、次のオプションを追加してください。

/etc/booster.yaml
extra_files: ykchalresp

ブースターイメージを再生成します。Booster はブート時にこの設定を検出して、認識されている YubiKey をドライブのアンロックに使用します。

See also