ELK通过TLS加密和基于角色的访问控制确保Elasticsearch的安全

2021-03-14 17:12:40 浏览数 (1)

Elastic Stack在x-pack中提供了免费的TLS加密通信和基于角色的访问控制(RBAC)。前面两篇博客分别介绍了ELK的安装和脚本配置以及SSL自签名证书的生成。

这篇博客我们仅使用一个elasticsearch节点并采取nginx加x-pack的方式确保elasticsearch的安全。接着为Kibana启用安全功能以及配置基于角色的访问控制,来远程访问elasticsearch。最后配置logstash的远程连接功能。

配置elasticsearch节点

步骤一:elasticsearch上配置TLS

进入elasticsearch目录

如果是deb安装的elasticsearch,主目录在/usr/share/elasticsearch目录下,config目录就是/etc/elasticsearch;如果是tar.gz直接在解压后的目录下即可。

接着在elasticsearch目录下使用下列命令生成ssl证书:

代码语言:txt复制
bin/elasticsearch-certutil cert -out 
config/elastic-certificates.p12 -pass ""

在config目录的elasticsearch.yml配置文件,在文件末尾黏贴下列代码:

代码语言:txt复制
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

保存文件,然后就可以启动elasticsearch了

生成密码

在elasticsearch目录下使用下面的命令生成密码:

代码语言:txt复制
bin/elasticsearch-setup-passwords auto

也可以将auto改为interactive自定义密码。

生成的密码形式如下:

代码语言:txt复制
Changed password for user apm_system
PASSWORD apm_system = 

Changed password for user kibana
PASSWORD kibana = 

Changed password for user logstash_system
PASSWORD logstash_system = 

Changed password for user beats_system
PASSWORD beats_system = 

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = 

Changed password for user elastic
PASSWORD elastic = 

记录上述密码。以上密码将是后续软件登录elasticsearch的重要凭证。

配置nginx

修改/etc/nginx/nginx.conf脚本

在http{}中加入下面代码:

代码语言:txt复制
server {
        listen       你的PORT ssl http2;
        listen       [::]:你的PORT ssl http2;
        server_name  你的IP;
        root         /usr/share/nginx/html;
                access_log  /var/log/nginx/elasticsearch_access.log;
                error_log   /var/log/nginx/elasticsearch_error.log;
        
        ssl_certificate "/path/cert.crt";
        ssl_certificate_key "/path/cert.key";
        ssl_session_cache shared:SSL:1m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_timeout  10m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4!DHE;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass http://127.0.0.1:9200;#访问你的端口时,会自动代理到127.0.0.1的9200端口
        }
    }

其中.crt和.key文件通过上一篇生成SSL证书的方法生成。

重启nginx
代码语言:txt复制
systemctl restart nginx.service

配置kibana远程访问

之前的博客已经介绍过与elasticsearch处在同一节点的启动。为了减少对计算资源的占用,我将kibana放到了本地,仅在需要使用的时候开启kibana服务远程连接elasticsearch服务器。

打开kibana的config目录下的kibana.yml文件。将下面两行的注释取消:

代码语言:txt复制
elasticsearch.username: "user"
elasticsearch.password: "pass"

将”user”改为”kibana”,将”password”改为刚才生成的用户kibana的密码”setup-passwords”。

修改该配置文件中的elasticsearch的host:

代码语言:txt复制
elasticsearch.hosts: ["elasticsearch的IP:Port"]

接着取消下列注释,将值改为从full改为none,这样改的目的是不要验证我们自签名的证书,或者也可以配置ca证书的路径(这个方法我没试过,当然更安全一点^_^)

代码语言:txt复制
elasticsearch.ssl.verificationMode: none

接着启动kibana,用户名密码是刚才生成的超级用户elastic和其对应的密码。

创建新角色的方法去查参考文献吧哈哈哈

::: tip

kibana必须和初次连接elasticsearch的kibana版本相同,最好kibana和elasticsearch的版本一直都相同。

:::

配置logstash远程连接elasticsearch

修改logstash.yml

cd到logstash文件夹打开config目录下的logstash.yml。取消X-Pack Settings中下面配置的注释并修改:

代码语言:txt复制
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: setup-passwords
xpack.monitoring.elasticsearch.hosts: ["elasticsearch的IP:Port"]
xpack.monitoring.elasticsearch.ssl.certificate_authority: /path/ca.crt

上面的用户名密码是之前elasticsearch为logstash自动生成的。签名ca是自签名SSL时我们自己生成的ca

修改pipelines.conf

上一篇博客中我们以收集nginx日志为例,列出了详细的配置,这次我们在之前的脚本上添加了登陆elasticsearch的用户名和密码,以及访问elasticsearch时验证自签名证书的cacert:

代码语言:txt复制
input {
    beats {
        port => "5044"
    }
}
# The filter part of this file is commented out to indicate that it is
# optional.
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    geoip {
        source => "clientip"
    }
}
output {
    elasticsearch {
        hosts => [ "elasticsearch的IP:Port" ]
        index => "nginx-access-%{ YYYY.MM.dd}"
        cacert => '/path/ca.crt'
        user => "elastic"
        password => "setup-passwords"
    }
}

修改保存好后就可以启动logstash了。

logstash的后台命令如下:

代码语言:txt复制
nohup /path/logstash-X.X.X/bin/logstash -f /path/logstash-X.X.X/nginx-pipelines.conf --config.reload.automatic &

配置filebeats

因为filebeats和logstash运行在同一主机下,所以filebeats的配置与上一篇博客相同。

这里介绍一下filebeats后台运行的方法。

使用nohup命令之后,关掉窗口的时候filebeats也会自动关闭,因此需要使用下面的办法:

代码语言:txt复制
sudo apt-get install screen (或者 yum install screen)
screen
nohup /path/filebeat-X.X.X-linux-x86_64/filebeat -e -c /path/filebeat-X.X.X-linux-x86_64/filebeat.yml > /path/filebeat-X.X.X-linux-x86_64/filebeat.log &

0 人点赞