使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何与其他用户共享密钥以仅允许 CloudHSM 中的某些加密功能?

4 分钟阅读
0

我想允许一个用户包装一个密钥,并允许另一个用户仅解包同一个密钥。

简短描述

您可以共享用户对 AWS CloudHSM 集群中的 HSM 中存储的密钥的访问权限。当您与加密用户共享密钥时,该用户可以在加密功能中使用该密钥。该用户不能删除、导出、共享或取消共享密钥。此外,该用户不能更改密钥属性

要与加密用户共享密钥,但限制该用户使用特定加密功能,请导出密钥然后将其重新导入两次。导入的密钥属性会随着包装或解包的权限而改变。然后,与不同的用户共享该密钥以执行包装或解包功能。

解决方法

列出集群中的所有用户

要列出集群中的所有用户,请使用 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 将 wrap 属性设置为 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_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 的 wrap 属性为 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 的 wrap 属性为 true

与加密用户共享密钥

使用 key share 命令与 crypto_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"
  }

相关信息

Reference for CloudHSM CLI commands

Activate the cluster

AWS 官方
AWS 官方已更新 2 个月前