TLS應用在Elastic Statck:Elasticsearch,kibana,Beat和Logstash

原文作者:Jared Carey

本文翻譯BLOG,原文地址:https://www.elastic.co/blog/tls-elastic-stack-elasticsearch-kibana-logstash-filebeat

傳輸層安全性(TransportLayerSecurity,TLS)可以部署在整個Elastic Statck中,允許加密通信,這樣您就可以在夜間輕鬆地休息,因爲知道通過您的網絡傳輸的數據是安全的。這似乎不太必要,但是再次考慮不可能的情況,即確保沒有開發人員開始將敏感數據記錄到您要傳送到中心位置的日誌中。敏感數據大多數人認爲是客戶信息、密碼等。然而,對於我們所處的網絡安全時代來說,這種敏感數據的定義過於狹窄。假設有一個受威脅的路由器允許攻擊者窺視網絡上未加密的原始數據,在其中看到日誌數據可以提供網絡上使用的所有軟件的軟件和操作系統版本。這提供了攻擊者查找已知軟件漏洞所需的所有細節,這些漏洞可能允許攻擊者直接訪問這些服務器。整個組織的安全取決於最薄弱的環節,在當今網絡安全攻擊的世界裏-不要讓你的日誌/搜索系統成爲最薄弱的環節。

6.X需要Elasticsearch TLS節點,爲節點通信當使用X-pack安全特性在多節點集羣上。更多的信息參考這裏

這個博客將引導您完成設置和配置TLS的過程,使所有數據保持來自Filebat->Logstash->Elasticsearch->Kibana->您的Web瀏覽器的所有數據。您將需要一個有可用內存的系統來運行其中的每一個,當你將設置兩個Elasticsearch節點(默認每個節點需要1G內存,若要保留內存,則第二個節點是可選的),一個Logstash服務器(默認需要1G內存),一個Kibana服務器(~200M內存),和一個FileBeat(~10M)。你將需要總共6G的系統內存,但是,8GB將是理想的,因爲我無法知道您正在運行的其他軟件或內存飢餓的瀏覽器(打開50個選項卡)。

理解TLS/Certs

首先,我們應該從一些基本原理開始,討論什麼是證書以及如何使用證書。證書保存公共信息(包括公鑰),該信息有助於加密雙方之間的數據;其中只有具有匹配私鑰的方纔能從初始握手中解密數據。在不太深入細節的情況下,公鑰和私鑰代表了一個難以計算但易於驗證的計算謎題,其中私鑰包含非常大的數字,可以輕鬆地解決這個計算難題。在現代公鑰密碼學中,難以計算意味着解決這個計算難題所需的數學運算,用當前的計算資源需要數千年的時間。私鑰保存容易驗證謎題所需的源號,並且證書是從私鑰生成的,以包含對此數學謎題的必要輸入。在接下來的示例中,我將使用服務器的DNS名稱作爲標識。謎題的所有公共部分和證書的標識都是首先通過生成證書籤名請求(CSR)來創建的。在接下來的示例中,我將使用服務器的DNS名稱作爲標識。謎題的所有公共部分和證書的標識都是首先通過生成證書籤名請求(CSR)來創建的。

證書的認證/驗證非常重要,因爲客戶端和服務器之間的握手需要客戶端信任服務器證書的簽名權威。客戶端必須直接信任服務器的證書,或者由客戶端信任的權威機構簽名。例如,您的OS/瀏覽器有一個預先設置的證書列表,這些證書是“公開”受信任的。當您訪問google.com時,這個證書是由一個授權鏈簽名的,它可以爲您的客戶端OS/瀏覽器創建一個返回可信證書的路徑。把它想象成簽署法律文件的公證人,公證人必須經過某種方式的認證才能被認可。

以最簡單的形式,證書頒發機構(也稱爲根授權機構)是自簽名的-這意味着生成的證書是使用自己的私鑰簽名的。受公衆信任的當局有非常嚴格的標準和審計做法,以確保在沒有驗證適當身份所有權的情況下不會創建證書。如果您想要生成一個證書爲 http://elastic.example,你需要首先證明這個域名/身份的所有權。

在證書中,主題包含一個區分名稱(DN),它至少具有公共名稱(CN)。CN可以設置爲任何內容,主題替代名稱(SAN)應用於指定適當的標識,如DNS名稱和/或IP地址。SAN還可以包含多個DNS和/或IP地址。此標識將用於客戶端驗證,以便服務器的證書與證書中存在的標識正確匹配。客戶端將通過解析DNS名稱來驗證這一點,同時嘗試建立新連接。

此時,您可能會想知道,當只有服務器纔有要解密的信息時,如何對所有通信進行加密。這就是TLS握手的地方,最好用下面的圖片來解釋。若要啓動此握手,客戶端必須發出連接到服務器(1)的請求。服務器然後響應一個證書(2),然後,客戶端負責驗證/信任服務器的身份,如前所述(3)。如果您希望獲得服務器還必須信任客戶端(4)的附加安全性,服務器也可以請求客戶端證書。客戶端使用服務器的公鑰創建一個新的對稱密鑰,即共享密鑰,此時只有客戶端了解該密鑰。它使用服務器的公鑰加密這個共享密鑰,這允許服務器接收這個新的共享密鑰並解密(5)。此時,共享密鑰現在只爲客戶端和服務器(7)(8)所知,並且可以用於對雙方之間的通信進行加密和保密(9)。

2.png

現在,讓我們通過在每個產品之間設置帶有TLS加密通信的彈性堆棧,將這些知識付諸實踐。此設置將不涵蓋所有功能和設置,只是應用TLS加密的最低限度。

設置和下載

爲了讓事情變得更簡單,我們應該設置一個目錄,以便在整個博客中使用。我將把它存儲在我用戶的主目錄中。如果tmp文件夾在主目錄中不存在,則-p選項將創建該文件夾。

$ mkdir -p ~/tmp/cert_blog

Beats、Logstash和Kibana在開源產品中都支持TLS。ElasticSearch需要我們的商業插件X-Pack,用於TLS和其他安全功能。X-Pack安全性提供身份驗證和授權控制,以防止對文檔中的索引、文檔甚至字段的訪問。X-Pack還提供警報、監控、報告、圖表探索、機器學習和支持!更多細節請看這裏

下載以下產品的最新預覽版本。選擇zip或tar文件格式,並將它們放在我們創建的~/tmp/cert_blog文件夾中:

ElasticSearch

Kibana

Logstash

FileBeat

(您也可以使用5.x彈性堆棧設置TLS。下面說明中唯一的主要變化是,您不會爲ElasticSearch用戶生成密碼,因爲這些密碼是隨默認密碼設置一起提供的)

解壓到相同的文件夾,例如ElasticSearch.6.0.0.tar.gz ---> ElasticSearch.6.0.0

Elastic certgen tool

X-Pack添加的一個令人驚奇的特性是certgen工具。OpenSSL可以用於生成和簽名證書;但是,即使是經驗豐富的用戶也很難使用它,並且在嘗試插入公共項(如Subject Alternative Name(SAN)時,可能會導致無數個小時的挫折。certgen使生成必要的證書甚至簽名授權變得容易。如果您打算讓公共或公司/內部簽名機構簽署證書,甚至可以使用它來創建CSR。

要訪問certgen工具,我們必須首先安裝ElasticSearchX-Pack.

(安裝將提示允許java安全管理器修改,請回答是)

$ cd ~/tmp/cert_blog/elasticsearch-6.0.0-beta2
$ bin/elasticsearch-plugin install x-pack

創建證書頒發機構/簽名機構

用密碼加密私鑰是一種很好的做法,特別是如果它將用於簽署其他證書。讓我們創建這個密碼,用於加密證書頒發機構的私鑰。您可以在這裏使用您想要的任何東西,也可以使用下面的命令來生成一個強密碼。請確保安全保存您選擇的任何密碼,因爲它是不可能恢復的,您將需要它來簽署證書。

$ openssl rand -base64 32
 <long complex password>

進入ElasticSearch文件夾

$ cd ~/tmp/cert_blog/elasticsearch-6.0.0-beta2

在接下來的步驟中,我們將創建用於簽名其他證書的根權限。使用您想要的任何名稱(但保留CN=part)。在下面的示例中,生成的公共證書的壽命爲10年,並將生成一個具有4096 bit的大私鑰。當出現提示時,您將需要輸入您選擇或生成的密碼。點擊Enter可以跳過後續的實例名稱問題,因爲我們不想創建更多的服務器證書。

$ bin/x-pack/certgen --dn 'CN=MyExample Global CA' --pass --days 3650 --keysize 4096 --out ~/tmp/cert_blog/MyExample_Global_CA.zip
...
Enter password for CA private key:
Enter instance name:
Would you like to specify another instance? Press 'y' to continue entering instance information:

在某些時候,您可能希望查看Certgen文檔的所有可能設置和使用,但我將提供完成本練習所需的所有命令。

現在應該有一個zip文件,其中包含根證書頒發機構的私鑰和公共證書。解壓縮此文件,但請記住,我們只分發ca/ca.crt文件。ca/ca.key文件應該存儲起來,以便安全保存(以及解密之前所需的密碼)。

$ cd ~/tmp/cert_blog
$ unzip MyExample_Global_CA.zip
Archive:  MyExample_Global_CA.zip
   creating: ca/
  inflating: ca/ca.crt
  inflating: ca/ca.key

我們可以使用OpenSSL檢查這個新證書的細節。您將注意到Issuer=Subject,它指示證書是自簽名的。擴展部分可以包含幫助識別當前證書或簽名證書的SAN或指紋之類的信息。基本約束很重要,CA:true表明它可以用於簽署其他證書。

$ openssl x509 -noout -text -in ca/ca.crt
...
        Issuer: CN=MyExample Global CA
        Validity
            Not Before: Sep 24 19:42:40 2017 GMT
            Not After : Sep 22 19:42:40 2027 GMT
        Subject: CN=MyExample Global CA
...
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                8F:6C:8B:20:B3:7A:D9:18:31:9B:99:CC:8C:93:25:98:75:F4:4B:60
            X509v3 Authority Key Identifier:
                keyid:8F:6C:8B:20:B3:7A:D9:18:31:9B:99:CC:8C:93:25:98:75:F4:4B:60
                DirName:/CN=MyExample Global CA
                serial:0C:0B:14:99:98:D6:7B:64:0D:00:03:64:B8:1F:7D:F7:9F:BF:6F:30
            X509v3 Basic Constraints: critical
                CA:TRUE
...

生成服務器證書

創建一個新文件~/tmp/cert_blog/certgen_example.yml

此示例將爲兩個ElasticSearch節點(kibana和logstash)生成公共證書和私鑰;這些證書的使用將要求正確設置DNS名稱。出於測試目的,我們可以編輯/etc/host,這樣這些DNS名稱將是有效的。

instances:
  - name: 'node1'
    dns: [ 'node1.local' ]
  - name: "node2"
    dns: [ 'node2.local' ]
  - name: 'my-kibana'
    dns: [ 'kibana.local' ]
  - name: 'logstash'
    dns: [ 'logstash.local' ]

在下一個命令中,我們將使用上面創建的YAML文件,併爲每個實例生成有效期爲3年的證書(使用您所熟悉的任何時間段,請記住,當證書過期時-它將需要被替換)。我們必須爲前面創建的簽名/根權限指定證書和密鑰,--pass選項將提示我們解密簽名權威的私鑰所需的密碼。

$ cd ~/tmp/cert_blog/elasticsearch-6.0.0-beta2
$ bin/x-pack/certgen --days 1095 --cert ~/tmp/cert_blog/ca/ca.crt --key ~/tmp/cert_blog/ca/ca.key --pass --in ~/tmp/cert_blog/certgen_example.yml --out ~/tmp/cert_blog/certs.zip

解壓縮創建的文件

$ cd ~/tmp/cert_blog
$ unzip certs.zip -d ./certs
Archive:  certs.zip
   creating: ./certs/node1/
  inflating: ./certs/node1/node1.crt
  inflating: ./certs/node1/node1.key
   creating: ./certs/node2/
  inflating: ./certs/node2/node2.crt
  inflating: ./certs/node2/node2.key
   creating: ./certs/my-kibana/
  inflating: ./certs/my-kibana/my-kibana.crt
  inflating: ./certs/my-kibana/my-kibana.key
   creating: ./certs/logstash/
  inflating: ./certs/logstash/logstash.crt
  inflating: ./certs/logstash/logstash.key

檢查node1的證書時,您將注意到 頒發者/簽名權限爲CN=MyExgroge Global CA。SUBJECT=我們在YAML中提供的名稱,SAN有正確的DNS名稱。我們已準備好了。

$ openssl x509 -text -noout -in certs/node1/node1.crt
...
        Issuer: CN=MyExample Global CA
        Validity
            Not Before: Sep 24 21:42:02 2017 GMT
            Not After : Sep 23 21:42:02 2020 GMT
        Subject: CN=node1
...
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                A0:26:83:23:A8:C6:FB:02:F3:7F:C9:BC:1A:C9:16:C9:04:62:3E:DE
            X509v3 Authority Key Identifier:
                keyid:8F:6C:8B:20:B3:7A:D9:18:31:9B:99:CC:8C:93:25:98:75:F4:4B:60
                DirName:/CN=MyExample Global CA
                serial:0C:0B:14:99:98:D6:7B:64:0D:00:03:64:B8:1F:7D:F7:9F:BF:6F:30
            X509v3 Subject Alternative Name:
                DNS:node1.local
            X509v3 Basic Constraints:
                CA:FALSE
...

要使用這些證書進行測試,我們需要解析DNS名稱。我們可以修改/etc/host進行測試,但是在生產中您應該設置正確的DNS。/etc/host中127.0.0.1/localhost的行應該如下所示:

127.0.0.1 localhost node1.local node2.local kibana.local logstash.local

(測試完成後,請記住刪除這些附加內容)

Elasticsearch TLS設置

在ElasticSearch配置文件夾中創建一個cert目錄

$ cd ~/tmp/cert_blog/elasticsearch-6.0.0-beta2
$ mkdir config/certs

我們將啓動兩個節點,因此需要創建第二個配置文件夾

$ cp -r config config2

複製到ca.crt中,以及節點的私鑰和公共證書中。

$ cp ~/tmp/cert_blog/ca/ca.crt ~/tmp/cert_blog/certs/node1/* config/certs
$ cp ~/tmp/cert_blog/ca/ca.crt ~/tmp/cert_blog/certs/node2/* config2/certs

配置Elasticsearch節點:

編輯config/elasticsearch.yml

node.name: node1
network.host: node1.local
xpack.ssl.key: certs/node1.key
xpack.ssl.certificate: certs/node1.crt
xpack.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true
discovery.zen.ping.unicast.hosts: [ 'node1.local', 'node2.local']
node.max_local_storage_nodes: 2

edit config2/elasticsearch.yml

node.name: node2
network.host: node2.local
xpack.ssl.key: certs/node2.key
xpack.ssl.certificate: certs/node2.crt
xpack.ssl.certificate_authorities: certs/ca.crt
xpack.security.transport.ssl.enabled: true
xpack.security.http.ssl.enabled: true
discovery.zen.ping.unicast.hosts: [ 'node1.local', 'node2.local']
node.max_local_storage_nodes: 2

您將在上面的配置中注意到,network.host被設置爲DNS名稱。network.host是network.bind_host和network.publish_host的快捷方式。bind_host 控制是elasticsearch接口將能被使用,publish_host是告訴其他節點怎麼與我們這個節點通信。這一點很重要,因爲我們希望其他節點使用證書中設置的正確DNS名稱進行連接,否則它們將因身份不匹配而拒絕連接。此外,發現使用DNS名稱,因爲該列表在初始啓動階段由節點使用,用於聯繫這些主機中的一個來發現/加入集羣。此外,發現使用DNS名稱,因爲該列表在初始啓動階段由節點使用,用於聯繫這些主機中的一個來發現/加入集羣。當這個新節點可以加入時,發現節點將返回集羣中當前所有節點的列表(這是PUBLE_HOST發揮作用的地方)。

啓動第一個節點

$ ES_PATH_CONF=config ./bin/elasticsearch

打開一個新的終端窗口,轉到ElasticSearch文件夾,然後啓動第二個節點

$ ES_PATH_CONF=config2 ./bin/elasticsearch

我們需要爲各種系統帳戶配置密碼。在繼續之前,確保兩個節點都正確啓動。您應該會看到類似於這條日誌行的內容:

[2017-09-24T21:13:43,482][INFO ][o.e.n.Node               ] [node2] started

使用新的終端窗口,轉到ElasticSearch文件夾

$ cd ~/tmp/cert_blog/elasticsearch-6.0.0-beta2
$ bin/x-pack/setup-passwords auto -u "https://node1.local:9200"
Initiating the setup of reserved user [elastic, kibana, logstash_system]  passwords.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y
Changed password for user elastic
PASSWORD elastic = #q^4uL*tIO@Sk~%iPwg*
Changed password for user kibana
PASSWORD kibana = %uhWtQCN-9GNa52vot_h
Changed password for user logstash_system
PASSWORD logstash_system = #3vs5PZDBrWTIVnCgOCh

保存這些密碼

現在,讓我們看看集羣中正確列出了兩個節點(提示:將?v添加到URL的末尾以獲取列名,請參見_cat  API文檔)

$ curl --cacert ~/tmp/cert_blog/ca/ca.crt -u elastic 'https://node1.local:9200/_cat/nodes'
127.0.0.1 42 100 14 1.91   mdi * node1
127.0.0.1 39 100 14 1.91   mdi - node2

讓我們將該請求發送到應該在端口9201上運行的第二個節點。

curl --cacert ~/tmp/cert_blog/ca/ca.crt -u elastic 'https://node1.local:9201/_cat/nodes'
curl: (51) SSL: certificate verification failed (result: 5)

啊,我們只是改變了端口而不是DNS名稱。curl客戶端不允許這樣做,因爲服務器的身份與它所呈現的證書不匹配。讓我們糾正這一點,然後再爲第二個節點使用正確的DNS名稱。

$ curl --cacert ~/tmp/cert_blog/ca/ca.crt -u elastic 'https://node2.local:9201/_cat/nodes'
127.0.0.1 20 100 24 2.04   mdi - node2
127.0.0.1 43 100 24 2.04   mdi * node1

我們現在有一個工作的兩個節點ElasticSearch集羣。請記住,對於一些快速測試來說,兩個節點是很好的,但是對於除了快速測試之外的任何東西,在使用兩個節點時,必須正確地將最小minimum_master_node 設置爲2。

Kibana TLS設置

從kibana文件夾中安裝x-pack。

$ bin/kibana-plugin install x-pack

這一步需要幾分鐘。去喝一杯,這是你應得的。

接下來,在config目錄中創建一個cert文件夾,並在certs中複製。

$ mkdir config/certs
$ cp ~/tmp/cert_blog/ca/ca.crt ~/tmp/cert_blog/certs/my-kibana/* config/certs

編輯config/kibana.yml。確保插入前面生成的正確的kibana用戶密碼。

server.name: "my-kibana"
server.host: "kibana.local"
server.ssl.enabled: true
server.ssl.certificate: config/certs/my-kibana.crt
server.ssl.key: config/certs/my-kibana.key
elasticsearch.url: "https://node1.local:9200"
elasticsearch.username: "kibana"
elasticsearch.password: "%uhWtQCN-9GNa52vot_h"
elasticsearch.ssl.certificateAuthorities: [ "config/certs/ca.crt" ]

啓動Kibana。

$ bin/kibana

當Kibana啓動後,在瀏覽器訪問 https://kibana.local:5601 。您應該得到證書不受信任的錯誤。這是因爲瀏覽器既不信任直接證書,也不信任簽名授權。您可以將新創建的證書頒發機構添加/信任到您的OS/瀏覽器中,但根據您使用的OS/瀏覽器,這些步驟可能有所不同。我把這個留給你和谷歌去弄清楚。

3.png

暫時取消/繼續通過證書錯誤,並使用彈性用戶和自動生成的密碼登錄。登錄後,單擊Monitoring選項卡,您將看到ElasticSearch有2個節點,kibana有1個實例。

4.png

我們現在對ElasticSearch和kibana通信進行了加密,並使用DNS對證書進行了完全驗證。

在繼續之前,讓我們使用UI來設置logstash可以用來寫到ElasticSearch的帳戶。

Click on the management tab

5.png

我們將需要設置一個角色,該角色將授予日誌存儲配置所需的必要權限。

點擊Role

6.png

點擊創建角色

7.png

如下圖所示創建角色並單擊“保存”。

8.png

現在,我們將把這個角色分配給一個新用戶。

點擊User tab

9.png

點擊創建用戶

10.png

填寫所有細節,如下圖所示。這封電子郵件可以是任何你想要的,它不只是使用在ElasticSearch中有一個聯繫記錄。分配新創建的logstash_Writer角色,然後單擊Save。

11.png

Logstash TLS設置

安裝Logstash的TLS並不需要X-Pack,但是我們將安裝/使用它,因爲它將允許我們查看Kibana監視UI中的日誌存儲信息-這是非常棒的。

From the logstash folder run

$ bin/logstash-plugin install x-pack

我們需要在config文件夾中創建一個certs目錄,並在證書中複製。

$ mkdir config/certs
$ cp ~/tmp/cert_blog/ca/ca.crt ~/tmp/cert_blog/certs/logstash/* config/certs

logstash-輸入-拍插件要求私鑰爲pkcs 8格式。下面的OpenSSL命令將生成一個pkcs 8格式的新文件。

$ openssl pkcs8 -in config/certs/logstash.key -topk8 -nocrypt -out config/certs/logstash.pkcs8.key

編輯config/logstash.yml。確保爲logstash_system用戶插入正確的自動生成密碼。

node.name: logstash.local
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: '#3vs5PZDBrWTIVnCgOCh'
xpack.monitoring.elasticsearch.url: https://node1.local:9200
xpack.monitoring.elasticsearch.ssl.ca: config/certs/ca.crt

創建config/example.conf。對於ElasticSearch輸出配置,用戶和密碼將使用您剛纔在kibanaUI中創建的logstash_Writer帳戶。

input {
  beats {
    port => 5044
    ssl => true
    ssl_key => 'config/certs/logstash.pkcs8.key'
    ssl_certificate => 'config/certs/logstash.crt'
  }
}
output {
  elasticsearch {
    hosts => ["https://node1.local:9200","https://node2.local:9201"]
    cacert => 'config/certs/ca.crt'
    user => 'logstash_writer'
    password => 'changeme'
    index => 'logstash-%{+YYYY.MM.dd}'
  }
}

使用示例配置啓動logstash。

$ bin/logstash -f config/example.conf

在它啓動和運行之後,訪問Kibana監視頁面現在將有一個日誌存儲部分,其中有一個節點和一個管道!

12.png

Filebeat TLS 設置

在FileBeat文件夾中,創建一個certs目錄,並在CA cert中複製。我們只需要簽名權限,因爲FileBeat只會是一個與Logstash服務器對話的客戶端。如果您想要某種形式的互操作,可以將Filebeat配置爲還提供客戶端證書,但這是另一天的主題。

$ mkdir certs
$ cp ~/tmp/cert_blog/ca/ca.crt certs

我們需要一個測試日誌來配置FileBeat來讀取。如果您在某個地方已經有一個日誌文件,您可以跳過這一步,只需輸入到該日誌文件的正確路徑即可。如果沒有,請下載示例日誌並將其解壓縮到FileBeat目錄中。

Create example-filebeat.yml:

filebeat.prospectors:
- type: log
  paths:
    - logstash-tutorial-dataset
output.logstash:
  hosts: ["logstash.local:5044"]
  ssl.certificate_authorities:
    - certs/ca.crt

然後使用此配置運行FileBeat:

$ ./filebeat -e -c example-filebeat.yml

現在,您可以訪問Kibana發現頁面,並單擊“Create”按鈕以獲得新的索引模式。索引模式用於選擇logstash-*命名索引進行搜索。

13.png

我們現在應該在KibanaUI中有日誌數據!這些數據是從FileBeat->Logstash->Elasticearch傳輸的。Kibana把它從ElasticSearch中取出,加密後傳送給你的瀏覽器。哇哈!

14.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章