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

所要時間4分
0

あるユーザーがキーをラップできるようにし、別のユーザーがその同じキーだけをラップ解除できるようにしたいと考えています。

簡単な説明

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 を使用して、暗号化と復号化を行うための対称キーを作成します。ラベル rootKeyAES 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
      }
    }
  }
}		

出力は、ラップ、ラップ解除、共有が可能なキーです。

セッションキーを作成する

ラベル sessionKeyAES 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 コピーの属性を変更して、キーの使用方法を制限します。

次の例では、sessionKeyrootKey をラップし、それを 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_rootKey1shared_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\ _user2shared_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"
  }

関連情報

Reference for CloudHSM CLI commands

Activate the cluster

AWS公式
AWS公式更新しました 6ヶ月前