【问题标题】:User: anonymous is not authorized to perform: es:ESHttpPost on resource:用户:anonymous 无权执行:es:ESHttpPost 在资源上:
【发布时间】:2020-09-01 10:42:25
【问题描述】:

我的应用遇到了这个问题。 我的应用程序部署到 Heroku 服务器,我使用的是部署在 AWS 上的 Elasticsearch。 当我尝试在本地访问 Elasticsearch - 在 aws 域上 - 一切正常。 但是,当我尝试访问我的 Heroku 域(都来自邮递员)时,我收到 503 错误消息:

2017-12-21T13:36:52.982331+00:00 app[web.1]:   statusCode: 403,
2017-12-21T13:36:52.982332+00:00 app[web.1]:   response: '{"Message":"User: anonymous is not authorized to perform: es:ESHttpPost on resource: houngrymonkey"}',

我的访问政策是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:eu-central-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "[heroku static ip]"
        }
      }
    }
  ]
}

谁能告诉我这里有什么问题? 谢谢!

【问题讨论】:

标签: node.js amazon-web-services elasticsearch heroku amazon-iam


【解决方案1】:

我在使用 ES 和 lambda 时遇到了同样的问题,这不完全是你的情况,但也许它会有所帮助。实际上我做了什么来解决这个问题

1) 在 lambda (Node.js v6.10) 中我添加了以下代码:

var creds = new AWS.EnvironmentCredentials('AWS');
....
// inside "post to ES"-method
var signer = new AWS.Signers.V4(req, 'es');
signer.addAuthorization(creds, new Date());
....
// post request to ES goes here

有了这些行,我的异常从 "User: anonymous...""User: arn:aws:sts::xxxx:assumed-role/yyyy/zzzzz" 情况正是如此。

2) 我通过以下方式更新了 ES 政策

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:sts::xxxx:assumed-role/yyyy/zzzzz" (which was in exception)
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:[region]:[account-id]:domain/[es-domain]/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:[region]:[account-id]:domain/[es-domain]/*"
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "1.2.3.4/32",
            ....
          ]
        }
      }
    }
  ]
}

希望这会有所帮助。

【讨论】:

  • 节省时间,谢谢!
【解决方案2】:

标题中提到的错误的更多解决方案描述here

如果您使用的客户端不支持请求签名(例如浏览器),请考虑以下事项:

  1. 使用基于 IP 的访问策略。基于 IP 的策略允许对 Amazon ES 域的未签名请求。
  2. 确保访问策略中指定的 IP 地址使用 CIDR 表示法。根据访问策略检查 IP 地址时,访问策略使用 CIDR 表示法。
  3. 验证访问策略中指定的 IP 地址是否与用于访问您的 Elasticsearch 集群的 IP 地址相同。您可以通过 https://checkip.amazonaws.com/ 获取本地计算机的公共 IP 地址。

注意:如果您收到授权错误,请检查您使用的是公共 IP 地址还是私有 IP 地址。基于 IP 的访问策略不能应用于驻留在虚拟私有云 (VPC) 中的 Amazon ES 域。这是因为安全组已经实施了基于 IP 的访问策略。对于公共访问,基于 IP 的策略仍然可用。有关更多信息,请参阅关于 VPC 域的访问策略。

如果您使用的客户端支持请求签名,请检查以下内容:

  1. 确保您的请求已正确签名。 AWS 使用 Signature Version 4 签名流程将身份验证信息添加到 AWS 请求。来自与 Signature Version 4 不兼容的客户端的请求被拒绝,并出现“用户:匿名未授权”错误。有关对 Amazon ES 的正确签名请求的示例,请参阅创建和签署 Amazon ES 请求。

  2. 验证访问策略中是否指定了正确的 Amazon 资源名称 (ARN)。

如果您的 Amazon ES 域位于 VPC 中,请配置带有或不带有代理服务器的开放访问策略。然后,使用安全组来控制访问。有关更多信息,请参阅关于 VPC 域的访问策略。

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 2021-11-28
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多