一、演示说明:

Elasticsearch是Java编写的企业级搜索服务,启动服务默认会开放HTTP 9200端口,可被非法操作数据。可以通过升级到ES高版本,使用x-pack插件、search-guard插件、shield插件,或使用防火墙做限制。本文演示通过Nginx反代ES的9200端口,使用ngx_http_auth_basic_module模块做访问控制,登录时需输入用户名和密码。 

二、部署ES:

1、关闭防火墙firewalld和SELinux

2、配置JDK:

# cd /etc/profile.d
# touch jdk.sh
# cat > jdk.sh <<EOF
export JAVA_HOME=/iflytek/java/jdk1.8.0_251
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:\$JRE_HOME/lib:$CLASSPATH
export
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
EOF

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_授权访问

# cat /etc/profile.d/jdk.sh
# source /etc/profile.d/jdk.sh
# chmod +x /iflytek/java/jdk1.8.0_251/bin/java
# logout
# java -version

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_02

3、调整系统参数:

# vim /etc/security/limits.conf,末尾新增如下代码:
* soft nofile 102431
* hard nofile 102431
* soft nproc 102431
* hard nproc 102431
# logout
# ulimit -n

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_03

# vim /etc/sysctl.conf,末尾新增如下代码:
vm.max_map_count=655360
# sysctl -p

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_04

4、创建普通用户esuser,并对相关目录授权:

# adduser esuser
# chown -R esuser:esuser /iflytek/data/elasticsearch-5.6.8/
# chown -R esuser:esuser /iflytek/server/elasticsearch-5.6.8/

5、修改elasticsearch.yml配置文件:

# vim /iflytek/server/elasticsearch-5.6.8/config/elasticsearch.yml
network.host: 192.168.0.202
# \grep "network.host" /iflytek/server/elasticsearch-5.6.8/config/elasticsearch.yml

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_授权访问_05

6、启动ES:

# chmod +x /iflytek/server/elasticsearch-5.6.8/bin/elasticsearch
# su - esuser -c "/iflytek/server/elasticsearch-5.6.8/bin/elasticsearch &" &> /tmp/elasticsearch.txt
# tail -f /tmp/elasticsearch.txt

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_06

# ps -ef | grep elasticsearch | grep -v grep

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_反向代理_07

# ss -tunlp | grep 9200

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_反向代理_08

7、浏览器访问9200端口:

192.168.0.202:9200

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_09

192.168.0.202:9200/_cat

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_10

说明:能正常访问页面

三、部署Nginx:

1、安装Nginx和相关工具:

# yum -y install epel-release
# yum -y install nginx httpd-tools

2、创建页面登录认证用户admin和对应密码文件:

# htpasswd -c /etc/nginx/.htpasswd admin

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_11

# cat /etc/nginx/.htpasswd

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_12

说明:密码123456加密后保存在/etc/nginx/.htpasswd文件中。

3、修改nginx.conf配置文件,在http配置段内新增如下代码:

# vim /etc/nginx/nginx.conf
upstream elasticsearch {
    server  localhost:9200;
}
server {
    listen  9201;
    server_name  192.168.0.202;
    # 认证提示框的banner信息
    auth_basic "Welcome to Elasticsearch";
    # 使用htpasswd创建的密码文件位置
    auth_basic_user_file  /etc/nginx/.htpasswd;
    
    location / {
        proxy_pass  http://elasticsearch;
        # 重定向后的请求会增加一个名为Host的header,包含目标IP
        proxy_set_header  Host  $host;
        # 重定向后的请求会增加一个名为X-Real-IP的header,包含请求源IP
        proxy_set_header  X-Real-IP  $remote_addr;
        # 重定向后的请求会增加一个名为X-Forwarded-For的header,记录X-Forwarded-For信息
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

说明:

(1)proxy_set_header指令用于在Nginx反向代理服务器上设置请求头。Host是HTTP协议中的一个请求头,表示请求的目标主机名或IP地址。在使用反向代理时,代理服务器需要知道客户端请求的目标服务器地址,因此要在请求头中包含Host信息。$host是Nginx内置变量,表示请求中的域名部分。通过将Host设置为$host,Nginx会将请求的域名部分作为Host请求头发送到目标服务器,从而正确地将请求路由到对应的虚拟主机或域名下的应用程序。

(2)X-Real-IP是一个自定义的请求头名称,$remote_addr是Nginx内置变量,表示客户端的真实IP地址。因此,proxy_set_header  X-Real-IP  $remote_addr的含义是将客户端的真实IP地址记录到X-Real-IP请求头中,并将该请求头传递给后端的upstream服务器,使得后端服务器能获取到客户端真实的IP地址信息。当Nginx作为反向代理时,它会将客户端请求转发给后端的upstream服务器。在这个过程中,upstream服务器收到的源IP是Nginx服务器的IP地址而不是客户端的IP地址,导致后端服务器无法获取真实的客户端IP地址,无法实现一些IP相关的功能,例如IP黑名单等。

(3)X-Forwarded-For是一个自定义的请求头名称,$proxy_add_x_forwarded_for是Nginx内置变量,表示在代理链中已有的X-Forwarded-For的值,并且会在它后面添加客户端的IP地址。这个指令的作用是将客户端的真实IP地址信息附加在请求头中,通过代理服务器转发给后端的服务器,以便于后端服务器获取客户端的真实IP地址,从而实现一些IP相关的功能,例如IP黑名单等。使用$proxy_add_x_forwarded_for会将客户端IP地址附加在已有的X-Forwarded-For字段后,并以逗号分隔,如果没有X-Forwarded-For字段则会创建该字段。在进行多层代理时也能够更容易地追踪到客户端的真实地址,提高可靠性。

4、检查配置文件语法并启动Nginx:

# nginx -t

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_授权访问_13

# systemctl start nginx
# ps -ef | grep nginx

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Nginx_14

# ss -tunlp | grep -w 80

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_15

四、配置ES:

1、停止ES:

# ps -ef | grep elasticsearch | grep -v grep

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_反向代理_16

# kill -9 1697

2、修改elasticsearch.yml配置文件:

# vim /iflytek/server/elasticsearch-5.6.8/config/elasticsearch.yml
network.host: localhost
\grep "network.host" /iflytek/server/elasticsearch-5.6.8/config/elasticsearch.yml

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_17

说明:避免外部用户通过网络直接访问到ES的9200端口,需要将服务绑定localhost。

3、启动ES:

# su - esuser -c "/iflytek/server/elasticsearch-5.6.8/bin/elasticsearch &" &> /tmp/elasticsearch.txt
# tail -f /tmp/elasticsearch.txt
# ps -ef | grep elasticsearch | grep -v grep
# ss -tunlp | grep 9200

五、效果测试:

1、浏览器无法直接访问http://192.168.0.202:9200

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_反向代理_18

2、浏览器访问Nginx代理,http://192.168.0.202:9201,输入用户名admin和密码123456CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_19

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_Elasticsearch_20

CentOS 7.9 Elasticsearch V5.6.8 9200端口未授权访问漏洞修复_反向代理_21