tho*_*liv 9 amazon-web-services elasticsearch
我目前正在将现有的ELK应用程序从EC2迁移到Amazon Elasticsearch Service.首先,我决定保留现有的Kibana服务器,只将其切换为指向新的ES域.所以我已经改变了我现有的kibana配置,如本节所述:http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html#es-managedomains-kibana
然后,我开始遇到一些问题,其中大部分内容都在本文中解决:Kibana将不会连接到亚马逊Elasticsearch服务上的Elasticsearch ,但步骤4除外.Kibana仍然需要通过标头进行身份验证.由于我没有使用CLI或AWS SDK通过访问密钥进行身份验证,而是使用HTTP/S调用(即http:// search- [es-domain]:80在kibana配置文件中),它看起来像我无论如何都需要签署我的HTTP请求(如前一个链接中的步骤4所示)但是,我正在寻找其他选项来克服这个问题,以便拥有自己的Kibana服务器,集群,具有适当级别的访问控制来自外部互联网,同时仍然保护仅对某些IAM用户/角色访问Elasticsearch.
然后我决定尝试另一种选择:实现我自己的代理(在这种情况下使用我现有的Nginx服务器使其指向新的ES域.这种方法在Reinvent bdt209-launch-amazon-elasticsearch-的幻灯片56中提出.for-realtime-data-analytics slideshare.这样,我可以让Web服务器可以访问世界(通过端口443/80),当然还有基本的Web身份验证,同时使用非常严格的访问策略保护ES域只允许IP基于(以及IAM角色)访问Elasticsearch集群.
但是我仍然遇到了同样的问题.我收到这条消息作为回应:
"message": "'a2liYW5hYWRtaW46YWRtaW5AMTIz' not a valid key=value pair (missing equal-sign) in Authorization header: 'Basic a2liYW5hYWRtaW46YWRtaW5AMTIz'."
Run Code Online (Sandbox Code Playgroud)
这意味着我需要签署请求.我可以就如何克服这个问题提出一些建议吗?我是否真的需要以编程方式签署网络请求?或者是否有其他选项而不影响安全性和访问控制(意味着允许受限制的公共访问kibana,对ES集群的访问权限(角色和基于IP)非常有限)?
非常感谢.
该问题的根源是Nginx添加了Authorization标头(通过基本身份验证模块启用),其中包含一个带有登录详细信息的加密字符串到我的自定义Kibana实例.
如果此标头传递到ES域端点,则ES域将尝试使用该标头对接收服务器进行身份验证.由于它没有为我的自定义授权凭据预设,因此只会拒绝授权错误.
所以我不得不禁用从NGINX代理到ElasticSearch端点的Header Forwarding,用这个代替我的位置节(在我的NGINX配置中):
location / {
proxy_pass http://localhost:5601/;
proxy_pass_request_headers off;
proxy_redirect http://localhost:5601/ /;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/nginx.auth;
}
Run Code Online (Sandbox Code Playgroud)
我知道这里有一个批准的答案,但它并没有完全适用于我,我想提出我的解决方案,也许有人可以使用它.我的环境很简单,在t2实例上通常是aws linux,apt-get安装了nginx和untar kibana文件夹.
我的nginx.conf文件;
server {
listen 80;
server_name localhost;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header User-Agent $http_user_agent;
auth_basic_user_file /etc/nginx/.htpasswd;
auth_basic "Auth Required";
proxy_pass http://search-xxxxxx.eu-west-1.es.amazonaws.com/;
proxy_redirect http://search-xxxxxx.eu-west-1.es.amazonaws.com/ /;
proxy_set_header Authorization "";
proxy_hide_header Authorization;
}
}
Run Code Online (Sandbox Code Playgroud)
我相信最后两行很重要,其他答案中缺少什么.当您向Aws ES发送任何类型的身份验证标头时,它会尝试像签名一样找到aws api auth方法作为值,因此它不能与auth标头一起使用.
我希望这也能帮助别人,我花了4个小时作为nginx新手.
| 归档时间: |
|
| 查看次数: |
4139 次 |
| 最近记录: |