我目前正在将现有的ELK应用程序从EC2迁移到Amazon Elasticsearch Service。 首先,我决定保留现有的Kibana服务器,只将其切换为指向新的ES域。所以我已经改变了我现有的kibana配置,如本节所述: http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html#es-managedomains-kibana
然后,我开始遇到一些问题,其中大部分内容都在本文中提到:Kibana won't connect to Elasticsearch on Amazon's Elasticsearch Service 除了第4步.Kibana仍然需要通过标头进行身份验证。 由于我没有使用CLI或AWS SDK通过访问密钥进行身份验证,而是使用HTTP / S调用(即kibana配置文件中的http://search-[es-domain]:80),看起来我需要签署我的HTTP请求(正如前一个链接中的步骤4所示)但是,我正在寻找其他选项来克服这个问题,以便拥有自己的Kibana服务器,集群,具有来自外部互联网的适当级别的访问控制,同时仍然保护仅对某些IAM用户/角色访问Elasticsearch。
然后我决定尝试另一个选项:实现我自己的代理(在这种情况下使用我现有的Nginx服务器使其指向新的ES域。这种方法在Reinvent bdt209-launch-amazon-elasticsearch-for-realtime-data-analytics的幻灯片56中提出。 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'."
这意味着我需要签署请求。 我可以就如何克服这个问题提出一些建议吗?我是否真的需要以编程方式签署网络请求?或者是否有其他选项而不影响安全性和访问控制(意味着允许受限制的公共访问kibana,对ES集群的访问权限(基于角色和IP)非常有限)?
非常感谢。
答案 0 :(得分:9)
问题的根源是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;
}
答案 1 :(得分:6)
我知道这里有一个经过批准的答案,但它并没有完全适用于我,我想提出我的解决方案,也许有人可以使用它。 我的环境很简单,在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;
}
}
我相信最后两行很重要,其他答案中缺少什么。当您向Aws ES发送任何类型的身份验证标头时,它会尝试查找像签名一样的aws api auth方法作为值,因此它不能与auth标头一起使用。
我希望这对某人也有帮助,我花了4个小时作为nginx新手。