Logstash to ES 开启权限认证 (x-pack)

应用场景阐述:
本文记录一次解决ElasticSearch开启x-pack安全认证后,logstash无法发送数据至 ES 存储的解决方法。
版本为 logstash-6.8.0、elasticsearch-6.8.0

一、先决条件
首先我们需要 logstash 和 es集群环境,且配置好了 hosts文件映射主机名
例如:vim etc/hosts
#es三个节点
pc1 10.20.10.1
pc2 10.20.10.2
pc3 10.20.10.3
logstash-node-1 10.20.10.4
二、开启安全认证
在es主节点的配置文件中(elasticsearch.yml)加入以下一行配置,并重启es,目的是开启安全认证

xpack.security.enabled: true

做完这一步,最基本的安全认证,用户名、密码验证 就配置好了,浏览器访问 http://pc1:9200/ 就会要求输入用户名密码来访问es了

三、设置ES内置用户及密码

1、在Elasticsearch安装目录中运行命令:
./bin/elasticsearch-setup-passwords interactive,
回车之后为每一个用户设置独立的密码。前提是 ES必须为启动状态。
2、你需要在后续步骤中使用这些内置用户,因此务必牢记前面设置的密码!

四、生成我们所需的证书
ca证书:我们需要PKCS#12类型的证书

*注意:这里说明一下  参数  --dns 是指定 为哪一个 节点 生成证书 --name 是 为生成的证书 指定名字* 
第一条命令:bin/elasticsearch-certutil ca
第二条命令:bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc1
1、执行下面的第一条命令生成根证书,一路回车!会得到elastic-stack-ca.p12

2、执行第二条命令,一路回车!会得到节点 pc1 的节点证书 pc1.p12
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc1 --name pc1
同理:执行
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc2 --name pc2 
会得到 pc2 节点的 证书 pc2.p12
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns pc3 --name pc3
会得到 pc3 节点的 证书 pc3.p12
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --dns logstash-node-1 --name logstash-node-1
会得到  logstash-node-1 节点的 证书 logstash-node-1.p12

重点1:
logstash 不能够直接使用 PKCS#12类型的证书!
logstash 不能够直接使用 PKCS#12类型的证书!
logstash 不能够直接使用 PKCS#12类型的证书!
所以我们需要 第三种命令,去 logstash-node-1.p12 的证书中提取 pem证书

openssl pkcs12 -in logstash-node-1.p12 -clcerts -nokeys -chain -out ca.pem
执行后会得到logstash使用的pem证书,名为 ca.pem

将各自节点的证书 放置在 es的 config 路径下,我这里是在每一个节点的 config/ 创建了 一个文件夹 叫 xp , 证书放置在 xp 文件夹下。
重点2
修改 证书 的 权限,确保 es 节点 可以访问 自己的 证书

chown -R es:es ./xp/

重点3
将logstash 所需 的 证书 ca.pem 放置在 logstash的安装目录中的 config 下 ,并修改 其权限为 600,也是为了保证logstash对其有操作权限,我这里 也是 在 config下 创建了 一个文件夹 叫 xp,将ca放到 xp 下。

chmod 600 ./ca.pem

五、配置es的 SSL/TLS (在各个es节点的 elasticsearch.yml 文件中)
es主节点 pc1 的配置: 用我们生成的 pc1 节点的 证书

#跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

#开启权限认证后,es-head-master访问es 需要的配置
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

#开启权限认证,上面我们配置过了
xpack.security.enabled: true

# SSL/TLS 节点间通讯,xp 为 es的安装目录 config下 新建的一个文件夹
xpack.security.transport.ssl.enabled: true
xpack.ssl.keystore.path: xp/pc1.p12
xpack.ssl.truststore.path: xp/pc1.p12
#mode设置为 certificate 当设置为 full的时候 会验证 dns 和 ip 没有设置dns和ip 会报错client did not trust this server’s certificate
xpack.ssl.verification_mode: certificate
xpack.ssl.client_authentication: required

#用HTTPS方式访问es,即logstash 发送数据至 es 的 方式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: xp/pc1.p12
xpack.security.http.ssl.truststore.path: xp/pc1.p12
xpack.security.http.ssl.verification_mode: certificate

es从节点 pc2 的配置: 用我们生成的 pc2 节点的 证书

# SSL/TLS 节点间通讯,xp 为 es的安装目录 config下 新建的一个文件夹
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: xp/pc2.p12
xpack.security.transport.ssl.truststore.path: xp/pc2.p12

#用HTTPS方式访问es,即logstash 发送数据至 es 的 方式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: xp/pc2.p12
xpack.security.http.ssl.truststore.path: xp/pc2.p12
xpack.security.http.ssl.verification_mode: certificate

es从节点 pc3 的配置: 用我们生成的 pc3 节点的 证书

# SSL/TLS 节点间通讯,xp 为 es的安装目录 config下 新建的一个文件夹
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: xp/pc3.p12
xpack.security.transport.ssl.truststore.path: xp/pc3.p12

#用HTTPS方式访问es,即logstash 发送数据至 es 的 方式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: xp/pc3.p12
xpack.security.http.ssl.truststore.path: xp/pc3.p12
xpack.security.http.ssl.verification_mode: certificate

重启es集群后, 此时用 http请求去访问 es 将会失效,应改为https方式去访问:https://pc1:9200/_cat/nodes
如果可以看到 集群的所有节点信息,说明我们的 节点间通讯配置正确!

六、配置logstash
logstash的配置包括两部分:
1、logstash.yml

xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: 你之前设置的password

#这里必须用 https 这里必须用 https 这里必须用 https
xpack.monitoring.elasticsearch.hosts: "https://pc1:9200"
#你的ca.pem 的所在路径
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/opt/logstash-6.8.0/config/xp/ca.pem"
xpack.monitoring.elasticsearch.ssl.verification_mode: certificate
# 探嗅 es节点,设置为 false
xpack.monitoring.elasticsearch.sniffing: false

2、logstash.conf

output {
    stdout {codec => rubydebug}
    elasticsearch{
      template_name => "xxx-alarm"
      hosts => ["pc1:9200"]
      #document_type => "alarm"   这里我为了测试方便,没有设置模板
      #不配置模板 es 会自动分配 logstash 模板给用 ,这里只要能区分出来 数据是否流入 就可以了
      #index => "<xxx-alarm-{now/d}>"
      user => "logstash_system"
      password => "你的密码"
      ssl => true
      #pem 证书的 所在路径
      cacert => '/opt/logstash-6.8.0/config/xp/ca.pem'
    }
}

七、开启x-pack后,es-head-master访问方式:

http://headIP:9100/?base_uri=https://ESIP:9200&auth_user=elastic&auth_password=yourPwd

上图:数据已经成功输出到 es在这里插入图片描述
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LSY929981117/article/details/107714001

猜你喜欢

转载自blog.csdn.net/LSY929981117/article/details/107714001