

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理
<a name="quorum-auth-chsm-cli-admin"></a>

硬件安全模块 (HSM) 的 AWS CloudHSM [管理员](understanding-users.md#admin)可以为集群中的以下操作配置法定身份验证： AWS CloudHSM 
+ **[使用 CloudHSM CLI 创建 AWS CloudHSM 用户](cloudhsm_cli-user-create.md)**
+ **[使用 CloudHSM CLI 删除 AWS CloudHSM 用户](cloudhsm_cli-user-delete.md)**
+ **[使用 CloudHSM CLI 更改用户的密码](cloudhsm_cli-user-change-password.md)**
+ **[CloudHSM CLI 中的 user change-mfa 类别](cloudhsm_cli-user-change-mfa.md)**

 AWS CloudHSM 集群配置为法定身份验证后，管理员无法自行执行 HSM 用户管理操作。以下示例显示管理员尝试在 HSM 上创建新用户时的输出。该命令因出错而失败，指出需要进行仲裁身份验证。

```
aws-cloudhsm > user create --username user1 --role crypto-user
Enter password:
Confirm password:
{
  "error_code": 1,
  "data": "Quorum approval is required for this operation"
}
```

要执行 HSM 用户管理操作，管理员必须完成以下任务：

**Topics**
+ [步骤 1：获取仲裁令牌](#quorum-admin-gen-token-chsm-cli)
+ [步骤 2：获得批准管理员的签名](#quorum-admin-get-approval-signatures-chsm-cli)
+ [步骤 3：在 AWS CloudHSM 集群上批准令牌并执行用户管理操作](#quorum-admin-approve-token-chsm-cli)

## 步骤 1：获取仲裁令牌
<a name="quorum-admin-gen-token-chsm-cli"></a>

首先，管理员必须使用 CloudHSM CLI 申请*仲裁令牌*。

**获取仲裁令牌**

1. 使用以下命令启动 CloudHSM CLI。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 使用 CloudHSM CLI，以管理员身份登录。

   ```
   aws-cloudhsm > login --username {{<admin>}} --role admin
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "{{<admin>}}",
       "role": "admin"
     }
   }
   ```

1. 使用 **quorum token-sign generate** 命令获取仲裁令牌。有关更多信息，请参阅以下示例或使用 **help quorum token-sign generate** 命令。

**Example – 生成仲裁令牌**  
此示例将为用户名为 `admin` 的管理员获取一个仲裁令牌，并将该令牌保存到一个名为 `admin.token` 的文件中。要使用示例命令，可将这些值替换为您自己的值：  
+ {{<admin>}}— 获取令牌的管理员的姓名。这必须是已登录 HSM 并且正在运行此命令的管理员。
+ {{<admin.token>}}— 用于存储法定令牌的文件的名称。
在以下命令中，`user` 标识您可为之使用所生成之令牌的*服务名称*。在此示例中，令牌用于 HSM 用户管理操作 (`user` 服务)。  

```
aws-cloudhsm > login --username {{<admin>}} --role admin --password {{<password>}}
{
  "error_code": 0,
  "data": {
    "username": "{{<admin>}}",
    "role": "admin"
  }
}
```

```
aws-cloudhsm > quorum token-sign generate --service user --token {{</path/admin.token>}}
{
  "error_code": 0,
  "data": {
    "path": "/home/tfile"
  }
}
```
该 **quorum token-sign generate** 命令在指定的文件路径上生成用户服务仲裁令牌。可查看以下令牌文件：  

```
$ cat {{</path/admin.token>}}
{
  "version": "2.0",
  "service": "user-management",
  "approval_data": "AAEAAwAAABgAAAAAAAAAAJ9eFkfcP3mNzJAlfK+OWbNhZG1pbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj5vbeAAAAAAAAAAAAAQADAAAAFQAAAAAAAAAAW/v5Euk83amq1fij0zyvD2FkbWluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPm9t4AAAAAAAAAAAABAAMAAAAUAAAAAAAAAABDw2XDwfK4hB8a15Xh1E0nYWRtaW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY+b23gAAAAAAAAAA",
  "token": "0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=",
  "signatures": []
}
```
令牌路径包含以下内容：  
+ **service**：与令牌关联的仲裁服务的标识符。
+ **approval\_data**：由 HSM 生成的 base64 编码原始数据令牌。
+ **令牌**：approval\_data 的 base64 编码和 SHA-256 哈希令牌
+ **签名**：base64 编码签名令牌阵列，其中每个批准者签名均采用 JSON 对象常量形式：

  ```
  {
        "username": "{{<APPROVER_USERNAME>}}",
        "role": "{{<APPROVER_ROLE>}}",
        "signature": "{{<APPROVER_RSA2048_BIT_SIGNATURE>}}"
  }
  ```

  每个签名均由批准者使用相应的 RSA 2048 位私有密钥创建，其公有密钥通过 HSM 注册。
通过运行 **quorum token-sign list** 命令，确认 CloudHSM 集群中包含已生成用户服务仲裁令牌。  

```
aws-cloudhsm > quorum token-sign list
{
  "error_code": 0,
  "data": {
    "tokens": [
      {
        "username": "admin",
        "service": "user",
        "approvals-required": {
          "value": 2
        },
        "number-of-approvals": {
          "value": 0
        },
        "token-timeout-seconds": {
          "value": 597
        },
        "cluster-coverage": "full"
      }
    ]
  }
}
```
`token-timeout-seconds` 时间表示生成的令牌在过期之前获批的超时时间（以秒为单位）。

## 步骤 2：获得批准管理员的签名
<a name="quorum-admin-get-approval-signatures-chsm-cli"></a>

具有仲裁令牌的管理员必须获得其他管理员批准的令牌。为了提供其批准，其他管理员使用其签名密钥以加密方式对令牌进行签名。他们在 HSM 外部执行此操作。

可通过多种不同方式对令牌进行签名。以下示例说明如何使用 [OpenSSL](https://www.openssl.org/) 执行该操作。要使用其他签名工具，请确保该工具使用管理员的私有密钥 (签名密钥) 对令牌的 SHA-256 摘要进行签名。

**Example - 获得批准管理员的签名**  
在此示例中，具有令牌 (`admin`) 的管理员至少需要两 (2) 次批准。以下示例命令说明两 (2) 个管理员如何使用 OpenSSL 以加密方式对令牌进行签名。  

1. 解码 base64 编码的未签名令牌，并将其放入二进制文件：

   ```
   $ echo -n '0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=' | base64 -d > admin.bin
   ```

1. 使用 OpenSSL 和相应的批准者 `(admin3)` 私钥为当前未签名的二进制仲裁令牌签名，以获取用户服务和创建二进制签名文件：

   ```
   $ openssl pkeyutl -sign \
   -inkey admin3.key \
   -pkeyopt digest:sha256 \
   -keyform PEM \
   -in admin.bin \
   -out admin.sig.bin
   ```

1. 将二进制签名编码为 base64：

   ```
   $ base64 -w0 admin.sig.bin > admin.sig.b64
   ```

1. 最后，按此前批准者签名指定的 JSON 对象常量形式，将 base64 编码签名复制并粘贴至令牌文件。

   ```
   {
     "version": "2.0",
     "approval_data": "AAEAAwAAABgAAAAAAAAAAJ9eFkfcP3mNzJAlfK+OWbNhZG1pbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj5vbeAAAAAAAAAAAAAQADAAAAFQAAAAAAAAAAW/v5Euk83amq1fij0zyvD2FkbWluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPm9t4AAAAAAAAAAAABAAMAAAAUAAAAAAAAAABDw2XDwfK4hB8a15Xh1E0nYWRtaW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY+b23gAAAAAAAAAA",
     "token": "0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=",
     "signatures": [
       {
         "username": "admin2",
         "role": "admin",
         "signature": "O6qx7/mUaVkYYVr1PW7l8JJko+Kh3e8zBIqdk3tAiNy+1rW+OsDtvYujhEU4aOFVLcrUFmyB/CX9OQmgJLgx/pyK+ZPEH+GoJGqk9YZ7X1nOXwZRP9g7hKV+7XCtg9TuDFtHYWDpBfz2jWiu2fXfX4/jTs4f2xIfFPIDKcSP8fhxjQ63xEcCf1jzGha6rDQMu4xUWWdtDgfT7um7EJ9dXNoHqLB7cTzphaubNaEFbFPXQ1siGmYKmvETlqe/ssktwyruGFLpXs1n0tJOEglGhx2qbYTs+omKWZdORl5WIWEXW3IXw/Dg5vVObrNpvG0eZKO8nSMc27+cyPySc+ZbNw=="
       },
       {
         "username": "admin3",
         "role": "admin",
         "signature": "O6qx7/mUaVkYYVr1PW7l8JJko+Kh3e8zBIqdk3tAiNy+1rW+OsDtvYujhEU4aOFVLcrUFmyB/CX9OQmgJLgx/pyK+ZPEH+GoJGqk9YZ7X1nOXwZRP9g7hKV+7XCtg9TuDFtHYWDpBfz2jWiu2fXfX4/jTs4f2xIfFPIDKcSP8fhxjQ63xEcCf1jzGha6rDQMu4xUWWdtDgfT7um7EJ9dXNoHqLB7cTzphaubNaEFbFPXQ1siGmYKmvETlqe/ssktwyruGFLpXs1n0tJOEglGhx2qbYTs+omKWZdORl5WIWEXW3IXw/Dg5vVObrNpvG0eZKO8nSMc27+cyPySc+ZbNw=="
       }
     ]
   }
   ```

## 步骤 3：在 AWS CloudHSM 集群上批准令牌并执行用户管理操作
<a name="quorum-admin-approve-token-chsm-cli"></a>

管理员获得必要的批准/签名（如上一节所述）后，管理员可以向 AWS CloudHSM 集群提供该令牌，并执行以下用户管理操作之一：
+ **[创建](cloudhsm_cli-user-create.md)**
+ **[删除](cloudhsm_cli-user-delete.md)**
+ **[更改密码](cloudhsm_cli-user-change-password.md)**
+ **[user change-mfa](cloudhsm_cli-user-change-mfa.md)**

有关使用这些命令的更多信息，请参阅[使用 CloudHSM CLI 进行用户管理](manage-hsm-users-chsm-cli.md)。

在交易过程中，令牌将在 AWS CloudHSM 集群内获得批准并执行请求的用户管理操作。用户管理操作的成功取决于已批准的仲裁令牌和用户管理操作是否有效。

管理员只能将令牌用于一项操作。在该操作成功后，该令牌不再有效。若要执行其他 HSM 用户管理操作，管理员必须重复上述进程。那就是，管理员必须生成新的仲裁令牌、获取来自批准者的新签名，并按照所请求的用户管理操作批准和在 HSM 上使用新令牌。

**注意**  
仅当您当前登录会话打开时，仲裁令牌才有效。如果您登出 CloudHSM CLI 或者断开网络连接，则令牌将不再有效。同样，授权令牌只能用于 CloudHSM CLI 中。它无法用于在其他应用程序中进行身份验证。

**Example 以管理员身份创建新用户**  
在以下示例命令中，已登录管理员将在 HSM 上创建一个新用户：  

```
aws-cloudhsm > user create --username user1 --role crypto-user --approval /path/admin.token
Enter password:
Confirm password:
{
  "error_code": 0,
  "data": {
    "username": "user1",
    "role": "crypto-user"
  }
}
```
然后，管理员输入 **user list** 命令以确认创建新用户：  

```
aws-cloudhsm > user list
{
  "error_code": 0,
  "data": {
    "users": [
      {
        "username": "admin",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin2",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin3",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin4",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "user1",
        "role": "crypto-user",
        "locked": "false",
        "mfa": [],
        "quorum": [],
        "cluster-coverage": "full"
      },
      {
        "username": "app_user",
        "role": "internal(APPLIANCE_USER)",
        "locked": "false",
        "mfa": [],
        "quorum": [],
        "cluster-coverage": "full"
      }
    ]
  }
}
```
如果管理员尝试执行其他 HSM 用户管理操作，该操作将失败并出现仲裁身份验证错误：  

```
aws-cloudhsm > user delete --username user1 --role crypto-user
{
  "error_code": 1,
  "data": "Quorum approval is required for this operation"
}
```
如下所示，该 **quorum token-sign list** 命令显示管理员未批准令牌。若要执行其他 HSM 用户管理操作，管理员必须生成新的仲裁令牌，从批准者处获取新签名，然后使用 --approver 参数执行所需的用户管理操作，以提供待批准并在用户管理操作中使用的仲裁令牌。  

```
aws-cloudhsm > quorum token-sign list
{
  "error_code": 0,
  "data": {
    "tokens": []
  }
}
```