pkcs11_tpm - トラステッドプラットフォームモジュール (TPM) 用 OASIS PKCS#11 トークン
/usr/lib/security/pkcs11_tpm.so
/usr/lib/security/64/pkcs11_tpm.so
pkcs11_tpm.so オブジェクトは、Trusted Computing Group のプロトコルを使用して TPM セキュリティーデバイスと通信することによって、OASIS PKCS#11 暗号化トークンインタフェース (Cryptoki) v2.40 仕様を実装します。このプロバイダは 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
次の OASIS PKCS#11 v2.40 メカニズムがサポートされています。
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 パッケージがインストールされ、svc:/application/security/tcsd サービスが有効になっている場合のみです。また、システム管理者は tpmadm(8) を使用して TPM の所有権を取得し、それを暗号化フレームワーク PKCS#11 プロバイダとして有効にする必要があります。
# pkg install pkcs11_tpm # svcadm enable svc:/application/security/tcsd # tpmadm init Enter TPM Owner PIN: Confirm TPM Owner PIN: # cryptoadm install provider='/usr/lib/security/$ISA/pkcs11_tpm.so'
これらの前提条件が満たされている場合、ユーザーは 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
The usertype=so option indicates that this “setpin” operation is to change the SO PIN and must be present.ユーザーはデフォルトの 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 環境変数を設定することにより、この設定をオーバーライドできます。
実装されている各関数の戻り値は、OASIS PKCS#11 v2.40 仕様で定義および一覧表示されています。See https://www.oasis-open.org/committees/pkcs11/.
ユーザーのデフォルトのトークンオブジェクトストア。
代替のトークンオブジェクトストア。
属性についての詳細は、マニュアルページの attributes(7) を参照してください。
|
pktool(1), libpkcs11(3LIB), attributes(7), cryptoadm(8)
https://trustedcomputinggroup.org/work-groups/software-stack/