Elasticsearch 7.X Basic Security

2021-08-23 16:46:43 浏览数 (1)

背景

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

0 人点赞