如何解析 Amazon OpenSearch Service 中缺失或无效的主机标头?

上次更新日期:2021 年 7 月 23 日

由于 Amazon OpenSearch Service(Amazon Elasticsearch Service 的后继者)中的主机标头无效或缺失,我收到了未授权错误。如何解决此问题?

简短描述

当请求的主机标头值和完全限定域名 (FQDN) 不同时,则会记录 Amazon CloudWatch 中的 InvalidHostHeaderRequests 指标。

对于下面的情况,Amazon OpenSearch Service 拒绝缺失有效标头的请求:

  • 请求的域可公开访问。
  • 请求的域使用的是开放的 AWS Identity and Access Management (IAM) 访问策略,而非基于资源的策略(如基于 IP 的策略)。

为了防止触发 InvalidHostHeaderRequests 指标计数器,请考虑以下方法:

否则,您将会遇到以下错误:

$ curl -H 'Host: domain.com' domain-endpoint-name
User is not authorized to perform this action

解决方法

示例

以下是开放访问策略的示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "es:*",
            "Resource": "arn:aws:es:Region:account-id:domain/os-domain-name/*"
        }
    ]
}

以下命令使用 domain.com 作为主机标头值,而该值并非 os-domain-name 域的有效标头。当向具有开放访问策略的可公开访问域提交该请求时,会记录 InvalidHostHeaderRequests 指标且拒绝该请求。

$ curl -H 'Host: domain.com' os-domain-name
User is not authorized to perform this action

要解决“User is not authorized to perform this action”(用户无权执行此操作)错误,请考虑以下方法:

  • 设置适当的主机标头值。
  • 使用 VPC 启动您的 OpenSearch Service 域。
  • 使用基于 IP 的访问策略而非开放访问策略。
  • 使用精细访问控制 (FGAC)

提示 1:设置适当的主机标头值

以下示例命令指定域名作为主机标头值:

$ curl -H 'Host: os-endpoint' os-endpoint

以下使用使用的是 AWS 终端节点 URL:

curl -H 'Host: xxxxxx..os.amazonaws.com' https://xxxxxx..os.amazonaws.com

提示 2:使用 VPC 启动您的 OpenSearch Service 域

使用 VPC 启动您的 OpenSearch Service 域可提供额外的安全层。VPC 还允许您通过安全组管理对域的访问。因此,避免使用公有终端节点启动域可作为最佳实践。尽管您的请求到达了 OpenSearch Service 域,但在 Web 浏览器中访问公有终端节点时,您可能会收到 Not authorized(未授权)错误。有关更多信息,请参阅关于 VPC 域上的访问策略

当您创建具有 VPC 访问权限的域时,终端节点如下所示(类似于公有终端节点):

https://vpc-domain-name-identifier.region.os.amazonaws.com

提示 3:使用基于资源的策略

使用可指定 IAM 角色或者限制对 IP 地址或 CIDR 范围的请求的基于资源的访问策略,而非开放访问策略。

例如,以下基于 IP 的策略允许 11.11.11.11/32 CIDR 范围中的请求。无论主机标头值为何,都允许对此范围内的域的请求,并且不记录 InvalidHostHeaderRequests 指标。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "es:*",
            "Resource": "arn:aws:es:region:account-id:domain/os-domain-name/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "11.11.11.11/32"
                    ]
                }
            }
        }
    ]
}

提示 4:使用精细访问控制 (FGAC)

除了基于资源的访问策略外,您还可以使用 FGAC 管理对 OpenSearch Service 域的数据访问。精细访问控制具有以下优势:

  • 基于角色的访问控制
  • 索引、文档和字段级别的安全
  • OpenSearch 控制面板多租户
  • OpenSearch Service 和 OpenSearch 控制面板的 HTTP 基本身份验证

由于 FGAC 基于角色,因此在对请求进行身份验证时会评估用户凭据。如果精细访问控制对用户进行身份验证,则不会记录 InvalidHostHeaderRequests 指标。有关 FGAC 的更多信息,请参阅宏观大局:精细访问控制和 OpenSearch Service 安全性