CloudHSM で特定の暗号機能のみを許可するために、他のユーザーとキーを共有するにはどうすればよいですか?
あるユーザーがキーをラップできるようにし、別のユーザーがその同じキーだけをラップ解除できるようにしたいと考えています。
簡単な説明
AWS CloudHSM クラスターの HSM に保存されているキーへのユーザーアクセスを共有することはできます。暗号ユーザーとキーを共有すると、そのユーザーは暗号機能でそのキーを使用できるようになります。そのユーザーは、キーを削除、エクスポート、共有、または共有解除することはできません。また、そのユーザーはキーの属性を変更することはできません。
ある暗号ユーザーとキーを共有し、そのユーザーを特定の暗号機能に制限するには、キーをエクスポートしてから再インポートを 2 回繰り返します。インポートされたキー属性は、ラップまたはラップ解除の権限によって変わります。次に、キーをさまざまなユーザーと共有して、ラップまたはラップ解除機能を実行します。
解決策
クラスター内のすべてのユーザーを一覧表示する
クラスター内のすべてのユーザーを一覧表示するには、CloudHSM コマンドラインインターフェイス (CLI)を使用します。インタラクティブコマンドモードを使用していることを確認します。
$ /opt/cloudhsm/bin/cloudhsm-cli interactive
暗号ユーザーでログインします。次のコマンド例は、crypto_user1という暗号ユーザーとしてログインする方法を示しています。
aws-cloudhsm > login --username crypto_user1 --role crypto-user
CloudHSM クラスター内のすべてのユーザーを一覧表示するには、次のコマンドを実行します。
aws-cloudhsm > user list Output: { "error_code": 0, "data": { "users": [{ "username": "crypto_user1", "role": "crypto-user", "locked": "false", "mfa": [], "quorum": [], "cluster-coverage": "full" }, { "username": "crypto_user2", "role": "crypto-user", "locked": "false", "mfa": [], "quorum": [], "cluster-coverage": "full" } ] } }
AES 対称キーを作成する
CloudHSM CLI を使用して、暗号化と復号化を行うための対称キーを作成します。ラベル rootKeyで AES 256 ビットキーを作成するには、次のコマンドを実行します。ラップおよびラップ解除する属性をコマンドに含めます。
aws-cloudhsm > key generate-symmetric aes --label rootKey --key-length-bytes 32 --attributes wrap=true unwrap=true Output: { "error_code": 0, "data": { "key": { "key-reference": "0x00000000000000123", "key-info": { "key-owners": [ { "username": "crypto_user1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "aes", "label": "rootKey", "id": "0x", "check-value": "0xabcdefg", "class": "secret-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": true, "verify": true, "wrap": true, "wrap-with-trusted": false, "key-length-bytes": 32 } } } }
出力は、ラップ、ラップ解除、共有が可能なキーです。
セッションキーを作成する
ラベル sessionKey で AES 256 ビットセッションキーを作成するには、次のコマンドを実行します。--session を指定する必要があります。--attributes wrap=trueを使用してラップ属性を true に設定します。
aws-cloudhsm > key generate-symmetric aes --label sessionKey --key-length-bytes 32 --session --attributes wrap=true unwrap=true
**注:**セッションキーは、セッション終了後に削除されます。
キーをディスクに書き込み、キーを秘密にする
key wrap コマンドを使用して、対称キー rootKey をローカルドライブ上のファイルにラップします。rootKey はセッションキー sessionKey で暗号化されます。この暗号化により、この暗号化により、対称キー rootKey が HSM 外にプレーンテキストで保存されないようにします。rootKey をローカルドライブにラップしたら、key unwrap コマンドを使用して rootKey を HSM にインポートし直します。HSM 内にrootKey のコピーを作成します。その後、rootKey コピーの属性を変更して、キーの使用方法を制限します。
次の例では、sessionKey が rootKey をラップし、それを root.key ファイルとしてローカルドライブに保存します。
aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=sessionKey --tag-length-bits 64 --aad 0x10 --path root.key Output: { "error_code": 0, "data": { "payload-key-reference": "0x0000000000120000", "wrapping-key-reference": "0x0000000000220000", "iv": "0xabcdefghijklmno123456789", "wrapped-key-data": "abcdefghi123456789123456789123456789123456789123456789==" } }
**重要:**出力から返される iv 値を書き留めておきます。この値は後で使用します。
ローカルディレクトリ内のラップされたキーを表示するには、ls コマンドを使用します。
新しいラベルを使用して、キーを HSM にインポートし直す
root.key キーを HSM にインポートし直すには、key unwrap コマンドを使用します。sessionKey は、暗号化された root.key ファイルを復号化して HSM に返します。次の例では、shared_rootKey1 と shared_rootKey2という新しいキーを定義しています。key wrap コマンドの出力から iv を定義する必要があります。
aws-cloudhsm > key unwrap aes-gcm --key-type-class aes --label shared_rootKey1 --filter attr.label=sessionKey --tag-length-bits 64 --aad 0x10 --iv 0xabcdefghijklmno123456789 --data-path root.key --attributes wrap=true
**注:**shared_rootKey1 の属性が wrap=true であることを確認してください。
aws-cloudhsm > key unwrap aes-gcm --key-type-class aes --label shared_rootKey2 --filter attr.label=sessionKey --tag-length-bits 64 --aad 0x10 --iv 0xabcdefghijklmno123456789 --data-path root.key --attributes unwrap=true
**注:**shared_rootKey2 の属性が unwrap=true であることを確認してください。
キーラベルを確認して、属性を割り当てる
crypto_user1 が所有するすべてのキーラベルを確認するには、次のコマンドを実行します。キーラベルごとに、次のフィルターを指定します。
- shared\ _rootKey1 には wrap=true, unwrap=false という属性があります。
- shared\ _rootKey2 には wrap=false, unwrap=true という属性があります。
aws-cloudhsm > key list --verbose --filter attr.label=shared_rootKey1 aws-cloudhsm > key list --verbose --filter attr.label=shared_rootKey2
すべての属性が正しく設定されていることを確認する
share\ _RootKey1 がキーをラップでき、share_rootKey2 がキーのラップ解除しかできないことを確認するには、両方のキーを同じキーマテリアルのラップキーとして使用します。
share\ _RootKey2 を使用して rootKey をラップするには、次のコマンドを実行します。
aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=shared_rootKey2 --tag-length-bits 64 --aad 0x10 --path test_root.key Output: { "error_code": 1, "data": "Key can not be used for wrapping." }
share\ _rootKey2 のラップ属性が false になっているため、このコマンドは失敗します。
share\ _rootKey1 を使用してrootKey をラップするには、次のコマンドを実行します。
aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=rootKey --wrapping-filter attr.label=shared_rootKey1 --tag-length-bits 64 --aad 0x10 --path test_root.key Output: { "error_code": 0, "data": { "payload-key-reference": "0x0000000000220000", "wrapping-key-reference": "0x0000000000330000", "iv": "0x123456abcdefghijklmno123", "wrapped-key-data": "123456abcdefghi123456789123456789123456789123456789123==" } }
share\ _RootKey1 のラップ属性が true であるため、このコマンドは成功します。
暗号ユーザーとキーを共有する
key share コマンドを使用して rypto_user2 とキーを共有します。ユーザーcrypto\ _user2 は、許可された暗号化機能にキーを使用できますが、キー属性の削除、エクスポート、共有、共有解除、または変更はできません。キーを共有するには、次のコマンドを実行します。
aws-cloudhsm > key share --filter attr.label="shared_rootKey1" attr.class=secret-key --username crypto_user2 --role crypto-user Output: { "error_code": 0, "data": { "message": "Key shared successfully" } } aws-cloudhsm > key share --filter attr.label="shared_rootKey2" attr.class=secret-key --username crypto_user2 --role crypto-user Output: { "error_code": 0, "data": { "message": "Key shared successfully" } }
ディスクと HSM の間で wrapKey コマンドの機能をテストする
crypto\ _user2 としてログインし、CloudHSM CLI でキーの機能を確認します。crypto\ _user2 がshared_rootKey1 を使用してラップできること、およびユーザーが shared_rootKey2 を使用してラップ解除できることをテストします。
テストキーを生成するには、次のコマンドを実行します。
aws-cloudhsm > key generate-symmetric aes --label testKey --key-length-bytes 32 --session
次の例に示すように、** shared\ _RootKey1** を使用して testKey をラップし、test.key というファイルとして保存します。
aws-cloudhsm > key wrap aes-gcm --payload-filter attr.label=testKey --wrapping-filter attr.label=shared_rootKey1 --tag-length-bits 64 --aad 0x10 --path test.key Output: { "error_code": 0, "data": { "payload-key-reference": "0x0000000000aa0000", "wrapping-key-reference": "0x0000000000bb0000", "iv": "0x00abcd123abcdefghijklmno", "wrapped-key-data": "xyz123abcdefghi123456789123456789123456789123456789123==" } }
**重要:**出力から返される iv 値を書き留めておきます。この値は後で使用します。
次のコマンドに示すように、shared_rootKey2 を使用して testKey をラップ解除します。
aws-cloudhsm >key unwrap aes-gcm --key-type-class aes --label imported_testKey --filter attr.label=shared_rootKey2 --tag-length-bits 64 --aad 0x10 --iv 0x00abcd123abcdefghijklmno --data-path test.key
crypto\ _user2 がキーの属性を変更できないことを確認するには、次のコマンドを実行します。
aws-cloudhsm > key set-attribute --filter attr.label=shared_rootKey1 --name unwrap --value true { "error_code": 1, "data": "The current user does not have adequate key permissions to perform the key operation" }
関連情報

関連するコンテンツ
- AWS公式更新しました 1年前
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 1年前