CloudHSM で特定の暗号機能のみを許可するために、他のユーザーとキーを共有するにはどうすればよいですか?

最終更新日: 2021 年 10 月 7 日

あるユーザーがキーをラップできるようにし、別のユーザーがその同じキーだけをラップ解除できるようにするにはどうすればよいですか?

簡単な説明

AWS CloudHSM クラスターの HSM に保存されているキーに対するユーザーのアクセス権を共有することはできますが、そうすることで、ユーザーはラップ、ラップ解除、暗号化、および復号化などすべてに許可にアクセスできるようになります。

解決方法

キーをエクスポートして、2 度インポートし直します。インポートしたキー属性は、ラップまたはラップ解除を実行する許可に応じて変化します。その後、ラップまたはラップ解除関数を実行するために、キーが異なるユーザーと共有されます。

cloudhsm_mgmt_util コマンドラインツールを使用して、クラスター内のすべてのユーザーを一覧表示する

cloudhsm_mgmt_util ツールの使用を開始する前に、Getting started with CloudHSM Management Utility (CMU) を参照してください。

以下のような listUsers コマンドを実行します。

Number of users found:8

    User Id             User Type       User Name                          MofnPubKey    LoginFailureCnt         2FA
         1              CO              admin                                    NO               0               NO
         2              AU              app_user                                 NO               0               NO
         3              CO              officer1                                 NO               0               NO
         4              CO              crypto_user1                             NO               0               NO
         5              CO              crypto_user2                             NO               0               NO
         6              CU              crypto_user3                             NO               0               NO
         7              CU              crypto_user4                             NO               0               NO
         8              CU              crypto_user5                             NO               0               NO

crypto_user1 と crypto_user2 は crypto officer であるため、キーを所有できません。この例は、crypto_user3、crypto_user4、crypto_user5 の crypto user を使用します。

key_mgmt_util コマンドラインツールで genSymKey コマンドを使用して、HSM で AES 対称キーを作成する

crypto_user3 を使用して HSM にログインしてから、key_mgmt_util ツールを使用して暗号化と復号を行うための対称キーを作成します。genSymKey コマンドを使用して、以下のような、ラベル rootKey が付けられた AES 256 ビットキーを作成します。

Command:  genSymKey -t 31 -s 32 -l rootKey

        Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS

        Symmetric Key Created.  Key Handle: 786512

        Cluster Error Status
        Node id 3 and err state 0x00000000 : HSM Return: SUCCESS
        Node id 4 and err state 0x00000000 : HSM Return: SUCCESS

この例は、キーハンドル 786512 を使用します。

genSymKey コマンドを使用してセッションキーを作成し、キーをディスクにラップしてから HSM にラップ解除し直す

-sess パラメータを使用して、セッションキーを作成します。セッションウィンドウが開いたままで、接続が確立され、crypto_user3 がログインしたままであることを確認します。genSymKey コマンド (ラベル sessionKey を持つ) を使用して、後でこのキーを識別します。

Command:  genSymKey -t 31 -s 32 -sess -l sessionKey

        Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS

        Symmetric Key Created.  Key Handle: 786511

        Cluster Error Status
        Node id 3 and err state 0x00000000 : HSM Return: SUCCESS
        Node id 4 and err state 0x00000000 : HSM Return: SUCCESS

この例では、セッションキー 786511 はオペレーション wrapKeyunWrapKey を実行します。

注意: セッションキーはセッション終了後に削除されます。

wrapKey コマンドを使用して、キーをディスクに書き込み、キーを秘密にする

対称キー 786512 をローカルドライブのファイルにエクスポートします。対称キー 786512 はセッションキー 786511 で暗号化します。この暗号化は、対称キー 786512 が HSM 外にプレーンテキストで保存されることが一切ないことを確実にします。rootKey をローカルドライブにラップしたら、unWrapKey コマンドを使用して rootKey 786512 を HSM にインポートし直します。異なるキーハンドルを使用して、HSM 内に rootKey のコピーを作成します。その後、rootKey コピーの属性を変更して、キーの使用方法を制限します。

この例では、sessionKey 786511 が rootKey 786512 をラップし、それを root.key ファイルとしてローカルドライブに保存します。

Command:  wrapKey -k 786512 -w 786511 -out root.key

        Key Wrapped.

        Wrapped Key written to file "root.key length 312
        
        Cfm2WrapKey returned: 0x00 : HSM Return: SUCCESS

注: ls コマンドを使用して、ローカルディレクトリ内のラップされたキーを表示できます。

unWrapKey コマンドを使用して、新しいハンドルでキーを HSM にインポートし直す

unWrapKey コマンドを使用して、キー master.key を HSM にインポートし直します。この例は、新しいキーハンドルの 786523 と 786524 を作成します。

重要: このステップは 2 回実行してください。

Command:  unWrapKey -f root.key -w 786511

        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS

        Key Unwrapped.  Key Handle: 786523

        Cluster Error Status
        Node id 3 and err state 0x00000000 : HSM Return: SUCCESS
        Node id 4 and err state 0x00000000 : HSM Return: SUCCESS

Command:  unWrapKey -f root.key -w 786511

        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS

        Key Unwrapped.  Key Handle: 786524

        Cluster Error Status
        Node id 3 and err state 0x00000000 : HSM Return: SUCCESS
        Node id 4 and err state 0x00000000 : HSM Return: SUCCESS

キーハンドルを確認し、属性を割り当てる

cloudhsm_mgmt_util コマンドを使用して、crypto_user3 が所有するすべてのキーハンドルをチェックします。この例では、rootKey 786512、インポートされたキーハンドル 786523、およびインポートされたキーハンドル 786524 に注目してください。crypto_user3 にユーザー ID 60 を入力して、すべてのキーのハッシュを計算しないことを示します。これを実行することにより、HSM で使用するキーハンドルを確認できます。findAllKeys コマンドによって表示されたキーハンドルは暗号学的に同一で、rootKey 786512 と同じ属性があります。

注意: セッションキーハンドル 786511 はセッションの存続期間中しか維持されないため、表示されていません。

aws-cloudhsm>findAllKeys 6 0
Keys on server 0(172.31.3.131):
Number of keys found 3
number of keys matched from start index 0::3
786512,786523,786524
findAllKeys success on server 0(172.31.3.131)
Keys on server 1(172.31.4.209):
Number of keys found 3
number of keys matched from start index 0::3
786512,786523,786524
findAllKeys success on server 1(172.31.4.209)

この例は、キー 786524 をラップするために片方のキーハンドルを割り当て、キー 786523 をラップ解除するためにもう片方のキーハンドルを割り当てます。

コマンド setAttribute を用いた cloudhsm_mgmt_util を使用して、キーのラップ/ラップ解除属性を設定する

setAttribute コマンドには、キーハンドルと属性 ID が必要です。属性 ID はキー属性に相関する整数を表します。listAttibutes コマンドを使用して、これらを一覧表示します。キー 786523 を用いた aws-cloudhsm>setAttribute コマンドを使用して、OBJ_ATTR_WRAP 属性値を 2620 に設定します。

aws-cloudhsm>setAttribute 786523 262 0
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. Cav server does NOT synchronize these changes with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************

Do you want to continue(y/n)?y
setAttribute success on server 0(172.31.3.131)
setAttribute success on server 1(172.31.4.209)

その後、キー 786524 を用いた setAttribute コマンドを使用して、OBJ_ATTR_UNWRAP 属性値を 2630 に設定します。OBJ_ATTR_WRAP 属性は 262 です。

aws-cloudhsm>setAttribute 786524 263 0
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. Cav server does NOT synchronize these changes with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************

Do you want to continue(y/n)?y
setAttribute success on server 0(172.31.3.131)
setAttribute success on server 1(172.31.4.209)

これで、ラップとラップ解除の両方を実行できる rootKey 786512、ラップのみを実行できるキー 786524、およびラップ解除のみを実行できるキー 786523 が設定されました。

この例では、crypto_user3 がキー 786512、786523、786524 を所有し、キーは共有されません。

キーのラップをテストして、すべての属性が正しく設定されていることを確認する

key_mgmt_util コマンドラインツールで wrapKey コマンドを実行します。

ラップ解除用に割り当てたキーハンドル 786523 を使用して、rootKey 786512 をローカルドライブにラップします。

次に、ラップ用に割り当てたキーハンドル 786524 を使用して、rootKey 786512 をローカルドライブにラップします。

Command:  wrapKey -k 786512 -w 786523 -out wrapped.key

        Cfm2WrapKey returned: 0xb3

        HSM Error: This operation violates the current configured/FIPS policies

Command:  wrapKey -k 786512 -w 786524 -out wrapped.key

        Key Wrapped.

        Wrapped Key written to file "wrapped.key.test length 309

        Cfm2WrapKey returned: 0x00 : HSM Return: SUCCESS

この例では、HSM エラーに記載されているように、ラップキー 786523 に対してコマンドが失敗します。HSM エラーが発生したのは、OBJ_ATTR_WRAP をラップする属性が 0 に設定されているからです。

getAttribute コマンドを実行して、キー属性値が false に設定されていることを確認する

getAttribute コマンドは、key_mgmt_util ツールと cloudhsm_mgmt_util ツールを使用します。構文は両方のコマンドラインツールで異なりますが、それぞれが属性の結果を示します。この例は、cloudhsm_mgmt_util を使用します。このツールは、ファイルに保存する属性を必要としないためです。

aws-cloudhsm>getAttribute 786523 262
Attribute Value on server 0(172.31.3.131):
OBJ_ATTR_WRAP
0x00000000

Attribute Value on server 1(172.31.4.209):
OBJ_ATTR_WRAP
0x00000000

他のユーザーとキーを共有する

cloudhsm_mgm_util コマンドを使用して、crypto_user4 (ユーザー ID 7 を持つ) と crypto_user5 (ユーザー ID 8 を持つ) とキーを共有します。ラップ解除キー 786523 を crypto_user4 に、ラップキー 786524 を crypto_user5 と共有します。これで、ユーザー crypto_user4 と crypto_user5 は、暗号化機能にキーを使用できるようになりますが、キーの属性を削除、エクスポート、共有、共有解除、変更することはできません。これは、ユーザーの crypto_user4 と crypto_user5 によるキーの使用が、キー属性の割り当て時に crypto_user3 によって指定されたオペレーションに限定されることを確実にします。

aws-cloudhsm>shareKey 786523 7 1
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. Cav server does NOT synchronize these changes with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************

Do you want to continue(y/n)?y
shareKey success on server 0(172.31.3.131)
shareKey success on server 1(172.31.4.209)


aws-cloudhsm>shareKey 786524 8 1
*************************CAUTION********************************
This is a CRITICAL operation, should be done on all nodes in the
cluster. Cav server does NOT synchronize these changes with the
nodes on which this operation is not executed or failed, please
ensure this operation is executed on all nodes in the cluster.
****************************************************************

Do you want to continue(y/n)?y
shareKey success on server 0(172.31.3.131)
shareKey success on server 1(172.31.4.209)

ディスクと HSM の間で wrapKey コマンドを使用して、ラップとラップ解除の機能をテストする

crypto_user4 (ユーザーID 7) が crypto_user3 でラップされたキーをラップ解除できることをテストします。

キー crypto_user3 と crypto_user_4 は暗号学的に同一で、ラップとラップ解除の関数を個別に実行するために使用します。

Command:  unWrapKey -f wrapped.key -w 786523

        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS

        Key Unwrapped.  Key Handle: 1048669

        Cluster Error Status
        Node id 3 and err state 0x00000000 : HSM Return: SUCCESS
        Node id 4 and err state 0x00000000 : HSM Return: SUCCESS

この記事はお役に立ちましたか?


さらにサポートが必要な場合