背景
elastic 集群对外提供服务的9200、5601等端口没有任何加密认证,存在数据暴露和安全漏洞的风险。任何人都能随意获取信息,极易导致线上索引或数据可能被泄露和误删。在 elastic 6.8 版本后 elastic 提供核心安全功能实现节点和集群的安全认证,加固集群安全性,保护 elastic 数据不受非法侵害!
elastic 提供核心安全功能
1,TLS 功能。可对通信进行加密;
2,文件和原生 Realm。可用于创建和管理用户;
3,基于角色的访问控制。可用于控制用户对集群 API 和索引的访问权限;
4,通过针对 Kibana Spaces 的安全功能,还可允许在Kibana 中实现多租户;
elastic 单节点安全认证
使用基本许可证时,默认情况下禁用 Elasticsearch 安全功能。启用 Elasticsearch 安全功能可启用基本身份验证,完成后可以使用用户名和密码身份验证运行本地集群。
开启节点xpack认证
代码语言:javascript复制xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
single-node 参数(可选)
在 elasticsearch.yml 文件中添加single-node 参数,保证单节点运行该节点不会无意中连接到网络上运行的其他elastic集群。
代码语言:javascript复制discovery.type: single-node
1,elastic 单节点认证配置
代码语言:javascript复制cluster.name: es-cluster
node.name: es-node01
node.master: true
node.data: true
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
cluster.initial_master_nodes: ["es-node01"]
注意
①elastic存储目录权限需要修改
②如果集群有多个节点,那么必须在节点之间配置传输层安全性 (TLS)。如果不启用 TLS,生产模式集群将不会启动。
重新启动 Elasticsearch
代码语言:javascript复制systemctl restart elasticsearch
2,内置用户创建密码
使用auto参数将随机生成的密码输出到控制台
代码语言:javascript复制./bin/elasticsearch-setup-passwords auto
使用interactive参数 自定义密码
代码语言:javascript复制./bin/elasticsearch-setup-passwords interactive
注意:使用elasticsearch-setup-passwords 脚本创建内置用户,内置用户设置密码后,无法再次运行elasticsearch-setup-passwords 。
报错处理
elasticsearch-setup-passwords 创建内置用户报错
代码语言:javascript复制Failed to determine the health of the cluster running at http://10.9.80.181:9200
Unexpected response code [503] from calling GET http://10.9.80.181:9200/_cluster/health?pretty
Cause: master_not_discovered_exception
It is recommended that you resolve the issues with your cluster before running elasticsearch-setup-passwords.
It is very likely that the password changes will fail when run against an unhealthy cluster.
Do you want to continue with the password setup process [y/N]ERROR: User cancelled operation
解决办法
出现以上错误,可能由于之前已经运行了一次elasticsearch-setup-passwords脚本,存在脏数据导致。此时可以停掉es,删除 data 数据目录,然后重新启动再进行操作。
或则尝试
删除 .security-7 索引,然后重新执行上面命令即可,不用重启es集群。
elastic 集群安全认证
输层安全性 (TLS)
传输层处理集群中节点之间的内部通信。集群中每个节点之间都需要配置 TLS。如果不启用 TLS,集群将无法启动。传输层依赖于双向 TLS 来加密和验证节点。正确配置TLS 可确保恶意节点无法加入集群并与其他节点交换数据。虽然在 HTTP 层实现用户名和密码认证对于保护本地集群很有用,但集群节点之间的通信安全需要 TLS。
在安全集群中,Elasticsearch 节点在与其他节点通信时使用证书来标识自己。集群必须验证证书的真实性。推荐的方法是信任特定的证书颁发机构 (CA)。当节点添加到您的集群时,必须使用由同一 CA 签署的证书。对于传输层,建议使用单独的专用 CA,以便严格控制节点成员资格。
1,elasticsearch-certutil 工具为集群生成 CA证书
代码语言:javascript复制./bin/elasticsearch-certutil ca
2,为集群中的节点生成证书和私钥
代码语言:javascript复制./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
输出名为 elastic-certificates.p12 的文件,该文件包含节点证书、节点密钥和 CA 证书。
移动证书文件到指定目录并指定权限
代码语言:javascript复制cd /usr/share/elasticsearch/bin/
mv elastic-certificates.p12 elastic-stack-ca.p12 /etc/elasticsearch/
#添加elasticsearch组权限
chgrp elasticsearch /etc/elasticsearch/elastic-certificates.p12 /etc/elasticsearch/elastic-stack-ca.p12
#修改文件权限640
chmod 640 /etc/elasticsearch/elastic-certificates.p12 /etc/elasticsearch/elastic-stack-ca.p12
拷贝证书文件其他 es 节点
在集群中的每个节点上,将 elastic-certificates.p12文件复制对应的目录下
代码语言:javascript复制cd /etc/elasticsearch
scp elasticsearch.keystore elastic-certificates.p12 elastic-stack-ca.p12 root@es-node02:/etc/elasticsearch/
scp elasticsearch.keystore elastic-certificates.p12 elastic-stack-ca.p12 root@es-node03:/etc/elasticsearch/
3, TLS加密节点配置
代码语言:javascript复制xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
elasticsearch-keystore(可选)
在创建节点证书时输入了密码,则需要运行以下命令将密码存储在 Elasticsearch keystore 密钥库中
代码语言:javascript复制./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
elastic 集群认证配置
代码语言:javascript复制root@node1:/opt# egrep -v "*#|^$" /etc/elasticsearch/elasticsearch.yml
cluster.name: es-cluster
node.name: es-node01
node.master: true
node.data: true
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 192.168.10.33
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["192.168.10.33","192.168.10.37"]
cluster.initial_master_nodes: ["192.168.10.33"]
xpack.security.enabled: true
xpack.security.audit.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/elastic-certificates.p12
注意:除了node.name和network.host 使用各自主机名和IP之外,其他配置都一样。
重新启动 Elasticsearch
代码语言:javascript复制systemctl restart elasticsearch
kibana 认证连接
开启了elastic安全认证之后,kibana连接es以及访问es都需要认证。变更kibana的配置,一共有两种认证配置方法,一种明文的,一种密文的。
1,明文配置
代码语言:javascript复制root@node1:/etc/logstash# egrep -v "*#|^$" /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.10.33"
server.name: "192.168.10.33"
elasticsearch.hosts: ["http://192.168.10.33:9200"]
kibana.index: ".kibana"
elasticsearch.username: "elastic"
elasticsearch.password: "password"
i18n.locale: "zh-CN"
- elasticsearch.username:连接es的用户名。
- elasticsearch.password:连接es的密码。
2,密文配置
推荐使用密文的方式进行认证,认证之前,需要首先将用户名密码保存到内置的kibana-ketstore里。
代码语言:javascript复制#在kibana目录下生成kibana.keystore文件
/usr/share/kibana/bin/kibana-keystore create
#添加elasticsearch.username
/usr/share/kibana/bin/kibana-keystore add elasticsearch.username
#添加elasticsearch.password
/usr/share/kibana/bin/kibana-keystore add elasticsearch.password
#查看kibana-keystore 列表
代码语言:javascript复制/usr/share/kibana/bin/kibana-keystore list
#移除elasticsearch.username
代码语言:javascript复制/usr/share/kibana/bin/kibana-keystore remove elasticsearch.username
kibana 配置
代码语言:javascript复制server.port: 5601
server.host: "192.168.10.33"
server.name: "192.168.10.33"
elasticsearch.hosts: ["http://192.168.10.33:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"
重启kibana即可访问,访问的时候使用elastic的用户密码登入,将是全局管理权限,如果需要创建kibana的只读用户,则可以通过管理–用户–新建用户,对用户进行角色授权即可。
logstash配置认证
打开自定义的logstash的配置文件logstash.conf,在output中增加elasticsearch的用户名和密码。
代码语言:javascript复制input {
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => ["192.168.10.33:9200"]
user => "elastic"
password => "password"
}
}
官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/configuring-tls.html#configuring-tls
https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-keystore.html
https://www.elastic.co/guide/en/kibana/current/secure-settings.html