用户:anonymous无权执行:es:ESHttpPost on resource:

时间:2017-12-21 14:42:05

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

我的应用程序出现此问题。 我的应用程序部署到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]"
        }
      }
    }
  ]
}

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

2 个答案:

答案 0 :(得分: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",
            ....
          ]
        }
      }
    }
  ]
}

希望这会有所帮助。

答案 1 :(得分:0)

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请求。与“签名版本4”不兼容的客户端发出的请求将被拒绝,并显示“用户:未经授权的匿名用户”错误。有关正确签名到Amazon ES的请求的示例,请参阅发出和签名Amazon ES请求。

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

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