Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.9.5. 信頼できる鍵および暗号化された鍵

信頼できる鍵と暗号化された鍵は、カーネルキーリングサービスを使用するカーネルが生成する可変長の対称鍵です。キーが暗号化されていない形式でユーザースペースに表示されないという事実は、キーの整合性を検証できることを意味します。つまり、拡張検証モジュール (EVM) などで実行中のシステムの整合性を検証および確認するために使用できます。ユーザーレベルのプログラムは、暗号化された blobs の形式でのみキーにアクセスできます。
信頼できる鍵は、Trusted Platform Module (TPM) チップというハードウェアが必要になります。これは、鍵を作成し、暗号化 (保護) するために使用されます。TPMstorage root key (SRK) という 2048 ビットの RSA 鍵を使用して鍵を保護します。
それに加えて、信頼できるキーは、TPMプラットフォーム設定レジスター (PCR) 値の特定のセットを使用してシールすることもできます。PCR には、BIOS、ブートローダー、およびオペレーティングシステムを反映する一連の整合性管理値が含まれています。つまり、PCR でシールされたキーは、暗号化されたのとまったく同じシステム上の TPM でのみ復号化できます。ただし、PCR で保護された信頼できる鍵が読み込まれると (キーリングに追加されると)、新しいカーネルなどを起動できるように、関連する PCR 値が検証され、新しい (または今後の) PCR 値に更新されます。1 つの鍵を複数の blobs として保存することもできますが、それぞれ PCR 値が異なります。
暗号化鍵は、カーネルの AES 暗号を使用するため、TPM を必要とせず、信頼できる鍵よりも高速になります。暗号化鍵は、カーネルが生成した乱数を使用して作成され、ユーザー空間の blobs へのエクスポート時に マスターキー により暗号化されます。このマスターキーは、信頼できるキーでもユーザーキーでも構いませんが、これが主な欠点となっています。マスターキーが信頼できるキーでない場合、暗号化されたキーは、それを暗号化するために使用したユーザーキーと同等の安全性しか得られません。

4.9.5.1. 鍵を使った作業

鍵を使った操作を行う前に、trusted および encrypted-keys カーネルモジュールがシステムにロードされていることを確認してください。さまざまな RHEL カーネルアーキテクチャーでカーネルモジュールをロードするときは、次の点を考慮してください。
  • x86_64 アーキテクチャーを備えた RHEL カーネルの場合、TRUSTED_KEYS および ENCRYPTED_KEYS コードがコアカーネルコードの一部として組み込まれています。その結果、x86_64 システムのユーザーは、trustedモジュールやencrypted-keysモジュールを読み込むことなく、これらのキーを使用することができます。
  • その他のアーキテクチャーの場合、鍵を使った操作を行う前に、trusted および encrypted-keys カーネルモジュールをロードする必要があります。カーネルモジュールをロードするには、以下のコマンドを実行します。
    ~]# modprobe trusted encrypted-keys
信頼できる暗号化された鍵は、keyctl ユーティリティーを使用して作成、読み込み、エクスポート、更新することができます。keyctl の使用に関する詳細は、keyctl(1) を参照してください。
注記
TPM を使用するには (信頼できる鍵の作成および保護目的など)、これを有効かつアクティブにする必要があります。これは通常、マシンの BIOS で設定するか、ユーティリティーの tpm-tools パッケージから tpm_setactive コマンドを使用するとできます。また、TPMと通信するためには、TrouSersアプリケーション (trousersパッケージ) のインストールと、TrouSersスイートの一部であるtcsdデーモンの実行が必要です。
TPM を使用して信頼できるキーを作成するには、次の構文で keyctl コマンドを実行します。
~]$ keyctl add trusted name "new keylength [options]" keyring
上記の構文を使用すると、コマンドの例を次のように作成できます。
~]$ keyctl add trusted kmk "new 32" @u
642500861
上記の例では、kmk と呼ばれる 32 バイト (256 ビット) の長さの信頼できる鍵が作成され、ユーザーキーリング (@u) に置かれます。鍵の長さは 32 から 128 バイト (256 から 1024 ビット) です。カーネルのキーリングの現在の構造を一覧表示するには、show サブコマンドを使用します。
~]$ keyctl show
Session Keyring
       -3 --alswrv    500   500  keyring: _ses
 97833714 --alswrv    500    -1   \_ keyring: _uid.1000
642500861 --alswrv    500   500       \_ trusted: kmk
print サブコマンドは、暗号化されたキーを標準出力に出力します。キーをユーザースペースの blob にエクスポートするには、次のように pipe サブコマンドを使用します。
~]$ keyctl pipe 642500861 > kmk.blob
ユーザースペースの blob から信頼できる鍵を読み込むには、blob を引数として add コマンドを再度使用します。
~]$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824
次に、TPM でシールされた信頼できる鍵を使用して、安全な暗号化された鍵を作成できます。暗号化された鍵の生成には、以下のコマンド構文を使用します。
~]$ keyctl add encrypted name "new [format] key-type:master-key-name keylength" keyring
上記の構文に基づいて、すでに作成済みの信頼できるキーを使用して暗号化されたキーを生成するコマンドは、次のように設定できます。
~]$ keyctl add encrypted encr-key "new trusted:kmk 32" @u
159771175
TPM が使用できないシステムで暗号化されたキーを作成するには、ランダムな数字のシーケンスを使用してユーザーキーを生成し、次にこれを使用して実際の暗号化されたキーをシールします。
~]$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
427069434
次に、乱数ユーザーキーを使用して暗号化されたキーを生成します。
~]$ keyctl add encrypted encr-key "new user:kmk-user 32" @u
1012412758
list サブコマンドを使用して、指定したカーネルキーリング内のすべてのキーを一覧表示できます。
~]$ keyctl list @u
2 keys in keyring:
427069434: --alswrv  1000  1000 user: kmk-user
1012412758: --alswrv  1000  1000 encrypted: encr-key
重要
暗号化鍵がマスターの信頼できる鍵で保護されていない場合には、そのセキュリティーは、ユーザーのマスターキー (乱数キー) を使用して暗号化したものと同じでしかない点に注意してください。そのため、マスターユーザーキーはできるだけ安全に、システムの起動プロセスの早い段階で読み込む必要があります。