Elasticsearch(16) — 建立ES自簽憑證

Tako
5 min readSep 21, 2024

--

ES 自簽憑證不算太難,但也搞了很久,但後來發現還是照官網教的會比較順,就是簽成 p12 的形式。這篇是記錄產 ca 的方法,接著才是把 ca 放到對的地方

  • rootCA、伺服器憑證

首先,憑證中的 rootCA 要是合法的憑證核發機構,但 Elasticsearch 可以用套件中的方法實作出 rootCA,就不需要再去給合法機構簽發

而 Elasticsearch、Kibana、Logstash 會依這張 rootCA 再去簽發伺服器憑證,原因是不該使用 rootCA 進行認證,有點像是保護的功能,若是伺服器憑證被破解,大不了再重產一張,但 rootCA 被破解,就是整個 ES 重產一張,這樣會很麻煩

然後還要產一張 Fleet-server 那邊專用的憑證,主要原因是通常 ELK + elastic-agent 的,如果全部共用一張時,當擴 ES 節點時,新節點無法被舊憑證所認可,因此要重新簽新憑證,但當 Elastic-agent 很多的時候,就會很麻煩,所以會是 Fleet-server 那裡自己一張

  • 製作 rootCA

要先到安裝的 Elasticsearch 的那台上,我是使用 tarball 安裝,執行elasticsearch-certutil ,選擇 ca mode

# 產生一張 10 年效期的 rootCA
/home/elk/ES/bin/elasticsearch-certutil ca --days 3650

我的 workdir 在 /home/elk/ES 下,在其下會產生一個 zip 檔,可以解壓縮它,就拿到一個 p12 檔了

p12 檔是公鑰 + 私鑰,然後用 password 才能進行解碼,會建議在建 rootCA 時,先不設定密碼

然後是把 rootCA.p12 分解成 crt, key,會在後續用到,使用下方的 openssl 指令,p12 跟 crt 檔是後續需要的

# bash
openssl pkcs12 -in rootCA.p12 -out rootCA.crt -nokeys -clcerts
openssl pkcs12 -in rootCA.p12 -out rootCA.key -nocerts -nodes
  • 製作 ELK 間的通訊 CA

接著,要根據 rootCA 建立 ELK 間的 TLS CA,至於為什麼是 TLS 會在其它文章說明

首先要先確認適用的網域,一般來說不知道的話就把 ELK 的 ip 都寫進去,按照 ELK 的官網的話,要先建立一個 yml,然後把 ELK 的對應 ip 或是 FQDN 都輸入進去

# ssl.yml
instances:
- name: "my-cluster"
ip:
- "172.16.1.205"
- "172.16.1.206"
- "172.16.1.207"

我只寫了 ES 節點的 IP,試想 Kibana 跟 Logstash 只是要跟 ES 溝通,但 ES 沒有請求 Kibana、Logstash 的需要,所以只要在 Kibana、Logstash請求時,能把 ES 節點認定為憑證認可的對象即可,所以才只寫 3 個 ES 節點

然後就是根據這個 yml 產出伺服器憑證,執行 elasticsearch-certutil ,選擇 cert mode,要選擇 ssl.yml,並帶入原本的 rootCA.p12

# 產出一張 10 年效期的伺服器憑證
/home/elk/ES/bin/elasticsearch-certutil cert -in /elk/ssl/ssl.yml --days 3650 --ca /home/elk/ES/config/certs/rootCA.p12

在 /home/elk/ES 的下面,一樣會有 p12 檔,將其分解成 crt, key

# bash
openssl pkcs12 -in elastic.p12 -out elastic.crt -nokeys -clcerts
openssl pkcs12 -in elastic.p12 -out elastic.key -nocerts -nodes
  • Fleet-server 用憑證

使用下方指令來產生 Fleet-server 用 CA,執行 elasticsearch-certutil ,選擇 cert mode,並帶入 rootCA.crt, rootCA.key,這裡應該可以用 p12 檔去產,但沒有研究

我這裡裝在某個 ES 節點上是因為那個節點跟 Fleet-server共用,若是 Fleet-server 是其它台,就要填那台的 IP 跟 FQDN

# 產出一張 10 年效期的伺服器憑證
/home/elk/ES/bin/elasticsearch-certutil cert --name fleet-server --ca-cert /home/elk/ES/config/certs/rootCA.crt --ca-key /home/elk/ES/config/certs/rootCA.key –dns <FQDN> --ip 172.16.1.206 –pem –days 3650

在 /home/elk/ES 的下面,一樣會有 p12 檔,將其分解成 crt, key

# bash
openssl pkcs12 -in fleet-server.p12 -out fleet-server.crt -nokeys -clcerts
openssl pkcs12 -in fleet-server.p12 -out fleet-server.key -nocerts -nodes

下一篇應該是換憑證,換憑證算簡單,但 Openssl 做的憑證還是接不上去啊幹,有夠難受

參考資料:

  1. Elasticsearch — Set up basic security
  2. 公司資料

--

--