我正在尝试限制对端口9200的elasticsearch的直接访问,但允许Nginx代理传递给它。
这是我的配置:
server {
listen 80;
return 301;
}
server {
listen *:5001;
location / {
auth_basic "Restricted";
auth_basic_user_file /var/data/nginx-elastic/.htpasswd;
proxy_pass http://127.0.0.1:9200;
proxy_read_timeout 90;
}
}
这几乎可以按照我的意愿行事。我可以在端口5001上访问我的服务器以访问elasticsearch,并且必须按预期输入凭据。
但是,我仍然可以点击:9200并避免HTTP身份验证,这会破坏这一点。如何在不限制nginx的情况下阻止访问此端口?我试过这个:
server {
listen *:9200;
return 404;
}
但我明白了:
nginx: [emerg] bind() to 0.0.0.0:9200 failed (98: Address already in use)
因为它与elasticsearch冲突。
必须有办法做到这一点!但我想不出来。
编辑:
我根据评论进行了编辑并总结了问题:
我想锁定< serverip>:9200,基本上只允许通过端口5001(在HTTP Auth后面)进行访问。 5001应该代理到127.0.0.1:9200,这样只能通过5001访问elasticsearch。所有其他访问应该是404(或301等)。
答案 0 :(得分:8)
在ES配置中添加此项以确保它仅绑定到localhost
network.host: 127.0.0.1
http.host: 127.0.0.1
然后ES只能从localhost而不是全世界访问。
确保您的操作系统工具确实如此。例如在unix上:
$ netstat -an | grep -i 9200
tcp4 0 0 127.0.0.1.9200 *.* LISTEN
在任何情况下,我都会使用操作系统防火墙锁定机器,实际上只允许所需的端口,而不仅仅依赖于正确的绑定。为什么这很重要?因为ES还在另一个端口(9300)上运行其集群通信,而恶意的实施者可能只是在那里连接。