目标:对 ElasticSearch 进行安全性配置。连接输入端(Logstash)和输出端(Kibana)都需要用户身份验证。Filebeat 连接 Logstash 使用 ssl 验证。
启用ElasticSearch安全功能
使用基本许可证时,默认情况下禁用 Elasticsearch 安全功能。启用 Elasticsearch 安全功能可启用基本身份验证,以便可以使用用户名和密码身份验证运行本地集群。
1. 如果 Kibana 和 Elasticsearch 正在运行,需要停止后再进行操作。
2. 将xpack.security.enabled设置添加到ElasticSearch安装目录下config/elasticsearch.yml文件,并将值设置为true:
xpack.security.enabled: true
3. 如果集群只有一个节点,请discovery.type在 ES_PATH_CONF/elasticsearch.yml文件中添加设置并将值设置为single-node. 此设置可确保节点不会无意中连接到可能在网络上运行的其他集群。
discovery.type: single-node
为内置用户创建密码
要与集群通信,您必须为内置用户配置用户名。除非启用匿名访问,否则所有不包含用户名和密码的请求都会被拒绝。
进入bin目录后,启动 Elasticsearch
./elasticsearch
在另一个终端窗口中,通过运行该elasticsearch-setup-passwords实用程序为内置用户设置密码,
使用auto参数将随机生成的密码输出到控制台,您可以稍后根据需要进行更改:
./elasticsearch-setup-passwords auto
如果要使用自己的密码,请使用interactive参数而不是参数运行命令 auto。使用以下模式可指导完成所有内置用户的密码配置
./elasticsearch-setup-passwords interactive
生成的密码,需要自行进行保存。
配置Kibana连接到ElasticSearch
启用 Elasticsearch 安全功能后,用户必须使用有效的用户名和密码登录 Kibana。配置 Kibana 以使用之前创建的内置kibana_system用户和密码。此帐户不适用于个人用户,并且无权从浏览器登录 Kibana。相反,我们将以elastic超级用户身份登录 Kibana 。
1. 将elasticsearch.username设置添加到Kibana安装路径下config/kibana.yml 文件并将值设置为kibana_system用户:
elasticsearch.username: "kibana_system"
2. 从安装 Kibana 的 bin 目录中,运行以下命令以创建 Kibana 密钥库并添加安全设置:
a. 创建 Kibana 密钥库:
./kibana-keystore create
b. 将kibana_system用户的密码添加到 Kibana 密钥库:
./kibana-keystore add elasticsearch.password
出现提示时,输入kibana_system用户的密码。
最后,重启 Kibana 即可完成对 Kibana 的用户身份配置。
在重启 Kibana 后,访问 服务器外网ip:5605 ,显示登录页面:
使用超级用户 elastic 登录,即可进入Kibana首页。
配置Logstash连接到ElasticSearch
Logstash Elasticsearch 插件(输出、输入和过滤器)支持通过 HTTP 进行身份验证和加密。
若要将 Logstash 与安全集群一起使用,需要为 Logstash 配置身份验证凭据。如果身份验证失败,Logstash 会抛出异常并暂停处理管道。
首先需要在Logstash的配置文件中配置logstash的身份验证凭据。
进入 Logstash 安装目录下 /config,使用编辑器打开logstash.yml,加入以下内容:
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: 对应的密码
xpack.monitoring.elasticsearch.hosts: ["http://ES服务器外网IP:9200"]
除了为 Logstash 配置身份验证凭据外,还需要授予授权用户访问 Logstash 索引的权限。
Logstash 需要能够管理索引模板、创建索引以及在它创建的索引中写入和删除文档。要为 Logstash 设置身份验证凭据。
1. 创建一个 logstash_writer 角色,具有 manage_index_templates 群权限,和 write,delete 和 create_index 权限的 Logstash indices。
a. 可以从 Kibana 中的Management > Roles UI进行创建:
然后确认新建角色。
b. 可以通过Dev tools 中控制台,通过role API创建角色。输入并运行以下代码:
POST _xpack/security/role/logstash_writer
{
"cluster": ["manage_index_templates", "monitor"],
"indices": [
{
"names": [ "logstash-*" ],
"privileges": ["write","delete","create_index"]
}
]
}
出现以下返回信息,则表示创建成功。
2. 创建 logstash_internal 用户,并为其分配logstash_writer角色。
a. 可以从 Kibana 中的Management > Users UI 进行创建:
b. 可以通过Dev tools 中控制台,通过user API创建角色。输入并运行以下代码:
POST /_xpack/security/user/logstash_internal
{
"password" : "输入密码",
"roles" : [ "logstash_writer"],
"full_name" : "Internal Logstash User"
}
将 Logstash 配置为以刚创建的用户身份logstash_internal进行身份验证。
进入 Logstash 的输入输出配置文件 std.conf ,可以为每个 Elasticsearch 插件单独配置凭据。
output {
elasticsearch {
...
user => logstash_internal
password => 输入密码
}
}
完成配置文件的编写后,重启Logstash,运行无报错则成功连接到ElasticSearch。
Filebeat与Logstash配置ssl加密通信
为了保证应用日志数据的传输安全,我们可以使用SSL相互身份验证来保护Filebeat和Logstash之间的连接。这可以确保Filebeat仅将加密数据发送到受信任的Logstash服务器,并确保Logstash服务器仅从受信任的Filebeat客户端接收数据。
下面就讲述一下配置Filebeat与Logstash之间进行加密通信的方法。需要一个自签的CA证书,以及使用该CA证书签署的两份数据证书。一份是给Logstash作为server端验证自己身份时使用,一份是提供给Filebeat客户端验证自己身份时使用。
步骤
使用 Elasticsearch 提供的数字证书工具 elasticsearch-certutil 来制作需要的证书:
制作自签名 CA 证书,并为证书设置访问口令,进入 ElasticSearch 安装目录下/bin 中,创建 ssl 文件夹存放验证相关文件 ,默认输出文件名为elastic-stack-ca.p12:
./elasticsearch-certutil ca --out /home/elsearch/ELK/elasticsearch-7.13.4/ssl/elastic-stack-ca.p12
根据证书文件导出一份 CA 公钥文件,用于后续各配置文件中引用 CA 公钥时使用,进入刚创建的ssl文件夹执行:
openssl pkcs12 -clcerts -nokeys -in elastic-stack-ca.p12 -out ca.pem
使用自签名的CA签署生成一份logstash使用的数字证书,名字 logstash100(自定义,Logstash运行机为100代号):
./elasticsearch-certutil cert --ca /home/elsearch/ELK/elasticsearch-7.13.4/ssl/elastic-stack-ca.p12 --name logstash100 --dns logstash --ip Logstash运行机IP --pem --out /home/elsearch/ELK/elasticsearch-7.13.4/ssl/logstash100.zip
其中
- name为制作的证书名称
- dns为hosts文件解析后的地址
- ip为logstash程序所在主机ip
解压,解压后会各有一个.key和.crt后缀的文件,logstash 与 beats 启动 ssl 加密通信时,仅支持使用 PKCS8 的密钥格式 ,所以针对beats输入插件,将logstash.key转换为pkcs#8格式
unzip logstash100.zip
cd logstash100
openssl pkcs8 -in logstash100.key -topk8 -nocrypt -out logstash100.p8 #使用openssl转换生成PKCS8格式的密钥文件
对于制作的logstash.crt的证书,可以通过以下命令查看证书中的信息:
openssl x509 -in logstash100.crt -text
将证书文件部署到 Logstash 安装目录下。创建目录ssl用于存放证书,并把包括 logstash 证书和 ca 证书在内的文件部署于此:
创建文件夹后,将证书文件复制粘贴,包括ca.pem logstash100.crt logstash100.key logstash100.p8,该过程省略
安全起见,将以上文件权限调整为600
chmod 600 *
以上述同样的步骤为 Filebeat 服务生成数字证书
进入 ElasticSearch 安装目录下/bin 中
./elasticsearch-certutil cert --ca /home/elsearch/ELK/elasticsearch-7.13.4/ssl/elastic-stack-ca.p12 --name filebeats100 --dns filebeats --ip Logstash运行机IP --pem --out /home/elsearch/ELK/elasticsearch-7.13.4/ssl/filebeats100.zip
unzip filebeat100.zip
将证书文件部署到 Filebeat 安装目录下。创建目录ssl用于存放证书,并把包括 filebeat 证书和 ca 证书在内的文件部署于此:
创建文件夹后,将证书文件复制粘贴,包括ca.pem filebeat100.crt filebeat100.key,该过程省略
安全起见,将以上文件权限调整为600
chmod 600 *
配置 logstash和filebeat 使用 SSL
在 Logstash 配置文件std.conf的input内,加入以下内容:
beats {
port => "5045"
ssl => true
ssl_certificate_authorities => ["/root/elk7/logstash-7.13.4/ssl/ca.pem"]
ssl_key => "/root/elk7/logstash-7.13.4/ssl/logstash100.p8"
ssl_certificate => "/root/elk7/logstash-7.13.4/ssl/logstash100.crt"
ssl_verify_mode => "force_peer"
}
在 Filebeat 配置文件filebeat.yml中output处,加入以下内容:(原文件有该内容,解除注释后更改路径即可)
ssl.certificate_authorities: ["/home/resin2/elk/filebeat/ssl/ca.pem"]
ssl.certificate: "/home/resin2/elk/filebeat/ssl/filebeats100.crt"
ssl.key: "/home/resin2/elk/filebeat/ssl/filebeats100.key"
最后分别重启程序,无报错则配置成功。
本文章功能参考以下链接实现:
https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-minimal-setup.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-basic-setup.html