Amazon Elasticsearch Service:通过代理调用ES域时的授权标头问题

时间:2015-10-27 01:06:01

标签: 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 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)非常有限)?

非常感谢。

2 个答案:

答案 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新手。