pkcs11_tpm - トラステッドプラットフォームモジュール (TPM) 用 RSA PKCS#11 トークン
/usr/lib/security/pkcs11_tpm.so
/usr/lib/security/64/pkcs11_tpm.so
pkcs11_tpm.so オブジェクトは、Trusted Computing Group のプロトコルを使用して TPM セキュリティーデバイスと通信することで、RSA Security Inc. の PKCS#11 暗号化トークンインタフェース (Cryptoki) v2.20 仕様を実装します。このプロバイダは PKCS#11 仕様を実装し、pkg:/library/security/trousers パッケージの TCG ソフトウェアスタック (TSS) API を使用します。
アプリケーション開発者は、pkcs11_tpm.so に直接リンクするのではなく、libpkcs11.so.1 にリンクするようにしてください。libpkcs11(3LIB) を参照してください。
実装されている暗号化アルゴリズムは、RSA、SHA1、および MD5 です。
libpkcs11(3LIB) のリストに示されている標準の PKCS#11 関数は、次を除きすべて実装されています。
C_EncryptUpdate C_EncryptFinal C_DecryptUpdate C_DecryptFinal C_DigestEncryptUpdate C_DecryptDigestUpdate C_SignEncryptUpdate C_DecryptVerifyUpdate C_GetFunctionStatus C_CancelFunction C_WaitForSlotEvent C_GenerateKey C_DeriveKey
サポートされている RSA PKCS#11 v2.20 メカニズムは次のとおりです。
CKM_RSA_PKCS_KEY_PAIR_GEN CKM_RSA_PKCS CKM_RSA_PKCS_OAEP CKM_RSA_X_509 CKM_MD5_RSA_PKCS CKM_SHA1_RSA_PKCS CKM_SHA_1 CKM_SHA_1_HMAC CKM_SHA_1_HMAC_GENERAL CKM_MD5 CKM_MD5_HMAC CKM_MD5_HMAC_GENERAL
pkcs11_tpm プロバイダを使用できるのは、システムに TPM デバイスが存在し、かつ pkg:/library/security/trousers パッケージがインストールされている場合だけです。これらの前提条件が満たされている場合、ユーザーは pktool(1) を使用すると自分専用のプライベートトークンを作成できます。このトークンにより、TPM デバイスを使用した操作を実行でき、TPM によって保護された鍵で自分の非公開データを保護できます。
ユーザーの TPM トークンを準備して初期化するには、次の手順を実行する必要があります。
トークンを初期化します。
SO (セキュリティー責任者) の PIN を設定します。
ユーザーの一意の PIN を設定します。
トークンを初期化するには、pktool(1) コマンドを次のように使用します。
$ pktool inittoken currlabel=TPM newlabel=tpm/myname
デフォルトでは、初期化されていない TPM は TPM という名前で認識されます。ユーザーが自分専用のプライベートトークンを初期化するときに、別の名前 (tpm/joeuser など) に変更することも、TPM のままにする (その場合は newlabel 引数を省略する) こともできます。
ユーザーは自分のトークンを初期化する前に、デフォルトの SO PIN を入力する必要があります。デフォルトの SO PIN は 87654321 です。これは上記の手順 2 で変更されています。
トークンを初期化したあとは、SO PIN とユーザー PIN をデフォルト値から変更する必要があります。これらの PIN の値を変更するには、再度 pktool(1) を使用します。
SO PIN の変更は次のように行います。
$ pktool setpin token=tpm/joeuser usertype=so
so オプションは、この「setpin」操作が SO PIN の変更であることを示すもので、省略できません。ユーザーはデフォルトの SO PIN (87654321) を入力してから、新しい PIN を入力 (および確認) する必要があります。
SO PIN をデフォルトから変更したあと、ユーザーの一意の PIN もリセットする必要があります。
ユーザーの PIN の変更は次のように行います。
$ pktool setpin token=tmp/joeuser
SO 以外のユーザーのデフォルト PIN は 12345678 です。ユーザーはデフォルトの PIN を入力してから、新しい一意の PIN を入力 (および確認) する必要があります。
pktool setpin 操作または C_Login() 関数と C_SetPIN() 関数に設定する PIN には、長さが 1 から 256 までで、空文字を含まない、任意の文字列を使用できます。
ユーザーは自分のトークンを初期化したあと、pktool(1) で、あるいは PKCS11 アプリケーションを作成することにより、トークンの使用を開始できます。その際、前述の手順で作成した名前 (前述の例では tpm/joeuser) を使用してトークンを特定します。
たとえば、
$ pktool gencert token=tpm/joeuser -i $ pktool list token=tpm/joeuser
pkcs11_tpm.so により、ファイルシステム固有のトークンオブジェクトの記憶領域にオブジェクトストレージが提供されます。プライベートオブジェクトは秘密鍵による暗号化で保護されています。復号化するには、トークンの秘密鍵を TPM に読み込み、復号化をすべて TPM 内で実行する必要があります。ユーザーの秘密鍵は、ユーザーが個人用の PIN を設定したときに (前述の説明を参照)、TPM によって生成されます。SO の鍵もユーザーの鍵も、TSS 永続的ストレージデータベースに保存され、一意の UUID 値で参照されます。どのユーザートークンにも一意の SO 鍵と一意のユーザー鍵があるため、あるユーザーのトークンの PIN で、同じマシンの別のユーザーのトークンに保存されている非公開データがロック解除されることはありません。
TPM はそれぞれ一意なので、ある TPM で作成されたトークンキーを別の TPM で使用することはできません。pkcs11_tpm.so トークンのデータは、TPM が存在しているシステムですべて管理されます。ほかのシステムに移動することはできません。TPM がリセットされ SRK (ストレージルートキー) が変更された場合、その TPM でそれまでに生成された鍵はすべて無効になります。
pkcs11_tpm.so は、作成されたトークンごとに専用のワークスペースを作成して、管理ファイルを管理します。デフォルトでは、この領域は /var/user/$USERNAME/tpm/ として作成されます。ただし、ユーザーはトークンの初期化や使用を開始する前に PKCS11_TPM_DIR 環境変数を設定することにより、この設定をオーバーライドできます。
実装されている各関数の戻り値は、RSA PKCS#11 v2.20 仕様で定義されています。
ユーザーのデフォルトのトークンオブジェクトストア。
代替のトークンオブジェクトストア。
属性についての詳細は、マニュアルページの attributes(5) を参照してください。
|
「MT-安全」属性の例外については、RSA PKCS#11 v2.20 のセクション 6.6.2 を参照してください。
pktool(1), cryptoadm(1M), libpkcs11(3LIB), attributes(5)
TCG ソフトウェアスタック (TSS) 仕様 https://www.trustedcomputinggroup.org/specs/TSS (公開時点のアドレス)