elasticsearch的安全通讯配置,官网文档说明比较零散,尤其是几种组件如kibana、fleetserver、各类agent、beat采用的处理方式都不一样,这里针对利用elasticsearch自带证书工具创建CA的方式,归集一下配置要点,希望能有所帮助。
一、基本知识
1、默认情况下,服务器将使用两个端口进行通讯,9300与9200:
9300,用于elasticsearch服务器集群内各服务器节点间的通讯。
9200,用于http通讯,各类restful客户端,例如kibana,浏览器直接访问、agent等等需要通过该端口与服务器连接。
2、如果首次使用yum或者rpm按装elasticsearch服务器,安装程序会自动进行安全配置,并生成几个安全配置需要的文件,如ca的keystore、用于http加密通讯的keystore(http.p12)等,这些最好保留下来,当然,你也可以用它提供的证书工具在后面自行创建。留意,如果不是首次安装,又希望系统再次自动生成安全配置,需要先把/var/lib/elasticsearch里的东西删除干净。
3、通过自动安全配置生成的几个文件会放在/usr/share/elasticsearch下:
elastic-stack-ca.p12 keystore文件,存储了ca的公共证书及用于签发其他证书的密钥。
transport.p12 包含了传输层密钥和证书,用于elasticsearch节点间加密通讯。
http.p12 这个keystore存储着http加密通讯需要的证书和密钥。
http_ca.crt 证书文件,用于集群内的http通讯加密。
二、配置要点(以下elasticsearch服务简称es服务器)
1、创建CA
(yum/rpm方式安装的es,其自带的工具都放在/usr/share/elasticsearch/bin里面。)
./elasticsearch-certutil ca
按提示操作即可,我这里选择了不改名字、不加密码。完成后该工具会在上一级文件夹(即/usr/share/elasticsearch)里生成elastic-stack-ca.p12文件。这个文件将用于签署其他证书,非常重要。
2、启用elasticsearch节点间加密通讯:
2.1、创建用于节点间加密的keystore
把上面的CA文件复制到需要加入集群的节点服务器,使用certutil工具生成节点keystore文件,如下:
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
按提示操作,为了方便,我没改默认文件名,但为了后面说明keystore工具的使用,我在这里添加了密码:abcdef
完成后生成keystore文件elastic-certificates.p12,里面包含了节点证书,节点密钥,以及CA的证书。
2.2、由于上面的文件加了密码,需要在本地的keystore里添加密码以便本节点elasticsearch进程可以读取,如下:
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
2.3、在/etc/elasticsearch文件夹里新建certs文件夹以方便后面对路径统一管理。把elastic-certificates.p12文件复制到每一个节点的certs目录。注意读取权限要分配给elasticsearch组(该组在yum/rpm方式安装时自动创建)。
2.4、在每一个节点上配置elasticsearch.yml文件
cluster.name: (集群名字,所有节点都要一致)
node.name: (节点名字 ,最好有规律方便自己记忆)
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/elastic-certificates.p12
truststore.path: certs/elastic-certificates.p112
3、启用elasticsearch服务器上的http加密通讯
3.1、使用工具生成用于http加密通讯的p12及pem文件。
./bin/elasticsearch-certutil http 下面会有一堆问题,我按如下配置:
创建CSR: 否
使用已创建CA:是
CA文件路径:/usr/share/elasticsearch/elastic-stack-ca.p12
CA文件密码:无密码
设置证书过期时间:可以按年月日计算,例如10y为10年,10d为10天,10m为10个月。
是否为每个节点创建独立的证书:否 (使用同一个证书。)
录入需要使用证书的机器名 (可以多个)
录入需要使用证书的IP (可以多个)
设置证书密码:abcdef
以上完成后将生成一个zip压缩文件。
3.2、解压文件,生成一个文件夹,里面包含两个文件夹,elasticsearch文件夹包含http.p12及elasticsearch.yml的配置参考,kibana文件夹包含elasticsearch-ca.pem及kibana.yml的配置参考。把http.p12复制到certs文件中。
3.3、同样,把上面keystore文件的密码加入到keystore中,
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
3.4、修改elasticsearch.yml以支持http通讯加密
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12
3.5、如果你没有记下内置的超级用户elastic的密码,这时可以重置一下它的密码:
./bin/elasticsearch-reset-password -u elastic
该工具会把重置密码显示在屏幕中,记下来。
3.6、此时,可以尝试在浏览器用https://你的elasticsearch服务器的地址:9200访问一下验证安全设置是否生效。
4、启用es服务器与kibana间的加密通讯
4.1、把上面的elasticsearch-ca.pem复制到kibana服务器。
4.2、修改kibana.yml
elasticsearch.ssl.certificateAuthorities: [ "文件路径/elasticsearch-ca.pem" ]
elasticsearch.ssl.verificationMode: certificate
4.3、重启kibana。
5、fleet server与es服务器的加密通讯
我的理解,fleet server实际上是一个agent,启用了特别的代理策略(fleet server policy)。在安装前,需要先准备几个加密通讯用到的文件,当然,你也可以使用--insecure参数跳过,但会带来一系列问题,因此,不建议使用--insecure参数。
5.1、fleet server加密通讯需要3个证书文件和一个密钥文件。你在kibana上添加fleet server时,可以在系统给出的脚本上看到,如下案例:
--certificate-authorities=<PATH_TO_CA> \ #用于连接到fleet server 的ca证书,即集群CA的证书。
--fleet-server-es-ca=<PATH_TO_ES_CERT> \ #用于连接到elasticsearch的证书,加密http通讯的证书。
--fleet-server-cert=<PATH_TO_FLEET_SERVER_CERT> \ # fleet server本身的证书,pem格式。
--fleet-server-cert-key=<PATH_TO_FLEET_SERVER_CERT_KEY> #fleet server本身的密钥。
5.1.1、这几个文件分别通过如下步骤创建:
A. 准备ca.crt及ca.key用于创建fleet-server-cert和fleet-server-cert-key:
openssl pkcs12 -in elastic-stack-ca.p12 -out ca.crt -clcerts -nokeys #生成ca.crt
openssl pkcs12 -in elastic-stack-ca.p12 -out ca.key -nocerts -nodes #生成ca.key
(ca.crt可直接用于参数--certificate-authorities=/路径/ca.crt)
B. 使用certutil工具生成fleet-server-cert和fleet-server-cert-key:
./bin/elasticsearch-certutil cert --name fleet-server --ca-cert 路径/ca.crt --ca-key 路径/ca.key
--dns 你的fleetserver服务器名字 --ip 你的fleetserver的IP --pem
完成后会生成一个zip压缩文件。解压该文件,得到fleet-server.crt和fleet-server.key
C. 生成参数 --fleet-server-es-ca所需文件,如前所述,实际上fleetserver一个特殊agent,因此它也是采用http与es服务器通讯,因此,我们要使用前面生成的keystore文件http.p12里面的证书:
openssl pkcs12 -in http.p12 -out elastic-ca.crt -clcerts -nokeys
生成elastic-ca.crt ,此文件用于通过https连接easticsearch服务器。
5.2、把上述文件复制到agent机器的某个路径,至此,安装fleet server所需的文件均已齐备,可以利用kibana界面提供的安装脚本进行安装了。
装完fleet server后,可能会出现agent状态正常,但是没有数据流传递到es服务器的现象,此时需要指定agent使用证书与es通讯,在kibana界面,fleet设置里编辑output,在“高级yaml编辑”加上
protocol: "https"
ssl:
certificate_authorities: "路径/agent用于与es服务器通讯的http证书"
verification_mode: "certificate"
或者,启用Fingerprint认证,在elasticsearch服务器上,获取http证书的fingerprint:
openssl x509 -in http_ca1.crt -sha256 -fingerprint | grep SHA256 | sed 's/://g'
获得后,在“高级yaml编辑”里,加上:
ssl.ca_trusted_fingerprint: 你的fingerprint。
这个方式比较简单些,不受证书文件路径格式限制,适合场合也多一点。
6、启用agent的加密通讯
与fleetserver类似,但只需要指定token(kibana上添加代理时会给出)和certificate_authorities即可,这里就略过了。建议注册到fleetserver,会简单很多。没必要使用standalone方式,那是自找麻烦,除非有很特殊的要求或者进行故障排查。
7、beat的加密通讯,这里以filebeat为例
把elastic-ca.crt复制到要安装beat的机器,正常安装beat后,修改filebeat.yml
output.elasticsearch:
hosts: ["https://你的es服务器IP:9200"]
protocol: "https"
ssl:
certificate_authorities: "路径/agent用于与es服务器通讯的http证书"
verification_mode: "certificate"