

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

# Amazon OpenSearch 无服务器的数据访问控制
<a name="serverless-data-access"></a>

借助 Amazon OpenSearch Serverless 中的数据访问控制，您可以允许用户访问集合和索引，无论其访问机制或网络来源如何。您可以提供对 IAM 角色和 [SAML 身份](serverless-saml.md)的访问权限。

您可以通过适用于集合和索引资源的*数据访问策略*管理访问权限。数据访问策略通过自动为匹配某个具体模式的集合和索引分配访问权限，帮助您大规模管理集合。多个数据访问策略可应用于一个资源。请注意，您必须为馆藏制定数据访问策略才能访问 OpenSearch 控制面板 URL。

**Topics**
+ [数据访问策略与 IAM policy 对比](#serverless-data-access-vs-iam)
+ [配置数据访问策略所必需的 IAM 权限](#serverless-data-access-permissions)
+ [策略语法](#serverless-data-access-syntax)
+ [受支持的策略权限](#serverless-data-supported-permissions)
+ [OpenSearch 仪表板上的示例数据集](#serverless-data-sample-index)
+ [创建数据访问策略（控制台）](#serverless-data-access-console)
+ [创建数据访问策略（AWS CLI）](#serverless-data-access-cli)
+ [查看数据访问策略](#serverless-data-access-list)
+ [更新数据访问策略](#serverless-data-access-update)
+ [删除数据访问策略](#serverless-data-access-delete)
+ [跨账户数据访问](#serverless-data-access-cross)

## 数据访问策略与 IAM policy 对比
<a name="serverless-data-access-vs-iam"></a>

数据访问策略在逻辑上与 AWS Identity and Access Management (IAM) 策略是分开的。IAM 权限控制针对[无服务器 API 操作](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/Welcome.html)的访问权限，如 `CreateCollection` 和 `ListAccessPolicies`。数据访问策略控制对 OpenSearch Serverless 支持的[OpenSearch 操作](#serverless-data-supported-permissions)（例如`PUT <index>`或`GET _cat/indices`）的访问权限。

控制数据访问策略 API 操作访问权限的 IAM 权限，如 `aoss:CreateAccessPolicy` 和（`aoss:GetAccessPolicy`将在下一节中介绍），不会影响数据访问策略中指定的权限。

例如，假设 IAM policy 拒绝用户为 `collection-a` 创建数据访问策略，但允许他们为所有集合 (`*`) 创建数据访问策略：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "aoss:CreateAccessPolicy"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "aoss:collection": "collection-a"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "aoss:CreateAccessPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```

------

如果用户创建了一个数据访问策略，该策略允许针对*所有*集合（`collection/*` 或 `index/*/*`）的某些权限，则该策略将适用于所有集合，包括集合 A。

**重要**  
在数据访问策略中获得权限不足以访问您的 OpenSearch Serverless 集合中的数据。*还*必须授予关联主体访问 IAM 权限 `aoss:APIAccessAll` 和 `aoss:DashboardsAccessAll` 的权限。这两个权限都授予对集合资源的完全访问权限，而仪表板权限还提供对 OpenSearch 仪表板的访问权限。如果主体没有这两种 IAM 权限，则其在尝试向集合发送请求时将收到 403 错误。有关更多信息，请参阅 [使用 OpenSearch API 操作](security-iam-serverless.md#security_iam_id-based-policy-examples-data-plane)。

## 配置数据访问策略所必需的 IAM 权限
<a name="serverless-data-access-permissions"></a>

 OpenSearch 无服务器的数据访问控制使用以下 IAM 权限。您可以指定 IAM 条件，以将用户限制到特定访问策略名称。
+ `aoss:CreateAccessPolicy`：创建访问策略。
+ `aoss:ListAccessPolicies`：列出所有访问策略。
+ `aoss:GetAccessPolicy`：查看有关某个具体访问策略的详细信息。
+ `aoss:UpdateAccessPolicy`：修改访问策略。
+ `aoss:DeleteAccessPolicy`：删除访问策略。

以下基于身份的访问策略允许用户查看所有访问策略，并更新包含资源模式 `collection/logs` 的策略。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "aoss:ListAccessPolicies",
                "aoss:GetAccessPolicy"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "aoss:UpdateAccessPolicy"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aoss:collection": [
                        "logs"
                    ]
                }
            }
        }
    ]
}
```

------

**注意**  
此外， OpenSearch Serverless 需要`aoss:APIAccessAll`和`aoss:DashboardsAccessAll`权限才能使用集合资源。有关更多信息，请参阅 [使用 OpenSearch API 操作](security-iam-serverless.md#security_iam_id-based-policy-examples-data-plane)。

## 策略语法
<a name="serverless-data-access-syntax"></a>

数据访问策略包括一组规则，每条规则均包含以下元素：


| Element | 说明 | 
| --- | --- | 
| ResourceType | 权限适用于的资源类型（集合或索引）。别名和模板权限位于集合级别，而创建、修改和搜索数据的权限位于索引级别。有关更多信息，请参阅[受支持的策略权限](#serverless-data-supported-permissions)。 | 
| Resource | 资源名称 and/or 模式列表。模式是前缀后跟通配符 (\$1)，它们允许将关联权限应用于多个资源。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/serverless-data-access.html) | 
| Permission | 要为指定资源授予的权限的列表。有关权限以及它们允许执行的 API 操作的完整列表，请参阅[支持 OpenSearch 的 API 操作和权限](serverless-genref.md#serverless-operations)。 | 
| Principal | 要向其授予访问权限的一个或多个主体的列表。委托人可以是 IAM 角色 ARNs 或 SAML 身份。这些主体必须位于当前 AWS 账户内。数据访问策略不直接支持跨账户访问，但您可以在策略中加入一个角色，让其他 AWS 账户 用户在拥有馆藏的账户中担任该角色。有关更多信息，请参阅 [跨账户数据访问](#serverless-data-access-cross)。 | 

以下示例策略授予针对名为 `autopartsinventory` 的集合以及任何以前缀 `sales*` 开头的集合的别名和模板权限。它还授予针对 `autopartsinventory` 集合内所有索引以及以前缀 `orders*` 开头的 `salesorders` 集合内任何索引的读写权限。

```
[
   {
      "Description": "Rule 1",
      "Rules":[
         {
            "ResourceType":"collection",
            "Resource":[
               "collection/autopartsinventory",
               "collection/sales*"
            ],
            "Permission":[
               "aoss:CreateCollectionItems",
               "aoss:UpdateCollectionItems",
               "aoss:DescribeCollectionItems"
            ]
         },
         {
            "ResourceType":"index",
            "Resource":[
               "index/autopartsinventory/*",
               "index/salesorders/orders*"
            ],
            "Permission":[
               "aoss:*"
            ]
         }
      ],
      "Principal":[
         "arn:aws:iam::123456789012:user/Dale",
         "arn:aws:iam::123456789012:role/RegulatoryCompliance",
         "saml/123456789012/myprovider/user/Annie",
         "saml/123456789012/anotherprovider/group/Accounting"
      ]
   }
]
```

您不能在策略中显式拒绝访问权限。因此，所有策略权限都具有累加性。例如，如果一个策略授予用户 `aoss:ReadDocument`，而另一个策略授予 `aoss:WriteDocument`，则该用户将同时拥有*这两种*权限。如果第三个策略授予同一用户 `aoss:*`，则该用户可以针对关联索引执行*所有*操作；限制性较大的权限不会覆盖限制性较小的权限。

## 受支持的策略权限
<a name="serverless-data-supported-permissions"></a>

数据访问策略中支持以下权限。有关每种权限允许的 OpenSearch API 操作，请参阅[支持 OpenSearch 的 API 操作和权限](serverless-genref.md#serverless-operations)。

**集合权限**
+ `aoss:CreateCollectionItems`
+ `aoss:DeleteCollectionItems`
+ `aoss:UpdateCollectionItems`
+ `aoss:DescribeCollectionItems`
+ `aoss:*`

**索引权限**
+ `aoss:ReadDocument`
+ `aoss:WriteDocument`
+ `aoss:CreateIndex`
+ `aoss:DeleteIndex`
+ `aoss:UpdateIndex`
+ `aoss:DescribeIndex`
+ `aoss:*`

## OpenSearch 仪表板上的示例数据集
<a name="serverless-data-sample-index"></a>

OpenSearch 仪表板提供了带有可视化效果、仪表板和其他工具的[示例数据集](https://opensearch.org/docs/latest/dashboards/quickstart-dashboards/#adding-sample-data)，可帮助您在添加自己的数据之前浏览仪表板。要根据此示例数据创建索引，您需要一个数据访问策略，该策略提供对要使用的数据集的权限。以下策略使用通配符 (`*`) 来提供对所有三个示例数据集的权限。

```
[
  {
    "Rules": [
      {
        "Resource": [
          "index/<collection-name>/opensearch_dashboards_sample_data_*"
        ],
        "Permission": [
          "aoss:CreateIndex",
          "aoss:DescribeIndex",
          "aoss:ReadDocument"
        ],
        "ResourceType": "index"
      }
    ],
    "Principal": [
      "arn:aws:iam::<account-id>:user/<user>"
    ]
  }
]
```

## 创建数据访问策略（控制台）
<a name="serverless-data-access-console"></a>

您可以使用可视化编辑器或以 JSON 格式创建数据访问策略。在创建集合时，将为与该策略中定义的模式之一相匹配的任何新集合分配相应的权限。

**创建 OpenSearch 无服务器数据访问策略**

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

1. 在左侧导航窗格中，展开**无服务器**，然后在**安全性**下，选择**数据访问控制**。

1. 选择**创建访问策略**。

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

1. 为策略中的第一条规则提供名称。例如，Logs collection access（日志集合访问权限）。

1. 选择 **Add principals**（添加主体），然后选择一个或多个 IAM 角色或 [SAML 用户和组](serverless-saml.md)，授予其数据访问权限。
**注意**  
要从下拉菜单中选择主体，您必须拥有 `iam:ListUsers` 和 `iam:ListRoles` 权限（对于 IAM 主体）和 `aoss:ListSecurityConfigs` 权限（对于 SAML 身份）。

1. 选择 **Grant**（授予），然后选择要授予关联主体的别名、模板和索引权限。有关权限及其允许的访问权限的完整列表，请参阅 [支持 OpenSearch 的 API 操作和权限](serverless-genref.md#serverless-operations)。

1. （可选）为策略配置其他规则。

1. 选择**创建**。在创建策略与强制执行权限之间，可能会有大约一分钟的延迟。如果该延迟超过 5 分钟，请联系 [支持](https://console.aws.amazon.com/support/home)。

**重要**  
如果策略仅包含索引权限（不包含集合权限），您可能仍会看到一条有关匹配集合的消息，内容为 `Collection cannot be accessed yet. Configure data access policies so that users can access the data within this collection`。您可以忽略此警告。允许的主体仍然可以在集合上执行其分配的索引相关操作。

## 创建数据访问策略（AWS CLI）
<a name="serverless-data-access-cli"></a>

要使用 OpenSearch 无服务器 API 创建数据访问策略，请使用`CreateAccessPolicy`命令。该命令同时接受内联策略和 .json 文件。必须以 [JSON 转义字符串](https://www.freeformatter.com/json-escape.html)的形式编码内联策略。

以下请求将创建数据访问策略：

```
aws opensearchserverless create-access-policy \
    --name marketing \
    --type data \
    --policy "[{\"Rules\":[{\"ResourceType\":\"collection\",\"Resource\":[\"collection/autopartsinventory\",\"collection/sales*\"],\"Permission\":[\"aoss:UpdateCollectionItems\"]},{\"ResourceType\":\"index\",\"Resource\":[\"index/autopartsinventory/*\",\"index/salesorders/orders*\"],\"Permission\":[\"aoss:ReadDocument\",\"aoss:DescribeIndex\"]}],\"Principal\":[\"arn:aws:iam::123456789012:user/Shaheen\"]}]"
```

要在 .json 文件中提供策略，请使用 `--policy file://my-policy.json` 格式。

策略中包含的委托人现在可以使用他们被授予访问权限的[OpenSearch 操作](#serverless-data-supported-permissions)。

## 查看数据访问策略
<a name="serverless-data-access-list"></a>

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

```
aws opensearchserverless list-access-policies --type data
```

该请求将返回有关所有已配置的数据访问策略的信息。要查看某一具体策略中定义的模式规则，请在响应的 `accessPolicySummaries` 元素内容中查找策略信息。请注意本政策`type`的`name`和，并在[GetAccessPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_GetAccessPolicy.html)请求中使用这些属性来接收包含以下策略详细信息的响应：

```
{
    "accessPolicyDetails": [
        {
            "type": "data",
            "name": "my-policy",
            "policyVersion": "MTY2NDA1NDE4MDg1OF8x",
            "description": "My policy",
            "policy": "[{\"Rules\":[{\"ResourceType\":\"collection\",\"Resource\":[\"collection/autopartsinventory\",\"collection/sales*\"],\"Permission\":[\"aoss:UpdateCollectionItems\"]},{\"ResourceType\":\"index\",\"Resource\":[\"index/autopartsinventory/*\",\"index/salesorders/orders*\"],\"Permission\":[\"aoss:ReadDocument\",\"aoss:DescribeIndex\"]}],\"Principal\":[\"arn:aws:iam::123456789012:user/Shaheen\"]}]",
            "createdDate": 1664054180858,
            "lastModifiedDate": 1664054180858
        }
    ]
}
```

您可以包括资源筛选器，将结果限制为包含特定集合或索引的策略：

```
aws opensearchserverless list-access-policies --type data --resource "index/autopartsinventory/*"
```

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

## 更新数据访问策略
<a name="serverless-data-access-update"></a>

在更新数据访问策略时，所有关联集合都将受到影响。要在 OpenSearch Serverless 控制台中更新数据访问策略，请选择**数据访问控制**，选择要修改的策略，然后选择**编辑**。进行更改，然后选择**保存**。

要使用 OpenSearch 无服务器 API 更新数据访问策略，`UpdateAccessPolicy`请发送请求。必须包括策略版本，您可以使用 `ListAccessPolicies` 或 `GetAccessPolicy` 命令检索策略版本。包括最新策略版本可以确保您不会无意中覆盖其他人所做的更改。

以下[UpdateAccessPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_UpdateAccessPolicy.html)请求使用新的策略 JSON 文档更新数据访问策略：

```
aws opensearchserverless update-access-policy \
    --name sales-inventory \
    --type data \
    --policy-version MTY2NDA1NDE4MDg1OF8x \
    --policy file://my-new-policy.json
```

在更新策略与强制执行新权限之间，可能会有几分钟的延迟。

## 删除数据访问策略
<a name="serverless-data-access-delete"></a>

在删除数据访问策略时，所有关联集合都将失去该策略中定义的访问权限。在删除策略之前，请确保您的 IAM 和 SAML 用户拥有针对集合的适当访问权限。要在 OpenSearch 无服务器控制台中删除策略，请选择该策略并选择**删除**。

你也可以使用以下[DeleteAccessPolicy](https://docs.aws.amazon.com/opensearch-service/latest/ServerlessAPIReference/API_DeleteAccessPolicy.html)命令：

```
aws opensearchserverless delete-access-policy --name my-policy --type data
```

## 跨账户数据访问
<a name="serverless-data-access-cross"></a>

虽然无法创建具有跨账户身份或跨账户集合的数据访问策略，但仍然可以通过代入角色选项来设置跨账户访问。例如，假设 `account-a` 拥有一个 `account-b` 需要访问的集合，则 `account-b` 中的用户可以代入 `account-a` 中的角色。该角色必须具有 IAM 权限 `aoss:APIAccessAll` 和 `aoss:DashboardsAccessAll`，并且必须包含在 `account-a` 上的数据访问策略中。