签署 ElasticSearch AWS 调用
Posted
技术标签:
【中文标题】签署 ElasticSearch AWS 调用【英文标题】:Signing ElasticSearch AWS calls 【发布时间】:2018-08-15 14:22:54 【问题描述】:我正在尝试签署我们对 ElasticSearch 的所有 AWS 调用,但响应始终是;
User: anonymous is not authorized to perform: es:ESHttpGet on resource:
我尝试了多个密钥对和 IAM 用户。
我们 php 中的调用是使用官方 elasticsearch-php client 进行的,所有请求都使用找到的连接器 here 进行签名。
下图是我们如何构建 ElasticSearch 客户端并应用签名中间件;
$credentials = new Credentials('<KEY>', '<SECRET>');
$signature = new SignatureV4('es', 'eu-central-1');
$middleware = new AwsSignatureMiddleware($credentials, $signature);
$defaultHandler = ESClientBuilder::defaultHandler();
$awsHandler = $middleware($defaultHandler);
$clientBuilder = ESClientBuilder::create();
$clientBuilder
->setHandler($awsHandler)
->setHosts(['<URL>']);
$this->_client = $clientBuilder->build();
作为参考附加到我们试图访问的 elasticsearch 实例的策略是;
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::<IAM_USER>"
,
"Action": "es:*",
"Resource": "<RESOURCE>/*"
]
其他信息;
我们使用的是 Laravel 框架,版本 5.4.7 Elasticsearch 客户端版本 5.3.2【问题讨论】:
你能显示你正在发出的 GET 请求吗? 你设法让它工作了吗?你能分享一些信息吗? 【参考方案1】:如果不完全了解特定请求所发生的情况,很难回答任何具体问题,但这里有一些关于从哪里开始搜索解决方案的建议。
-
中间件可能有问题。我找到了另一个,它似乎更干净,测试得更好。我建议尝试一下 - amazon-es-php
您的政策/VPC 配置可能存在问题,因此请务必检查this page 是否有可能存在问题的地方
另一个选项是为您的 elasticsearch php 客户端启用登录,以便了解请求的情况。这可以通过将独白库添加到您的应用程序并创建记录器处理程序来完成。这是来自官方elastic search documentation的指南。
【讨论】:
【参考方案2】:当我遇到类似问题时,这对我有帮助:
要解决此问题,请检查以下内容:
确认您使用的客户端支持凭据签名,并且您的请求已正确签名。 AWS 使用 Signature Version 4 签名流程向 AWS 请求添加身份验证信息;来自与Signature Version 4 不兼容的客户端的请求被拒绝,并出现“匿名未授权”错误。有关对 Elasticsearch 的格式良好的请求示例,请参阅Signing an Amazon Elasticsearch Service Search Request.
验证访问策略中指定的用户和资源是否指定了正确的 Amazon 资源名称 (ARN)。有关 ARN 的一般信息,请参阅 Amazon 资源名称 (ARN) 和 AWS 服务命名空间。
确保访问策略中指定的 IP 地址使用 CIDR 表示法。访问策略在根据策略指定的 IP 地址检查您的 IP 地址时使用 CIDR 表示法。
验证您的访问策略中指定的 IP 地址是否与您用于访问 Elasticsearch 集群的 IP 地址匹配。自最初配置访问策略以来,您的 IP 可能已更改。您可以在http://checkip.amazonaws.com/ 确定任何实例的面向公众的 IP 地址。
查看Troubleshoot IAM Policies 了解更多故障排除信息。
更多详情请查看this out...
【讨论】:
以上是关于签署 ElasticSearch AWS 调用的主要内容,如果未能解决你的问题,请参考以下文章
Aws::Errors::MissingCredentialsError(无法在没有设置凭证的情况下签署请求)- Beanstalk,通过 IAM 角色实现安全
Google Cloud Api Gateway 是不是提供请求签名和验证 sdk,例如使用 Signature 4 签署 AWS API Gateway 请求?