

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

# Amazon 服务中的精细访问控制 OpenSearch
<a name="fgac"></a>

精细的访问控制提供了更多方法来控制对您在 Ama OpenSearch zon Service 上的数据的访问权限。例如，根据请求发出者，您可能希望搜索仅返回一个索引中的结果。您可能想隐藏文档中的某些字段或完全排除某些文档。

精细访问控制提供了以下功能：
+ 基于角色的访问控制
+ 索引、文档和字段级别的安全性
+ OpenSearch 仪表板多租户
+  OpenSearch 和 OpenSearch 仪表板的 HTTP 基本身份验证

**Topics**
+ [大局：精细的访问控制和服务安全 OpenSearch](#fgac-access-policies)
+ [重要概念](#fgac-concepts)
+ [关于主用户](#fgac-master-user)
+ [启用精细访问控制](#fgac-enabling)
+ [以主用户身份访问 OpenSearch 仪表板](#fgac-dashboards)
+ [管理权限](#fgac-access-control)
+ [推荐配置](#fgac-recommendations)
+ [限制](#fgac-limitations)
+ [修改主用户](#fgac-forget)
+ [其他主用户](#fgac-more-masters)
+ [手动快照](#fgac-snapshots)
+ [集成](#fgac-integrations)
+ [REST API 差异](#fgac-rest-api)
+ [教程：使用 IAM 主用户和 Amazon Cognito 身份验证配置域](fgac-iam.md)
+ [教程：使用内部用户数据库和 HTTP 基本身份验证配置域](fgac-http-auth.md)

## 大局：精细的访问控制和服务安全 OpenSearch
<a name="fgac-access-policies"></a>

Amazon OpenSearch 服务安全有三个主要层：

**Network**  
第一个安全层是网络，它决定请求是否到达 OpenSearch 服务域。如果您在创建域时选择**公共访问**，则来自任何连接到 Internet 的客户端的请求都能到达域终端节点。如果您选择 **VPC 访问**，则客户端必须连接到 VPC（并且关联的安全组必须允许它）才能使请求到达终端节点。有关更多信息，请参阅 [在 VPC 内启动您的亚马逊 OpenSearch 服务域](vpc.md)。

**域访问策略**  
第二个安全层是域访问策略。在请求到达域终端节点后，[基于资源的访问策略](ac.md#ac-types-resource)允许或拒绝请求访问给定 URI。访问策略在请求本身到达 OpenSearch 前在域“边缘”接受或拒绝请求。

**精细访问控制**  
第三个也是最后一个安全层是精细访问控制。在基于资源的访问策略允许请求到达域终端节点后，精细访问控制对用户凭证进行评估，并对用户进行身份验证或拒绝请求。如果精细访问控制对用户进行身份验证，它将获取映射到该用户的所有角色，并使用完整的权限集来确定如何处理请求。

**注意**  
如果基于资源的访问策略包含 IAM 角色或用户，则客户端必须使用签 Amazon 名版本 4 发送已签名的请求。因此，访问策略可能会与精细访问控制发生冲突，特别是在您使用内部用户数据库和 HTTP 基本身份验证时。您无法使用用户名和密码*以及* IAM 凭证对请求进行签名。通常，如果您启用精细访问控制，我们建议您使用不需要已签名请求的域访问策略。

下列示意图说明了一个常见配置：启用了精细访问控制的 VPC 访问域、基于 IAM 的访问策略和 IAM 主用户。

![\[针对 VPC 域的精细访问控制授权流程\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/fgac-vpc-iam.png)


下列示意图说明了另一个常见配置：启用了精细访问控制的公共访问域、不使用 IAM 委托人的访问策略以及内部用户数据库中的主用户。

![\[针对公共访问域的精细访问控制授权流程\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/fgac-public-basic.png)


### 示例
<a name="fgac-example"></a>

考虑向 `movies/_search?q=thor` 发出 `GET` 请求。用户是否有权搜索 `movies` 索引？ 如果是这样，用户是否有权查看该索引中的*所有*文档？ 响应是否应忽略或匿名化任何字段？ 对于主用户，响应可能如下所示：

```
{
  "hits": {
    "total": 7,
    "max_score": 8.772789,
    "hits": [{
        "_index": "movies",
        "_type": "_doc",
        "_id": "tt0800369",
        "_score": 8.772789,
        "_source": {
          "directors": [
            "Kenneth Branagh",
            "Joss Whedon"
          ],
          "release_date": "2011-04-21T00:00:00Z",
          "genres": [
            "Action",
            "Adventure",
            "Fantasy"
          ],
          "plot": "The powerful but arrogant god Thor is cast out of Asgard to live amongst humans in Midgard (Earth), where he soon becomes one of their finest defenders.",
          "title": "Thor",
          "actors": [
            "Chris Hemsworth",
            "Anthony Hopkins",
            "Natalie Portman"
          ],
          "year": 2011
        }
      },
      ...
    ]
  }
}
```

如果具有更有限的权限的用户发出完全相同的请求，则响应可能如下所示：

```
{
  "hits": {
    "total": 2,
    "max_score": 8.772789,
    "hits": [{
        "_index": "movies",
        "_type": "_doc",
        "_id": "tt0800369",
        "_score": 8.772789,
        "_source": {
          "year": 2011,
          "release_date": "3812a72c6dd23eef3c750c2d99e205cbd260389461e19d610406847397ecb357",
          "plot": "The powerful but arrogant god Thor is cast out of Asgard to live amongst humans in Midgard (Earth), where he soon becomes one of their finest defenders.",
          "title": "Thor"
        }
      },
      ...
    ]
  }
}
```

响应的命中次数较少，并且每次命中的字段较少。此外，`release_date` 字段是匿名的。如果不具有权限的用户发出相同的请求，集群将返回错误：

```
{
  "error": {
    "root_cause": [{
      "type": "security_exception",
      "reason": "no permissions for [indices:data/read/search] and User [name=limited-user, roles=[], requestedTenant=null]"
    }],
    "type": "security_exception",
    "reason": "no permissions for [indices:data/read/search] and User [name=limited-user, roles=[], requestedTenant=null]"
  },
  "status": 403
}
```

如果用户提供的凭证无效，则集群将返回 `Unauthorized` 异常。

## 重要概念
<a name="fgac-concepts"></a>

在开始使用精细访问控制时，请注意以下概念：
+ **角色** – 使用精细访问控制的核心方式。在此情况下，角色与 IAM 角色不同。角色包含任意权限组合：集群范围的、特定于索引的、文档级别的和字段级别的。
+ **映射** – 配置角色后，您可以将该角色*映射*到一个或多个用户。例如，您可以将三个角色映射到单个用户：一个角色提供对控制面板的访问权限，一个角色提供对 `index1` 的只读访问权限，还有一个角色提供对 `index2` 的写入访问权限。您也可以将所有这些权限包含在单个角色中。
+ **用户**-向 OpenSearch 集群发出请求的人员或应用程序。用户具有他们在发出请求时指定的凭据（IAM 访问密钥或用户名和密码）。

## 关于主用户
<a name="fgac-master-user"></a>

Ser OpenSearch vice 中的*主用户*可以是用户名和密码组合，也可以是对底层 OpenSearch集群拥有完全权限的 IAM 委托人。如果用户拥有 OpenSearch 集群的所有访问权限，并且能够在 OpenSearch 仪表板中创建内部用户、角色和角色映射，则该用户被视为主用户。

在 OpenSearch 服务控制台或通过 CLI 创建的主用户会自动映射到两个预定义的角色：
+ `all_access` – 提供对所有集群范围操作的完全访问权限、写入所有集群索引的权限以及向所有租户写入的权限。
+ `security_manager` – 提供对[安全插件](https://opensearch.org/docs/latest/security/)的访问权限以及对用户和权限进行管理的访问权限。

使用这两个角色，用户可以访问 OpenSearch 仪表板中的 “**安全**” 选项卡，在那里他们可以管理用户和权限。如果您创建了其他内部用户并且仅将其映射到 `all_access` 角色，则该用户无权访问**安全**选项卡。您可以通过将用户显式映射到 `all_access` 和 `security_manager` 角色来创建其他的主用户。有关说明，请参阅[其他主用户](#fgac-more-masters)。

在为域创建主用户时，您可以指定现有的 *IAM 主体*，也可以在*内部用户数据库*中创建主用户。在决定要使用哪种方式时，请注意以下因素：
+ **IAM 委托人** — 如果您为主用户选择 IAM 委托人，则必须使用签 Amazon 名版本 4 对集群的所有请求进行签名。

  OpenSearch 服务不考虑任何 IAM 委托人的权限。IAM 用户或角色仅用于*身份验证*的目的。该用户或角色拥有的策略与主用户获得的*授权*无关。授权是通过 OpenSearch 安全插件中的各种[权限](https://opensearch.org/docs/latest/security/access-control/permissions/)进行的。

  例如，您可以*向 IAM* 委托人分配零 IAM 权限，只要计算机或个人可以向该用户或角色进行身份验证，他们就拥有 OpenSearch 服务中主用户的权力。

  如果您想在多个集群上使用相同的用户、想要使用 Amazon Cognito 访问控制面板，或者您的 OpenSearch 客户端支持签名版本 4 签名，我们建议您使用 IAM。
+ **内部用户数据库** – 如果您在内部用户数据库中创建主用户（使用用户名和密码组合），则可以使用 HTTP 基本身份验证（以及 IAM 凭证）向集群发出请求。大多数客户端都支持基本身份验证，包括 [curl](https://curl.haxx.se/)，它还支持带有 [--aw](https://curl.se/docs/manpage.html) s-s Amazon igv4 选项的签名版本 4。内部用户数据库存储在 OpenSearch 索引中，因此您无法与其他集群共享。

  在以下情况下，我们建议您使用内部用户数据库：如果不需要跨多个集群重用用户，如果您想要使用 HTTP 基本身份验证访问控制面板（而不是 Amazon Cognito）或您的客户端仅支持基本身份验证。内部用户数据库是开始使用 S OpenSearch ervice 的最简单方法。

## 启用精细访问控制
<a name="fgac-enabling"></a>

使用控制台、 Amazon CLI或配置 API 启用精细的访问控制。要查看步骤，请参阅[创建和管理亚马逊 OpenSearch 服务域名](createupdatedomains.md)。

精细的访问控制需要使用 Elasticsearch OpenSearch 6.7 或更高版本。它还要求所有到该域的流量都使用 HTTPS，[对静态数据进行node-to-node ](encryption-at-rest.md)[加密和加密](ntn.md)。对请求进行额外处理可能需要占用各数据节点的计算和内存资源，具体取决于配置精细访问控制高级功能的方式。一旦启用精细访问控制，便无法将其禁用。

### 在现有域上启用精细访问控制
<a name="fgac-enabling-existing"></a>

您可以对正在运行 OpenSearch 或 Elasticsearch 6.7 或更高版本的现有域名启用精细访问控制。

**在现有域上（控制台）上启用精细访问控制**

1. 选择域、**Actions**（操作）和 **Edit security configuration**（编辑安全配置）。

1. 选择 **Enable fine-grained access control**（启用精细访问控制）。

1. 选择如何创建主用户：
   + 如果要使用 IAM 进行用户管理，请选择 **Set IAM ARN as master user (将 IAM ARN 设置为主用户)**，然后为 IAM 角色指定 ARN。
   + 如果要使用内部用户数据库，请选择**创建主用户**，并指定用户名和密码。

1. （可选）选择 **Enable migration period for open/IP-based access policy**（为开放/基于 IP 的访问策略启用迁移期）。此设置启用了 30 天过渡期，在此期间，现有用户可以继续访问域而不发生中断，并且现有开放和[基于 IP 的访问策略](ac.md#ac-types-ip)将继续适用于您的域。在此迁移期间，我们建议管理员为该域[创建必要的角色并将其映射到用户](#fgac-access-control)。如果您使用基于身份的策略，而不是开放或基于 IP 的访问策略，则可以禁用此设置。

   此外，您还需要更新客户端，以便在迁移期间处理精细访问控制。例如，如果您将 IAM 角色映射为精细的访问控制，则必须更新您的客户端，才能开始使用签 Amazon 名版本 4 对请求进行签名。如果您使用精细访问控制配置 HTTP 基本身份验证，则必须更新客户端才能在请求中提供相应的基本身份验证凭证。

   在迁移期间，访问该域的 Das OpenSearch hboards 端点的用户将直接登陆 “**发现**” 页面，而不是登录页面。管理员和主用户可以选择 **Login**（登录），以使用管理员凭据登录并配置角色映射。
**重要**  
**OpenSearch 服务会在 30 天后自动禁用迁移期**。我们建议您在创建必要的角色并将其映射到用户之后立即终止它。迁移期结束后，您无法重新启用它。

1. 选择**保存更改**。

更改将会触发[蓝/绿部署](managedomains-configuration-changes.md#bg)，在此期间，集群运行状况变为红色，但所有集群操作不会受到影响。

**在现有域 (CLI) 上启用精细访问控制**

将 `AnonymousAuthEnabled` 设置为 `true` 以通过精细访问控制启用迁移期：

```
aws opensearch update-domain-config --domain-name test-domain --region us-east-1 \
      --advanced-security-options '{ "Enabled": true, "InternalUserDatabaseEnabled":true, "MasterUserOptions": {"MasterUserName":"master-username","MasterUserPassword":"master-password"},"AnonymousAuthEnabled": true}'
```

### 关于 default\$1role
<a name="fgac-enabling-defaultrole"></a>

精细访问控制需要[角色映射](#fgac-mapping)。如果您的域使用[基于身份的访问策略](ac.md#ac-types-identity)，S OpenSearch ervice 会自动将您的用户映射到名为 **default\$1role 的新角色**，以帮助您正确迁移现有用户。此临时映射可确保在您创建自己的角色映射之前，您的用户仍然可以成功发送 IAM 签名的 GET 和 PUT 请求。

该角色不会向您的 OpenSearch 服务域添加任何安全漏洞或缺陷。我们建议您在设置自己的角色并相应地映射它们之后删除默认角色。

### 迁移场景
<a name="fgac-enabling-scenarios"></a>

下表介绍了在现有域上启用精细访问控制之前和之后每种身份验证方法的行为，以及管理员为将用户正确映射到角色所必须采取的步骤：


| 身份验证方法 | 启用精细访问控制之前 | 启用精细访问控制之后 | 管理员任务 | 
| --- | --- | --- | --- | 
| 基于身份的策略 |  满足 IAM policy 的所有用户都可以访问该域。  |  您无需启用迁移期。 OpenSearch 服务会自动将所有满足 IAM 策略的用户映射到 **[default\$1](#fgac-enabling-defaultrole)** role，以便他们可以继续访问该域。  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/fgac.html)  | 
| 基于 IP 的策略 |  来自允许的 IP 地址或 CIDR 块的所有用户均可访问该域。  |  在 30 天的迁移期间，来自允许的 IP 地址或 CIDR 块的所有用户均可继续访问该域。  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/fgac.html)  | 
| 开放访问策略 |  互联网上的所有用户均可访问该域。  |  在 30 天的迁移期间，互联网上的所有用户均可继续访问该域。  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/fgac.html)  | 

## 以主用户身份访问 OpenSearch 仪表板
<a name="fgac-dashboards"></a>

精细访问控制具有 OpenSearch 仪表板插件，可简化管理任务。可以使用控制面板管理用户、角色、映射、操作组和租户。但是， OpenSearch Dashboards 登录页面和基础身份验证方法会有所不同，具体取决于您管理用户和配置域名的方式。
+ 如果要使用 IAM 进行用户管理，请使用 [为控制面板配置 Amazon Cognito 身份验证 OpenSearch](cognito-auth.md) 访问控制面板。否则，控制面板将显示一个不起作用的登录页面。请参阅[限制](#fgac-limitations)。

  采用 Amazon Cognito 身份验证，身份池中的某个代入角色必须与您为主用户指定的 IAM 角色匹配。有关此配置的更多信息，请参阅[（可选）配置精细访问](cognito-auth.md#cognito-auth-granular)和[教程：使用 IAM 主用户和 Amazon Cognito 身份验证配置域](fgac-iam.md)。  
![\[Cognito 登录页面\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/cognito-auth.png)
+ 如果您选择使用内部用户数据库，则可以使用您的主用户名和密码登录控制面板。您必须通过 HTTPS 访问控制面板。面向控制面板的 Amazon Cognito 和 SAML 身份验证都取代了此登录屏幕。

  有关此配置的更多信息，请参阅[教程：使用内部用户数据库和 HTTP 基本身份验证配置域](fgac-http-auth.md)。  
![\[基本身份验证登录页面\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/basic-auth-dashboards.png)
+ 如果选择使用 SAML 身份验证，则可以使用来自外部身份提供程序的凭据登录。有关更多信息，请参阅 [仪表板的 SAML 身份验证 OpenSearch](saml.md)。

## 管理权限
<a name="fgac-access-control"></a>

如[重要概念](#fgac-concepts)中所述，您可以使用角色、用户和映射管理精细访问控制权限。此部分介绍如何创建和应用这些资源。我们建议您[以主用户身份登录控制面板](#fgac-dashboards)来执行这些操作。

![\[控制面板中的安全性主页\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/dashboards-fgac-home.png)


**注意**  
您选择授予用户的权限因使用案例而有很大差异。我们无法在本文档中涵盖所有场景。在决定向用户授予哪些权限时，请务必参考以下各节中提到的 OpenSearch 集群和索引权限，并始终遵循[最低权限原则](https://en.wikipedia.org/wiki/Principle_of_least_privilege)。

### 创建角色
<a name="fgac-roles"></a>

您可以使用 OpenSearch 仪表板或 REST API 中的`_plugins/_security`操作来创建用于精细访问控制的新角色。有关更多信息，请参阅[创建角色](https://opensearch.org/docs/latest/security/access-control/users-roles/#create-roles)。

精细访问控制还包含大量[预定义角色](https://opensearch.org/docs/latest/security/access-control/users-roles/#predefined-roles)。Dashb OpenSearch oards 和 Logstash 等客户端会向其发出各种各样的请求 OpenSearch，这使得手动创建具有最低权限集的角色变得困难。例如，`opensearch_dashboards_user` 角色包括用户处理索引模式、可视化内容、控制面板和租户所需的权限。我们建议[将它映射](#fgac-mapping)到任何访问仪表板的用户或后端角色，以及其他允许访问其他索引的角色。

Amazon OpenSearch 服务不提供以下 OpenSearch 角色：
+ `observability_full_access`
+ `observability_read_access`
+ `reports_read_access`
+ `reports_full_access`

Amazon Ser OpenSearch vice 提供了几个不适用于以下角色的角色 OpenSearch：
+ `ultrawarm_manager`
+ `ml_full_access`
+ `cold_manager`
+ `notifications_full_access`
+ `notifications_read_access`

#### 集群级安全性
<a name="fgac-cluster-level"></a>

集群级权限包括用于发出广泛请求（例如 `_mget`、`_msearch` 和 `_bulk`）、监控运行状况、拍摄快照等操作的功能。在创建角色时，使用 **Cluster Permissions (集群权限)**部分管理这些权限。有关集群级权限的完整列表，请参阅[集群权限](https://opensearch.org/docs/latest/security/access-control/permissions/#cluster-permissions)。

您通常可以使用默认操作组的组合来实现所需的安全状况，而不是个人权限。有关集群级操作组的列表，请参阅[集群级](https://opensearch.org/docs/latest/security/access-control/default-action-groups/#cluster-level)。

#### 索引级安全性
<a name="fgac-index-level"></a>

索引级权限包括用于执行创建新索引、搜索索引、读取和写入文档、删除文档、管理别名等操作的功能。在创建角色时，使用 **Index Permissions (索引权限)**部分管理这些权限。有关索引级权限的完整列表，请参阅[索引权限](https://opensearch.org/docs/latest/security/access-control/permissions/#index-permissions)。

您通常可以使用默认操作组的组合来实现所需的安全状况，而不是个人权限。有关索引级操作组的列表，请参阅[索引级](https://opensearch.org/docs/latest/security/access-control/default-action-groups/#index-level)。

#### 文档级安全性
<a name="fgac-document-level"></a>

文档级安全性允许您限制用户可在索引中查看的文档。创建角色时，请指定索引模式和 OpenSearch 查询。映射到该角色的任何用户只能查看与查询匹配的文档。文档级安全性将影响[搜索时收到的命中数](#fgac-example)。

有关更多信息，请参阅[文档级安全性](https://opensearch.org/docs/latest/security/access-control/document-level-security/)。

#### 字段级安全性
<a name="fgac-field-level"></a>

字段级安全性允许您控制用户可查看的文档字段。创建角色时，添加要包含或排除的字段的列表。如果包含字段，则映射到该角色的任何用户都只能查看这些字段。如果排除字段，则他们可以查看*除* 排除的字段之外的所有字段。字段级安全性将影响[搜索时包含在命中内的字段数](#fgac-example)。

有关更多信息，请参阅[字段级安全性](https://opensearch.org/docs/latest/security/access-control/field-level-security/)。

#### 字段掩码
<a name="fgac-field-masking"></a>

字段遮罩是字段级安全性的替代方法，它允许您匿名化字段中的数据，而不是将其完全删除。创建角色时，添加要遮罩的字段的列表。字段遮罩将影响[搜索时是否能查看字段内容](#fgac-example)。

**提示**  
如果您对字段应用标准掩码，S OpenSearch ervice 会使用安全的随机哈希，这可能会导致聚合结果不准确。要对掩码字段执行聚合，请改用基于模式的掩码。

### 创建 用户
<a name="fgac-users"></a>

如果您启用了内部用户数据库，则可以使用 OpenSearch仪表板或 REST API 中的`_plugins/_security`操作来创建用户。有关更多信息，请参阅[创建用户](https://opensearch.org/docs/latest/security/access-control/users-roles/#create-users)。

如果您为主用户选择了 IAM，请忽略控制面板的此部分。改为创建 IAM 角色。有关更多信息，请参阅 [IAM 用户指南](https://docs.amazonaws.cn/IAM/latest/UserGuide/)。

### 将角色映射到用户
<a name="fgac-mapping"></a>

角色映射是精细访问控制的最重要的方面。精细访问控制具有一些预定义的角色来帮助您入门，但除非您将角色映射到用户，否则，向集群发出的每个请求都会以权限错误结束。

*后端角色*有助于简化角色映射过程。您可以将角色映射到全部 100 个用户共享的单个后端角色，而不是将同一角色映射到 100 个单独的用户。后端角色可以为 IAM 角色或任意字符串。
+ **在 “用户” 部分中指定用户 ARNs、用户和 Amazon Cognito 用户字符串。**Cognito 用户字符串采用的形式为 `Cognito/user-pool-id/username`。
+  ARNs 在后端角色部分指定**后端角色和 IAM 角色**。

![\[角色映射屏幕\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/role-mapping-edit.png)


您可以使用 OpenSearch 控制面板或 REST API 中的`_plugins/_security`操作将角色映射到用户。有关更多信息，请参阅[将角色映射到用户](https://opensearch.org/docs/latest/security/access-control/users-roles/#map-users-to-roles)。

### 创建操作组
<a name="fgac-ag"></a>

操作组是可以在不同的资源中重用的权限集。您可以使用 OpenSearch 控制面板或 REST API 中的`_plugins/_security`操作创建新的操作组，尽管默认操作组足以满足大多数用例的需求。有关原定设置操作组的更多信息，请参阅[原定设置操作组](https://opensearch.org/docs/latest/security/access-control/default-action-groups/)。

### OpenSearch 仪表板多租户
<a name="fgac-multitenancy"></a>

租户是用于保存索引模式、可视化内容、控制面板和其他控制面板对象的空间。控制面板多租户可让您安全地与其他控制面板用户共享您的工作（或保持您工作的私密性）并动态配置租户。您可以控制哪些角色有权访问租户，以及这些角色是否具有读取或写入访问权限。全局租户是默认租户。要了解更多信息，请参阅[OpenSearch 仪表板多租户](https://opensearch.org/docs/latest/security/multi-tenancy/tenant-index/)。

**查看当前租户或更改租户**

1. 导航到 OpenSearch 仪表板并登录。

1. 选择右上角的用户图标，然后选择**切换租户**。

1. 在创建可视化内容或控制面板之前验证租户。如果想与所有其他控制面板用户共享您的工作，请选择 **Global (全球)**。要与一部分控制面板用户共享您的工作，请选择其他共享租户。否则，请选择 **Private (私有)**。

**注意**  
OpenSearch 仪表板为每个租户维护一个单独的索引，并创建一个名为的索引模板`tenant_template`。请勿删除或修改`tenant_template`索引，因为如果租户索引映射配置错误，可能会导致 OpenSearch 仪表板出现故障。

## 推荐配置
<a name="fgac-recommendations"></a>

由于精细访问控制[与其他安全功能的交互方式](#fgac-access-policies)，我们建议您使用适用于大多数使用案例的多种精细访问控制配置。


| 说明 | 主用户 | 域访问策略 | 
| --- | --- | --- | 
|  使用 IAM 凭证调用 OpenSearch APIs，并使用 [SAML 身份验证](saml.md)访问控制面板。使用控制面板 REST API 管理精细访问控制角色。  | IAM 角色或用户 |    JSON   

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Amazon": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*"
    }
  ]
}
```      | 
|  使用 IAM 凭证或基本身份验证调用 OpenSearch APIs。使用控制面板 REST API 管理精细访问控制角色。 此配置提供了很大的灵活性，尤其是在您的 OpenSearch客户端仅支持基本身份验证的情况下。 如果您有现有身份提供商，则使用 [SAML 身份验证](saml.md)访问控制面板。否则，请管理内部用户数据库中的控制面板用户。  | 用户名和密码 |    JSON   

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Amazon": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*"
    }
  ]
}
```      | 
|  使用 IAM 凭证调用 OpenSearch APIs，并使用 Amazon Cognito 访问控制面板。使用控制面板 REST API 管理精细访问控制角色。  | IAM 角色或用户 |    JSON   

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Amazon": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*"
    }
  ]
}
```      | 
|  使用 IAM 凭证调用 OpenSearch APIs，并阻止对控制面板的大部分访问权限。使用 REST API 管理精细访问控制角色。  | IAM 角色或用户 |    JSON   

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Amazon": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*"
    },
    {
      "Effect": "Deny",
      "Principal": {
        "Amazon": "*"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/_dashboards*"
    }
  ]
}
```      | 

## 限制
<a name="fgac-limitations"></a>

精细访问控制具有几个重要限制：
+ 如果域位于 VPC 中，则角色映射的 `hosts` 部分（将角色映射映射到主机名或 IP 地址）会不起作用。您仍可以将角色映射到用户和后端角色。
+ 如果您为主用户选择 IAM，但不启用 Amazon Cognito 或 SAML 身份验证，控制面板将显示一个不起作用的登录页面。
+ 如果您为主用户选择 IAM，则仍可以在内部用户数据库中创建用户。但是，由于此配置下未启用 HTTP 基本身份验证，因此，使用这些用户凭证签名的任何请求都将被拒绝。
+ 如果您使用 [SQL](sql-support.md) 查询您无权访问的索引，则您会收到“no permissions (无权限)”错误。如果索引不存在，则会收到“no such index (无此类索引)”错误。错误消息中的此类差异意味着，如果您碰巧猜到其名称，则可以确认索引的存在。

  要最大程度地减小问题，请[不要在索引名称中包含敏感信息](indexing.md#indexing-naming)。要拒绝所有对 SQL 的访问，请将以下元素添加到您的域访问策略：

  ```
  {
    "Effect": "Deny",
    "Principal": {
      "Amazon": [
        "*"
      ]
    },
    "Action": [
      "es:*"
    ],
    "Resource": "arn:aws:es:us-east-1:123456789012:domain/my-domain/_plugins/_sql"
  }
  ```
+ 如果您的域版本为 2.3 或更高版本且启用了精细访问控制，则将 `max_clause_count` 设置为 1 会导致域出现问题。我们建议将此账户设置为更高的数值。
+ 如果您在未设置精细访问控制的域中启用精细访问控制，则对于为直接查询而创建的数据来源，需要自行设置精细访问控制角色。有关如何设置精细访问角色的更多信息，请参阅创建与 Amazon [S3 的亚马逊 OpenSearch 服务数据源集成。](https://docs.amazonaws.cn/opensearch-service/latest/developerguide/direct-query-s3-creating.html#direct-query-s3-prereq)

## 修改主用户
<a name="fgac-forget"></a>

如果您忘记了主用户的详细信息，则可以使用控制台、 Amazon CLI或配置 API 重新配置它。

**修改主用户（控制台）**

1. 在家中导航至 Amazon OpenSearch 服务控制台 [https://console.aws.amazon.com/aos//](https://console.amazonaws.cn/aos/home/)。

1. 选择域，然后选择 **Actions**（操作）、**Edit security configuration**（编辑安全配置）。

1. 选择 **Set IAM ARN as master user (将 IAM ARN 设置为主用户)** 或 **Create new master user (创建新的主用户)**。
   + 如果您之前使用了 IAM 主用户，则精细访问控制会将 `all_access` 角色重新映射到您指定的新 IAM ARN。
   + 如果您之前使用了内部用户数据库，则精细访问控制会创建一个新的主用户。您可以使用新的主用户删除旧的主用户。
   + 从内部用户数据库切换到 IAM 主用户*不*从内部用户数据库中删除任何用户。相反，它只是禁用 HTTP 基本身份验证。手动从内部用户数据库中删除用户，或保留这些用户，以防您需要重新启用 HTTP 基本身份验证。

1. 选择**保存更改**。

## 其他主用户
<a name="fgac-more-masters"></a>

在创建域时指定主用户，但如果需要，可以使用此主用户创建其他主用户。你有两个选择： OpenSearch 仪表板或 REST API。
+ 在控制面板中，选择 **Security (安全性)** 和 **Roles (角色)**，然后将新主用户映射到 `all_access` 和 `security_manager` 角色。  
![\[角色映射页面\]](http://docs.amazonaws.cn/opensearch-service/latest/developerguide/images/new-master-users.png)
+ 要使用 REST API，请发送以下请求：

  ```
  PUT _plugins/_security/api/rolesmapping/all_access
  {
    "backend_roles": [
      "arn:aws:iam::123456789012:role/fourth-master-user"
    ],
    "hosts": [],
    "users": [
      "master-user",
      "second-master-user",
      "arn:aws:iam::123456789012:user/third-master-user"
    ]
  }
  ```

  ```
  PUT _plugins/_security/api/rolesmapping/security_manager
  {
    "backend_roles": [
      "arn:aws:iam::123456789012:role/fourth-master-user"
    ],
    "hosts": [],
    "users": [
      "master-user",
      "second-master-user",
      "arn:aws:iam::123456789012:user/third-master-user"
    ]
  }
  ```

  这些请求将*替换* 当前角色映射，因此，首先执行 `GET` 请求，以便您可以在 `PUT` 请求中包含所有当前角色。如果您无法访问控制面板，并且希望将 IAM 角色从 Amazon Cognito 映射到 `all_access` 角色，则 REST API 会特别有用。

## 手动快照
<a name="fgac-snapshots"></a>

精细访问控制会给拍摄手动快照带来一些额外的复杂性。要注册快照存储库——即使您使用 HTTP 基本身份验证以实现所有其他目的——您必须将 `manage_snapshots` 角色映射到具有 `iam:PassRole` 权限的 IAM 角色来代入 `TheSnapshotRole`，如 [先决条件](managedomains-snapshots.md#managedomains-snapshot-prerequisites) 中所定义。

然后，使用该 IAM 角色向域发送已签名请求，如[注册手动快照存储库](managedomains-snapshot-registerdirectory.md)中所述。

## 集成
<a name="fgac-integrations"></a>

如果您在服务中使用[其他 Amazon OpenSearch 服务](integrations.md)，则必须为这些服务提供具有适当权限的 IAM 角色。例如，Data Firehose 传输流通常使用名为 `firehose_delivery_role` 的 IAM 角色。在控制面板中，[创建一个用于精细访问控制的角色](#fgac-roles)，并[将 IAM 角色映射到该角色](#fgac-mapping)。在此情况下，新角色需要以下权限：

```
{
  "cluster_permissions": [
    "cluster_composite_ops",
    "cluster_monitor"
  ],
  "index_permissions": [{
    "index_patterns": [
      "firehose-index*"
    ],
    "allowed_actions": [
      "create_index",
      "manage",
      "crud"
    ]
  }]
}
```

权限将因每个服务执行的操作而异。索引数据的 Amazon IoT 规则或 Amazon Lambda 函数可能需要与 Firehose 类似的权限，而仅执行搜索的 Lambda 函数可以使用更有限的权限集。

## REST API 差异
<a name="fgac-rest-api"></a>

精细访问控制 REST API 会因您的 OpenSearch/Elasticsearch 版本而略为不同。在发出 `PUT` 请求之前，请发出 `GET` 请求以验证预期请求正文。例如，对 `_plugins/_security/api/user` 的 `GET` 请求将返回所有用户，然后您可以修改并使用这些用户来发出有效的 `PUT` 请求。

在 Elasticsearch 6. *x*，用于创建用户的请求与以下内容类似：

```
PUT _opendistro/_security/api/user/new-user
{
  "password": "some-password",
  "roles": ["new-backend-role"]
}
```

在 E OpenSearch lasticsearch 7.x 上，请求如下所示（`_opendistro`如果使用 Elasticsearch，则改`_plugins`为）：

```
PUT _plugins/_security/api/user/new-user
{
  "password": "some-password",
  "backend_roles": ["new-backend-role"]
}
```

此外，在 Elasticsearch 6. *x* 中，租户是角色的属性：

```
GET _opendistro/_security/api/roles/all_access

{
  "all_access": {
    "cluster": ["UNLIMITED"],
    "tenants": {
      "admin_tenant": "RW"
    },
    "indices": {
      "*": {
        "*": ["UNLIMITED"]
      }
    },
    "readonly": "true"
  }
}
```

在 OpenSearch Elasticsearch 7.x 中，它们是具有自己的 URI 的对象（`_opendistro`如果使用 Elasticsearch，则改`_plugins`为）：

```
GET _plugins/_security/api/tenants

{
  "global_tenant": {
    "reserved": true,
    "hidden": false,
    "description": "Global tenant",
    "static": false
  }
}
```

有关 OpenSearch REST API 的文档，请参阅[安全插件 API 参考](https://opensearch.org/docs/latest/security/access-control/api/)。

**提示**  
如果您使用内部用户数据库，则可以使用 [curl](https://curl.haxx.se/) 发出请求并测试您的域。尝试以下示例命令：  

```
curl -XGET -u 'master-user:master-user-password' 'domain-endpoint/_search'
curl -XGET -u 'master-user:master-user-password' 'domain-endpoint/_plugins/_security/api/user'
```