天天看點

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 8.4.1 配置自簽名證書和啟用Https
Elasticsearch 8.4.1 配置自簽名證書和啟用Https
# 第一種方式
./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

           
Elasticsearch 8.4.1 配置自簽名證書和啟用Https
Elasticsearch 8.4.1 配置自簽名證書和啟用Https

配置參考: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;修改密碼可執行:

叢集配置參考:

# 配置叢集名稱,保證每個節點的名稱相同,如此就能都處于一個叢集之内了
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.1;elasticsearch–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頒發證書過程如下:

Elasticsearch 8.4.1 配置自簽名證書和啟用Https

1、申請者使用自己的身份與公鑰生成CSR檔案(certificate signing request),請求CA給自己頒發用CA私鑰簽名過的證書;

2、CA驗證申請者身份;

3、CA使用自己的私鑰,對申請者的身份、公鑰做摘要,并對摘要進行簽名,附在身份、公鑰之後,生成證書;

4、其他使用者在與SSL證書擁有者通信時,使用CA的公鑰驗證證書上的簽名是CA私鑰簽的,進而确定身份與公鑰是發送者本人的,而非經過第三方修改(中間人攻擊)。

繼續閱讀