

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

# 设置客户管理的密钥政策
<a name="registry-kms-key-policy"></a>

要在 Amazon 代理注册表中使用客户管理的密钥，您必须为调用主体配置 IAM 策略和允许该服务执行加密和解密操作的 KMS 密钥策略。

## 先决条件
<a name="registry-encryption-prereqs"></a>

在使用客户管理的密钥创建注册表之前，请确保满足以下条件：
+ 您在注册表所在的同一 Amazon 区域拥有对称加密 KMS 密钥。有关创建 KMS 密钥的信息，请参阅密* Amazon 钥管理服务开发人员指南[中的](https://docs.amazonaws.cn/kms/latest/developerguide/create-keys.html)创建密钥*。
+ 调用的 IAM 委托人`CreateRegistry`具有所需的 KMS 权限。请参阅[所需的 IAM 权限](#registry-encryption-iam-policy)。

## 所需的 IAM 权限
<a name="registry-encryption-iam-policy"></a>

要与加密注册表进行交互，您必须对 KMS 密钥具有以下权限：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowRegistryCMKAccess",
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com"
        }
      }
    }
  ]
}
```

替换以下值：
+  `Resource`— 您的 KMS 密钥的 ARN。
+  `kms:ViaService`— {{us-east-1}} 替换为注册表的 Amazon 区域。

该`kms:ViaService`条件限制了通过 Amazon 代理注册服务提出的请求的权限，从而防止这些权限在 Amazon 代理注册表之外使用。

**注意**  
您必须通过您的 IAM 策略或密钥策略获得授权才能执行这些 KMS 操作（请参阅[客户托管密钥的密钥策略](#registry-encryption-key-policy)）。如果您的密钥策略包含启用 IAM 策略的[默认密钥策略声明，](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-default.html#key-policy-default-allow-root-enable-iam)那么 IAM 策略就足够了。

## 客户托管密钥的密钥策略
<a name="registry-encryption-key-policy"></a>

以下部分列出了 Amazon 代理注册表所需的 KMS 密钥策略声明。将这些语句添加到您的 KMS [ 密钥策略中，](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html)以便服务和调用委托人可以使用该密钥。如果您的密钥策略不包含启用 IAM 策略的[默认密钥策略声明](https://docs.amazonaws.cn/kms/latest/developerguide/key-policy-default.html#key-policy-default-allow-root-enable-iam)，或者密钥位于其他账户中，则需要添加语句。

**重要**  
以下部分中的 JSON 块是单个政策声明的**示例**，而不是完整的关键策略。请勿使用它们来替换您现有的 KMS 密钥策略。取而代之的是，根据组织中的角色和服务相关角色复制所需的声明，并将其附加到现有密钥政策`Statement`阵列中。在保存策略之前，更新每份声明（账户 ID、区域、角色 ARN 和注册表 ARN）中的值以匹配您的环境。

密钥政策应根据组织[中的](registry-concepts.md#registry-concept-personas)注册表角色授予权限：
+  **管理员 **-创建注册表并管理加密配置。需求`kms:DescribeKey``kms:CreateGrant`、和 encrypt/decrypt 权限。
+  **发布者或批准者 **-创建和更新注册表记录（写入和读取记录描述符）。需要加密和解密权限。
+  **消费者 **-读取注册表记录和搜索结果（读取记录描述符）。需要解密权限。

除了角色陈述外，还要添加，[服务相关角色的政策声明](#registry-encryption-key-policy-slr)这样 Amazon Agent Registry 可以在运行时代表您使用密钥。如果您使用 Amazon 资源访问管理器 (Amazon RAM) 与 Amazon 组织中的其他账户共享注册表，还要添加[通过以下方式访问组织权限的政策声明 Amazon RAM](#registry-encryption-key-policy-ram).

**注意**  
如果您的角色同时写入和读取记录描述符（例如，同时检索记录的发布者），请授予加密和解密权限，如所示。[出版商政策声明](#registry-encryption-key-policy-publisher)

### 管理员政策声明
<a name="registry-encryption-key-policy-admin"></a>

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
      {
      "Sid": "AllowRegistryAdminKeyValidation",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RegistryAdminRole"
      },
      "Action": [
        "kms:DescribeKey"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com"
        }
      }
    },
    {
      "Sid": "AllowRegistryAdminGrantCreation",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RegistryAdminRole"
      },
      "Action": [
        "kms:CreateGrant"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com"
        },
        "Bool": {
          "kms:GrantIsForAWSResource": "true"
        }
      }
    },
    {
      "Sid": "AllowRegistryAdminCryptoOps",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RegistryAdminRole"
      },
      "Action": [
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com",
          "kms:EncryptionContext:aws:agent-registry:registry-arn": "arn:aws:agent-registry:us-east-1:111122223333:registry/my-registry-id"
        }
      }
    }
  ]
}
```
+  **AllowRegistryAdminKeyValidation**— 允许管理员在将密钥与注册表一起使用之前对其进行验证。
+  **AllowRegistryAdminGrantCreation**— 允许管理员在创建注册表时创建授权。该`kms:GrantIsForAWSResource`条件确保`kms:CreateGrant`只有在 Amazon 服务代表呼叫者启动授权创建时才能使用该条件。
+  **AllowRegistryAdminCryptoOps**— 允许管理员加密和解密记录描述符，通过加密上下文将范围限定为特定注册表。

### 出版商政策声明
<a name="registry-encryption-key-policy-publisher"></a>

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowRegistryPublisherCryptoOps",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RegistryPublisherRole"
      },
      "Action": [
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com",
          "kms:EncryptionContext:aws:agent-registry:registry-arn": "arn:aws:agent-registry:us-east-1:111122223333:registry/my-registry-id"
        }
      }
    }
  ]
}
```
+  **AllowRegistryPublisherCryptoOps**— 允许发布者和批准者加密和解密记录描述符。`CreateRegistryRecord`和为必填项`UpdateRegistryRecord`。

### 消费者政策声明
<a name="registry-encryption-key-policy-consumer"></a>

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowRegistryConsumerDecrypt",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/RegistryConsumerRole"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "agent-registry.us-east-1.amazonaws.com",
          "kms:EncryptionContext:aws:agent-registry:registry-arn": "arn:aws:agent-registry:us-east-1:111122223333:registry/my-registry-id"
        }
      }
    }
  ]
}
```
+  **AllowRegistryConsumerDecrypt**— 允许消费者解密记录描述符。`GetRegistryRecord`和为必填项`SearchDiscoverableRegistryRecords`。

### 服务相关角色的政策声明
<a name="registry-encryption-key-policy-slr"></a>

授予 Amazon 代理注册表的服务相关角色在运行时使用密钥的权限。该服务使用此角色代表您加密和解密记录描述符。

添加此语句需要两个有序的步骤：

1.  **首先在您的账户中创建服务相关角色。** Amazon 代理注册表不会为您创建角色——在添加 KMS 密钥策略声明之前，您必须自己创建该角色。使用 C Amazon LI：

   ```
   aws iam create-service-linked-role --aws-service-name agent-registry.amazonaws.com
   ```

   这将创建的`AWSServiceRoleForAgentRegistry`角色位于`arn:aws:iam::<account-id>:role/aws-service-role/agent-registry.amazonaws.com/AWSServiceRoleForAgentRegistry`。只需对每个账户进行一次该操作。

1.  **然后将以下语句添加到您的 KMS 密钥策略中。**IAM 拒绝任何引用尚不存在的委托人的密钥策略，因此在粘贴命名该角色的语句之前，必须先存在该角色。

使用加密上下文通配符将声明范围限定到您账户中的注册表。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRegistrySlrCryptoOps",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/aws-service-role/agent-registry.amazonaws.com/AWSServiceRoleForAgentRegistry"
      },
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:Encrypt",
        "kms:ReEncryptFrom",
        "kms:ReEncryptTo"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:agent-registry:registry-arn": "arn:aws:agent-registry:us-east-1:111122223333:registry/*"
        }
      }
    }
  ]
}
```
+  **AllowRegistrySlrCryptoOps**— 允许 Amazon Agent Registry 的服务相关角色 (`AWSServiceRoleForAgentRegistry`) 代表您加密和解密记录描述符，根据条件将范围限定在您账户中的注册表。`kms:EncryptionContext:aws:agent-registry:registry-arn`

### 通过以下方式访问组织权限的政策声明 Amazon RAM
<a name="registry-encryption-key-policy-ram"></a>

如果您使用 Amazon 资源访问管理器 (RAM) 与 Amazon 组织中的其他账户共享客户管理的密钥加密注册表，请添加此声明。Amazon 它允许组织中的任何负责人从与他们共享的注册表中解密记录描述符。如果您不通过 Amazon RAM 共享注册表，则不需要此语句。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowOrganizationDecrypt",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "kms:Decrypt",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "o-EXAMPLE1234"
        }
      }
    }
  ]
}
```
+  **AllowOrganizationDecrypt**— 允许 Amazon 组织中的任何负责人解密通过 RAM 共享的注册表中的记录描述符。 Amazon 该`aws:PrincipalOrgID`条件将此权限严格限定为指定组织的成员账户；如果没有匹配的组织 ID，则不`"Principal": "*"`授予任何权限。调用者仍然需要共享注册表本身的相应服务级别 IAM 权限。

### 替换关键政策声明中的值
<a name="registry-encryption-key-policy-replace-values"></a>

替换每个关键政策声明中的以下值：
+  `Principal`— 每个角色的 IAM 用户或角色的 ARN。{{111122223333}}替换为您的账户 ID，将角色名称替换为您的实际 IAM 角色。对于与服务相关的角色声明，请替换{{111122223333}}为您的账户 ID；保持角色路径和名称 (`aws-service-role/agent-registry.amazonaws.com/AWSServiceRoleForAgentRegistry`) 如图所示，这是一个固定的服务管理值。
+  `kms:ViaService`— {{us-east-1}} 替换为注册表的 Amazon 区域。
+  `kms:EncryptionContext:aws:agent-registry:registry-arn`— 替换为注册表的 ARN。要允许访问您账户中的所有注册表，请使用`StringLike`通配符：。`arn:aws:agent-registry:us-east-1:111122223333:registry/*`
+  `aws:PrincipalOrgID`— 在 Amazon RAM 共享声明中，`o-EXAMPLE1234`替换为您的 Amazon 组织 ID。你可以在 Amazon 组织控制台中找到它，也可以运行`aws organizations describe-organization --query 'Organization.Id' --output text`。