Elasticsearch 8.4.1 配置自签名证书和启用Https

一、背景

某次安全扫描过程中,发现环境存在【SSL证书不可信】和【SSL自签名证书】漏洞;漏洞描述:

此服务的X.509证书链未由认可的证书颁发机构签名。如果远程主机是生产中的公共主机,这将取消SSL的使用,因为任何人都可以对远程主机建立中间人攻击。

无法信任服务器的X.509证书。这种情况可能以三种不同的方式出现,在这种情况下,信任链可能会断开,如下所述:-首先,服务器发送的证书链的顶部可能不是已知的公共证书颁发机构的后代。如果链的顶部是无法识别的自签名证书,或者缺少将证书链的顶部连接到已知公共证书颁发机构的中间证书,则可能会发生这种情况。-其次,证书链可能包含扫描时无效的证书。当扫描发生在证书的“notBefore”日期之一之前或证书的“notAfter”日期之一之后时,可能会发生这种情况。-第三,证书链可能包含与证书信息不匹配或无法验证的签名。错误的签名可以通过使具有错误签名的证书由其颁发者重新签名来修复。无法验证的签名是证书颁发者使用Nessus不支持或不识别的签名算法的结果。如果远程主机是生产中的公共主机,则链中的任何中断都会增加用户验证web服务器的真实性和身份的难度。这样可以更容易地对远程主机执行中间人攻击。

涉及主机:ES的9200端口;版本:Elasticserach 8.4.1;Kibana:8.4.1

修复建议:购买或生成此服务的正确SSL证书。

二、配置自签名证书和启用HTTPS

1)配置使用自签名证书

注意:如果已有单节点es,想要将其转换升级为集群,必须要删除/data下的node数据,即清空data中的信息;配置证书仅在集群的第一台服务器node-01执行即可,其他服务器直接复制;elasticsearch生成证书有两种方式,elasticsearch-certgen 方式和elasticsearch-certutil方式,其中,第一种方式如果以后新增节点导致证书得重新生成并放到es所有节点,一般我们使用第2种;如下所示:
在这里插入图片描述
在这里插入图片描述

# 第一种方式
./elasticsearch-certgen
……
Let's get started...

Please enter the desired output file [certificate-bundle.zip]: cert.zip  (需要输入生成的压缩包名称)
Enter instance name: my-application(需要输入实例名)
Enter name for directories and files [p4mES]: elasticsearch(需要输入文件夹名)
Enter IP Addresses for instance (comma-separated if more than one) []: 127.0.0.1  (实例ip,多个ip用逗号隔开,输入集群所有节点的IP)
Enter DNS names for instance (comma-separated if more than one) []: node-1(节点名,多个节点用逗号隔开,输入所有的节点名称)
Would you like to specify another instance? Press 'y' to continue entering instance information: 
Certificates written to /usr/local/elasticsearch/bin/cert.zip(这个是生成的文件存放地址,不用填写,在哪个目录下执行elasticsearch-certgen就会生成在哪个目录,不要在/usr/local/elasticsearch/bin下执行elasticsearch-certgen,否则你上面需要填写文件夹时不能写elasticsearch,因为解压时和elasticsearch命令冲突)

This file should be properly secured as it contains the private keys for all
instances and the certificate authority.

After unzipping the file, there will be a directory for each instance containing
the certificate and private key. Copy the certificate, key, and CA certificate
to the configuration directory of the Elastic product that they will be used for
and follow the SSL configuration instructions in the product guide.

For client applications, you may only need to copy the CA certificate and
configure the client to trust this certificate.

#把生成的zip包解压,将里面的ca.crt、ca.key、elasticsearch.crt、elasticsearch.key放到/usr/local/elasticsearch/config目录下,然后修改elasticsearch.yml添加以下内容:


#本处采用通过的elasticsearch-certutil方式
cd /usr/local/elasticsearch-8.4.1/bin
#签发ca证书:输入证书文件名、密码,一般我们直接回车就行,命令执行完后,会在elasticsearch-8.4.1目录下生成一个ca证书:elastic-stack-ca.p12
./elasticsearch-certutil ca  //如果全默认的,会生成elastic-stack-ca.p12文件
./bin/elasticsearch-certutil ca --pem --out ca.zip --days 36500 -s  ## 会生成ca.zip文件
unzip ca.zip  //解压后有2个文件
openssl x509 -in ca/ca.crt -noout -dates    ## 查看证书有效期,输出如下
notBefore=Nov  25 02:15:46 2022 GMT
notAfter=Nov 1 02:15:46 2122 GMT
#生成第二个证书文件:elastic-certifacates.p12
./elasticsearch-certutil cert --ca elastic-stack-ca.p12

#将证书拷贝到config配置目录下
mkdir config/certs
cp ca/* config/certs/
ls ./config/certs/    #scp config/certs/* xxxx拷贝到集群其他节点


#elasticsearch在6.3版本之后x-pack是默认安装好的,所以不再需要用户自己去安装,es启动后直接启用即可;堆积集群配置,ES8版本的参数改变role.data:true不再使用,改为node.roles:

vim ./config/elasticsearch.yml
# 添加如下变量
## ssl
xpack.security.enabled: true  ##x-pach安全验证
xpack.security.enrollment.enabled: true
#xpack.security.transport.ssl.enabled: true  #开启ssl
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.key: certs/ca.key
#xpack.security.transport.ssl.certificate: certs/ca.crt
#xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
# 生成ca证书
xpack.security.http.ssl:
	enabled: true
	keystore.path: certs/http.p12
xpack.security.transport.ssl:
	enabled: true
	verification_mode: certificate
	keystore.path: certs/elastic-certificates.p12
	truststore.path: certs/elastic-certificates.p12

在这里插入图片描述
在这里插入图片描述

配置参考:Update certificates SSLAPI

xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12
xpack.security.transport.ssl.keystore.type: PKCS12
xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12
xpack.security.transport.ssl.truststore.type: PKCS12
xpack.security.transport.ssl.verification_mode: certificate

2)启用HTTPS

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: /usr/local/elasticsearch-8.4.1/config/certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path:  /usr/local/elasticsearch-8.4.1/config/certs/elastic-certificates.p12

openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem
vim kibana.yml
elasticsearch.ssl.certificateAuthorities: ["path/elastic-ca.pem"]
elasticsearch.ssl.verificationMode: certificate

3)配置密码

# 自动生成密码(二选一)
/usr/local/elasticsearch/bin/elasticsearch-setup-passwords auto
# 手动生成密码(二选一)
/usr/local/elasticsearch/bin/elasticsearch-setup-passwords interactive
#创建license.json
{
    
    
    "license": {
    
    
        "uid": "9gfhf46-5g78-4f1e-b5a4-afet359bc3a3",
        "type": "platinum",
        "issue_date_in_millis": 1534723200000,
        "expiry_date_in_millis": 2544271999999,
        "max_nodes": 100,
        "issued_to": "www.plaza4me.com",
        "issuer": "Web Form",
        "signature": "AAAAAwAAAA3lQFlr4GED3cGRsdfgrDDFEWGN0hjZDBGYnVyRXpCOsdfasdfsgEfghgdg3423MVZwUzRxVk1PSmkxagfsdf3242UWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01VMFRjNDZpZEVXeUtUMXIyMlIveFpJUkk2WUdveEZaME9XWitGUi9WNTZVQW1FMG1DenhZU0ZmeXlZakVEMjZFT2NvOWxpZGlqVmlHNC8rWVVUYzMwRGVySHpIdURzKzFiRDl4TmM1TUp2VTBOUlJZUlAyV0ZVL2kvVk10L0NsbXNFYVZwT3NSU082dFNNa2prQ0ZsclZ4NTltbU1CVE5lR09Bck93V2J1Y3c9PQAAAQCGcZtOlZwj0Rnl2MUjERG94a+xcifpVAurIA+z4rroxaqaewpb2MJLZVJt1ZCGeKB0KIWRAm2pkPjM2JigjaPIUBhpW4/yUzbdRtRuQB4loEKd7/p9EbHDh5GzeI8qfkMh3j7QaAlz4Bk+eett+ZNqNXHEdkr+Re9psdnqfUESz1uROhMoYWbn/Bdd0AJLKzhRnEOE972xdnAar8bCP1DIDljI9IOnYhEc6O6CboKCMJY4AWOvJY83bud4FO25hrKf6bMy0F2oO2yUkVV0UiFMX19JbhcC+WIAgxMk/KG7e/MqR8bJ1jNu2usMlgkvV97BxiPogTujFnTQxoHdpNdR",
        "start_date_in_millis": 1534723200000
    }
}
#上传license
curl -XPUT -u elastic 'http://127.0.0.1:9200/_xpack/license' -H "Content-Type: application/json" -d @license.json
#配置kibana
cd /usr/local/kibana/config
vim kibana.yml  #如下将你的密码配置

elasticsearch.username: kibana
elasticsearch.password: XXXXXXXXXXX
#验证
访问kibana在登陆成功后的主页面Management->LicenseManagement查看确认

#生产kibana证书
openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem

vim kibana.yml

server.host: 0.0.0.0   
elasticsearch.hosts: ["https://10.10.10.10:9200"]  // ip 替换成自己的ip
elasticsearch.username: kibana
elasticsearch.password: 111   // 密码替换成自己在上边生成的密码
elasticsearch.ssl.certificateAuthorities: ["path/elastic-ca.pem"]   //path替换成 pwd 查看出来的路径,也就是我们生成的 elastic-ca.pem 证书的路径
elasticsearch.ssl.verificationMode: certificate
#重启kibana
./kibana > kibana.log &

4)部署配置补充

ES8.x版本中自带了jdk,所以无需安装也可以正常运行ES;第一次启动后,可访问https://10.230.36.35:9200,初始账号为elastic;修改密码可执行:

./elasticsearch-reset-password --username elastic -i

集群配置参考:

# 配置集群名称,保证每个节点的名称相同,如此就能都处于一个集群之内了
cluster.name: es-clusters

# 每一个节点的名称,必须不一样
node.name: es-node1

# http端口(使用默认即可)
http.port: 9200

# 主节点,作用主要是用于来管理整个集群,负责创建或删除索引,管理其他非master节点(此外,每一个es几点都要配置该信息,因为只有该信息配置为true的节点,才有机会在主节点挂掉之后成为新的master,如果为false,就相当于该节点在任何情况下都不可能成为master)es8之后使用node.roles
#node.master: true
# 数据节点,用于对文档数据的增删改查
#node.data: true
# 注意至少有两个具有选举master资格的节点
node.roles: [data, master]

# 集群列表
discovery.seed_hosts: ["192.168.xx.xxx", "192.168.xx.xxx", "192.168.xx.xxx"]

# 启动的时候使用一个master节点(当前节点的节点名称)
cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"]
action.destructive_requires_name: false

#启用系统索引自动创建
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*
# 证书相关
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: none
xpack.security.transport.ssl.keystore.path: /usr/local/es/elasticsearch-8.4.1/config/certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/local/es/elasticsearch-8.4.1/config/certs/elastic-certificates.p12
ingest.geoip.downloader.enabled: false

软件下载:elasticsearch往期版最新版elasticsearch–8.4.1elasticsearch–8.4.1文档

kibana安装:https://www.elastic.co/cn/downloads/kibana
IK分词器安装:https://github.com/medcl/elasticsearch-analysis-ik,在release里面下载,不是下载源码,下载完成之后解压放入ES的插件即可,然后重新启动ES;

5)可视化界面

Head插件项目地址:Nodejs项目地址,先安装node.js再安装head;

三、附录

X.509 是一种证书标准,主要定义了证书中应该包含哪些内容。其详情可以参考RFC5280,SSL使用的就是这种证书标准。而我们常见的PEM就是一种编码格式,目前常见最多的两种编码/数据格式有:PEM(Privacy Enhanced Mail,)和 DER (Distinguished Encoding Rules);

PEM,是一种文本格式,它以”——-BEGIN…”开头”——-END…”结尾,内容以BASE64编码, 它是由RFC1421至1424定义的一种数据格式。 查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout; Apache和Nginx服务器偏向于使用这种编码格式。linux中我们一般生成的.cert和.key文件都是PEM格式的;一个PEM文件可以包含公钥证书/私钥/或者能形成证书链的多个证书,PEM文件的后缀可以是:.crt, .pem, .cer, and .key

DER(Distinguished Encoding Rules) :其是二进制格式,不可读。 查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout; Java和Windows服务器偏向于使用这种编码格式。DER 文件是公钥证书或者私钥通过DER编码以后生成的二进制文件,通常后缀为der或cer;一般都是使用key/crt进行DER编码,生成二进制文件(DER),然后对二进制文件再Base64编码,即可以生成ASCII码文件(PEM),最后生成cer文件。

其他相关:

CRT(Certificate Revocation List证书吊销列表):常见于Nginx系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码。*.crl

CER(windows中对应证书格式):常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码。

KEY:通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER。 查看KEY的办法:openssl rsa -in mykey.key -text -noout; 如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

CSR(Certificate Signing Request证书签名请求):即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥, 查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)

PFX/P12(predecessor of PKCS#12):对Nginx服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,这个文件包含了证书及私钥,PFX通常会有一个”提取密码”,读取内容的时候,需要提供提取密码才可访问,PFX使用的是DER编码,如何把PFX转换为PEM编码? openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes;这个时候会提示你输入提取代码. for-iis.pem就是可读的文本,生成pfx的命令类似这样:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx -certfile CACert.crt,其中CACert.crt是CA(权威证书颁发机构)的根证书,通过-certfile参数使用;我们也可以这里理解,PFX其实是个证书密钥库。PKCS#12文件是含有多个证书,形成证书链,后缀为.p12或者 pfx;

JKS(Java Key Storage):这是Java的专用的,跟OpenSSL关系不大,它利用Java的一个叫”keytool”的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS。 证书编码的转换 PEM转为DER执行:openssl x509 -in cert.crt -outform der -out cert.der;

DER转为PEM:openssl x509 -in cert.crt -inform der -outform pem -out cert.pem (提示:要转换KEY文件也类似,只不过把x509换成rsa,要转CSR的话,把x509换成req…)

获得证书:向权威证书颁发机构申请证书,执行:openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr;然后把csr交给权威证书颁发机构,权威证书颁发机构对此证书进行签名,当权威证书颁发机构颁发的证书过期时,我们可以用之前同样的csr来申请新的证书,key保持不变;或者生成自签名的证书,执行:openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem;在生成证书的过程中会要你填一堆的东西,其实真正要填的只有Common Name,通常填写你服务器的域名,或者你服务器的IP地址,其它都可以留空的。 生产环境中不建议使用自签的证书,可向域名厂商申请证书。CA颁发证书过程如下:

在这里插入图片描述

1、申请者使用自己的身份与公钥生成CSR文件(certificate signing request),请求CA给自己颁发用CA私钥签名过的证书;
2、CA验证申请者身份;
3、CA使用自己的私钥,对申请者的身份、公钥做摘要,并对摘要进行签名,附在身份、公钥之后,生成证书;
4、其他用户在与SSL证书拥有者通信时,使用CA的公钥验证证书上的签名是CA私钥签的,从而确定身份与公钥是发送者本人的,而非经过第三方修改(中间人攻击)。

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/128034565
今日推荐