

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

# Amazon OpenSearch 无服务器中的加密
<a name="serverless-encryption"></a>

## 静态加密
<a name="serverless-encryption-at-rest"></a>

您创建的每个 Amazon OpenSearch Serverless 集合都受到静态数据加密的保护，这是一项有助于防止未经授权访问您的数据的安全功能。静态加密使用 AWS Key Management Service (AWS KMS) 来存储和管理您的加密密钥。它使用具有 256 位密钥（AES-256）的高级加密标准算法执行加密。

**Topics**
+ [加密策略](#serverless-encryption-policies)
+ [注意事项](#serverless-encryption-considerations)
+ [所需权限](#serverless-encryption-permissions)
+ [客户托管密钥的密钥策略](#serverless-customer-cmk-policy)
+ [OpenSearch 无服务器如何使用授权 AWS KMS](#serverless-encryption-grants)
+ [创建加密策略（控制台）](#serverless-encryption-console)
+ [创建加密策略（AWS CLI）](#serverless-encryption-cli)
+ [查看加密策略](#serverless-encryption-list)
+ [更新加密策略](#serverless-encryption-update)
+ [删除加密策略](#serverless-encryption-delete)

### 加密策略
<a name="serverless-encryption-policies"></a>

借助加密策略，您可以通过自动将加密密钥分配给与某个具体名称或模式相匹配的新建集合来大规模管理多个集合。

在创建加密策略时，您可以指定*前缀*（它是基于通配符的匹配规则，如 `MyCollection*`），也可以输入一个集合名称。然后，当您创建与该名称或前缀模式相匹配的集合时，会将该策略和相应的 KMS 密钥自动分配给该集合。

创建集合时，您可以通过两种方式指定 AWS KMS 密钥：通过安全策略或直接在`CreateCollection`请求中指定。如果您在`CreateCollection`请求中提供 AWS KMS 密钥，则该密钥优先于任何匹配的安全策略。通过这种方法，您可以在需要时灵活地为特定集合覆盖基于策略的加密设置。

![\[Encryption policy creation process with rules and collection matching to KMS key.\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/images/serverless-encryption.png)


加密策略包含以下元素：
+ `Rules`：一条或多条集合匹配规则，每条规则都包含以下子元素：
  + `ResourceType`：目前唯一选项为“collection”（集合）。加密策略仅适用于集合资源。
  + `Resource`：策略将适用于的一个或多个集合名称或模式，格式为 `collection/<collection name|pattern>`。
+ `AWSOwnedKey`：是否使用 AWS 拥有的密钥。
+ `KmsARN`：如果您将 `AWSOwnedKey` 设置为 false，请指定用于加密关联集合的 KMS 密钥的 Amazon 资源名称（ARN）。如果包含此参数，则 OpenSearch Serverless 会忽略该`AWSOwnedKey`参数。

以下示例策略会将客户托管的密钥分配给名为 `autopartsinventory` 的任何未来集合，以及以“sales”（销售）一词开头的集合：

```
{
   "Rules":[
      {
         "ResourceType":"collection",
         "Resource":[
            "collection/autopartsinventory",
            "collection/sales*"
         ]
      }
   ],
   "AWSOwnedKey":false,
   "KmsARN":"arn:aws:kms:us-east-1:123456789012:key/93fd6da4-a317-4c17-bfe9-382b5d988b36"
}
```

即使策略与集合名称相匹配，如果资源模式包含通配符 (\$1)，您也可以在集合创建期间选择覆盖此自动分配。如果您选择覆盖自动密钥分配， OpenSearch Serverless 会为您创建一个名为 a **uto-< *collection-name* >** 的加密策略并将其附加到集合中。该策略最初仅适用于一个集合，但您可以将其修改为包括其他集合。

如果您修改策略规则以不再与某个集合相匹配，则不会从该集合取消分配关联的 KMS 密钥。该集合仍将使用其初始加密密钥进行加密。如果您要更改某个集合的加密密钥，则必须重新创建该集合。

如果来自多个策略的规则与某个集合相匹配，则将使用更具体的规则。例如，如果一个策略包含 `collection/log*` 的规则，而另一个策略包含 `collection/logSpecial` 的规则，则使用第二个策略的加密密钥，因为它更具体。

如果名称或前缀已存在于其他策略中，则不能在策略中使用该名称或前缀。 OpenSearch 如果您尝试在不同的加密策略中配置相同的资源模式，Serverless 会显示错误。

### 注意事项
<a name="serverless-encryption-considerations"></a>

在为集合配置加密时，请考虑以下事项：
+ 所有无服务器集合都*需要*静态加密。
+ 您可以选择使用客户托管的密钥或 AWS 拥有的密钥。如果您选择客户托管的密钥，建议您启用 [automatic key rotation](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)（自动密钥轮换）。
+ 在创建集合后，您将无法更改该集合的加密密钥。首次设置 AWS KMS 收藏夹时，请仔细选择要使用的收藏夹。
+ 一个集合只能匹配一个加密策略。
+ 具有唯一 KMS 密钥的集合无法与其他集合共享 OpenSearch 计算单位 (OCUs)。每个拥有唯一密钥的集合都需要自己的 4 OCUs.
+ 如果您更新加密策略中的 KMS 密钥，更改不会影响与已分配的 KMS 密钥相匹配的现有集合。
+ OpenSearch Serverless 不会明确检查用户对客户托管密钥的权限。如果用户有权通过数据访问策略访问集合，则他们将能够摄取和查询使用关联密钥加密的数据。

### 所需权限
<a name="serverless-encryption-permissions"></a>

 OpenSearch 无服务器的静态加密使用以下 AWS Identity and Access Management (IAM) 权限。您可以指定 IAM 条件，以将用户限制到特定集合。
+ `aoss:CreateSecurityPolicy`：创建加密策略。
+ `aoss:ListSecurityPolicies`：列出所有加密策略及其附加到的集合。
+ `aoss:GetSecurityPolicy`：查看某个具体加密策略的详细信息。
+ `aoss:UpdateSecurityPolicy`：修改加密策略。
+ `aoss:DeleteSecurityPolicy`：删除加密策略。

以下基于身份的示例访问策略为用户提供了使用资源模式 `collection/application-logs` 管理加密策略所需的最低权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "aoss:CreateSecurityPolicy",
            "aoss:UpdateSecurityPolicy",
            "aoss:DeleteSecurityPolicy",
            "aoss:GetSecurityPolicy"
         ],
         "Resource":"*",
         "Condition":{
            "StringEquals":{
               "aoss:collection":"application-logs"
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "aoss:ListSecurityPolicies"
         ],
         "Resource":"*"
      }
   ]
}
```

------

### 客户托管密钥的密钥策略
<a name="serverless-customer-cmk-policy"></a>

如果您选择[客户托管密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)来保护集合，则 OpenSearch Serverless 将获得代表做出选择的委托人使用 KMS 密钥的权限。该委托人（用户或角色）必须拥有 S OpenSearch erverless 所需的 KMS 密钥的权限。您可以在[密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)或 [IAM policy](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) 中提供这些权限。

OpenSearch 无服务器会在自动扩缩`GenerateDataKey`和软件更新等维护操作期间进行和 `Decrypt` KMS API 调用。您可能会在典型的流量模式之外观察到这些呼叫。这些呼叫是正常服务操作的一部分，并不表示活跃的用户流量。

OpenSearch 当服务器无法访问加密静态数据的 KMS 密钥`KMSKeyInaccessibleException`时，Serverless 会抛出。当您禁用或删除 KMS 密钥，或者撤销允许 S OpenSearch erverless 使用该密钥的授权时，就会发生这种情况。

 OpenSearch Serverless 至少需要对客户托管密钥具有以下权限：
+ [kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms: CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

例如：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
        "Action": "kms:DescribeKey",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Dale"
        },
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "kms:ViaService": "aoss.us-east-1.amazonaws.com"
            }
        }
    },
    {
        "Action": "kms:CreateGrant",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Dale"
        },
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "kms:ViaService": "aoss.us-east-1.amazonaws.com"
            },
            "ForAllValues:StringEquals": {
                "kms:GrantOperations": [
                    "Decrypt",
                    "GenerateDataKey"
                ]
            },
            "Bool": {
                "kms:GrantIsForAWSResource": "true"
            }
        }
    }
  ]
}
```

------

OpenSearch 无服务器创建具有 kms[: GenerateDataKey 和 [km](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) s: Dec](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) rypt 权限的授权。

有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[在 AWS KMS中使用密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

### OpenSearch 无服务器如何使用授权 AWS KMS
<a name="serverless-encryption-grants"></a>

OpenSearch Serverless 需要[获得授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)才能使用客户托管密钥。

当您使用新密钥在账户中创建加密策略时， OpenSearch Serverless 会通过向发送[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)请求来 AWS KMS代表您创建授权。中的授权 AWS KMS 用于授予对客户账户中 KMS 密钥的 OpenSearch 无服务器访问权限。

OpenSearch Serverless 需要获得授权才能使用您的客户托管密钥进行以下内部操作：
+ 向发送[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)请求 AWS KMS 以验证提供的对称客户托管密钥 ID 是否有效。
+ 向 KMS 密钥发送[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)请求以创建用于加密对象的数据密钥。
+ 向发送[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)请求 AWS KMS 以解密加密的数据密钥，以便它们可用于加密您的数据。

您可以随时撤销授予访问权限，或删除服务对客户托管密钥的访问权限。如果这样做， OpenSearch Serverless 将无法访问由客户托管密钥加密的任何数据，这会影响依赖该数据的所有操作，从而导致异步工作流程中`AccessDeniedException`出现错误和故障。

OpenSearch 当给定的客户托管密钥与任何安全策略或集合没有关联时，Serverless 会在异步工作流程中停用授权。

### 创建加密策略（控制台）
<a name="serverless-encryption-console"></a>

在加密策略中，您可以指定 KMS 密钥和一系列将应用该策略的集合模式。在创建集合时，将为与该策略中定义的模式之一相匹配的任何新集合分配相应的 KMS 密钥。建议您在开始创建集合*之前*，先创建加密策略。

**创建 OpenSearch 无服务器加密策略**

1. 在[https://console.aws.amazon.com/aos/家](https://console.aws.amazon.com/aos/home)中打开亚马逊 OpenSearch 服务控制台。

1. 在左侧导航面板上，展开 **Serverless**（无服务器），然后选择 **Encryption policies**（加密策略）。

1. 选择 **Create encryption policy**（创建加密策略）。

1. 为策略提供名称和描述。

1. 在 **Resources**（资源）下，为此加密策略输入一个或多个资源模式。将为当前 AWS 账户 和区域中与其中某一模式相匹配的任何新建集合自动分配此策略。例如，如果您输入（`ApplicationLogs`不带通配符），然后使用该名称创建集合，则该策略和相应的 KMS 密钥将分配给该集合。

   您还可以提供前缀，如 `Logs*`，它会将该策略分配给名称以 `Logs` 开头的任何新集合。通过使用通配符，您可以大规模管理多个集合的加密设置。

1. 在 **Encryption**（加密）下，选择要使用的 KMS 密钥。

1. 选择**创建**。

#### 下一步：创建集合
<a name="serverless-encryption-next"></a>

在配置一个或多个加密策略后，您可以开始创建与这些策略中定义的规则相匹配的集合。有关说明，请参阅[创建集合](serverless-create.md)。

在创建集合的**加密**步骤中， OpenSearch Serverless 会通知您输入的名称与加密策略中定义的模式相匹配，并自动将相应的 KMS 密钥分配给该集合。如果资源模式包含通配符 (\$1)，则您可以选择覆盖匹配，然后选择您自己的密钥。

### 创建加密策略（AWS CLI）
<a name="serverless-encryption-cli"></a>

要使用 OpenSearch 无服务器 API 操作创建加密策略，您需要指定资源模式和 JSON 格式的加密密钥。该[CreateSecurityPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_CreateSecurityPolicy.html)请求接受内联策略和.json 文件。

加密策略采用以下格式。此示例 `my-policy.json` 文件将与名为 `autopartsinventory` 的任何未来集合以及名称以 `sales` 开头的任何集合相匹配。

```
{
   "Rules":[
      {
         "ResourceType":"collection",
         "Resource":[
            "collection/autopartsinventory",
            "collection/sales*"
         ]
      }
   ],
   "AWSOwnedKey":false,
   "KmsARN":"arn:aws:kms:us-east-1:123456789012:key/93fd6da4-a317-4c17-bfe9-382b5d988b36"
}
```

要使用服务拥有的密钥，请将 `AWSOwnedKey` 设置为 `true`：

```
{
   "Rules":[
      {
         "ResourceType":"collection",
         "Resource":[
            "collection/autopartsinventory",
            "collection/sales*"
         ]
      }
   ],
   "AWSOwnedKey":true
}
```

以下请求将创建加密策略：

```
aws opensearchserverless create-security-policy \
    --name sales-inventory \
    --type encryption \
    --policy file://my-policy.json
```

然后，使用 [CreateCollection](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_CreateCollection.html)API 操作创建一个或多个与其中一个资源模式相匹配的集合。

### 查看加密策略
<a name="serverless-encryption-list"></a>

在创建集合之前，您可能想预览账户中的现有加密策略，以查看哪个加密策略的资源模式与您的集合名称相匹配。以下[ListSecurityPolicies](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_ListSecurityPolicies.html)请求列出了您账户中的所有加密策略：

```
aws opensearchserverless list-security-policies --type encryption
```

该请求将返回有关所有已配置的加密策略的信息。使用 `policy` 元素的内容查看策略中定义的模式规则：

```
{
   "securityPolicyDetails": [ 
      { 
         "createdDate": 1663693217826,
         "description": "Sample encryption policy",
         "lastModifiedDate": 1663693217826,
         "name": "my-policy",
         "policy": "{\"Rules\":[{\"ResourceType\":\"collection\",\"Resource\":[\"collection/autopartsinventory\",\"collection/sales*\"]}],\"AWSOwnedKey\":true}",
         "policyVersion": "MTY2MzY5MzIxNzgyNl8x",
         "type": "encryption"
      }
   ]
}
```

要查看有关特定策略的详细信息，包括 KMS 密钥，请使用[GetSecurityPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_GetSecurityPolicy.html)命令。

### 更新加密策略
<a name="serverless-encryption-update"></a>

如果您更新加密策略中的 KMS 密钥，则更改将仅适用于与已配置的名称或模式相匹配的新建集合。它不会影响已经分配 KMS 密钥的现有集合。

这同样适用于策略匹配规则。如果您添加、修改或删除规则，则更改将仅适用于新建集合。如果您修改策略的规则，使其不再与集合的名称相匹配，则现有集合不会失去已分配它们的 KMS 密钥。

要在 OpenSearch Serverless 控制台中更新加密策略，请选择**加密策略**，选择要修改的策略，然后选择**编辑**。进行更改，然后选择**保存**。

要使用 OpenSearch 无服务器 API 更新加密策略，请使用[UpdateSecurityPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_UpdateSecurityPolicy.html)操作。以下请求将使用新策略 JSON 文档更新加密策略：

```
aws opensearchserverless update-security-policy \
    --name sales-inventory \
    --type encryption \
    --policy-version 2 \
    --policy file://my-new-policy.json
```

### 删除加密策略
<a name="serverless-encryption-delete"></a>

在删除加密策略时，当前使用该策略中定义的 KMS 密钥的任何集合都不受影响。要在 OpenSearch 无服务器控制台中删除策略，请选择该策略并选择**删除**。

你也可以使用以下[DeleteSecurityPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_DeleteSecurityPolicy.html)操作：

```
aws opensearchserverless delete-security-policy --name my-policy --type encryption
```

## 传输中加密
<a name="serverless-encryption-in-transit"></a>

在 OpenSearch Serverless 中，集合中的所有路径在传输过程中都使用传输层安全 1.2 (TLS) 和行业标准 AES-256 密码进行加密。也可以通过 TLS 1.2 访问 Opensearch 的所有控制面板 APIs和控制面板。TLS 是一组行业标准的加密协议，用于加密通过网络交换的信息。