為Docker Swarm配置TLS

Docker Swarm -> Configure Docker Swarm for TLS

為Docker Swarm配置TLS

這個過程中,你創建了兩個節點的Swarm集群,一個Docker Engine CLI,一個Swarm Manager和一個CA。如下所示。所有的Docker Engine主機(client,swarm,node1和node2)都有一份CA的證書拷貝和它們各自的通過CA簽署的密鑰對。


你將完成如下的步驟在這個過程中:

  • Step 1: 設置的前提條件
  • Step 2: 創建一個CA服務器
  • Step 3: 創建并簽署密鑰
  • Step 4: 安裝這個密鑰
  • Step 5: 配置Engine daemon的TLS
  • Step 6: 創建Swarm集群
  • Step 7: 創建使用TLS的Swarm manager集群
  • Step 8: 測試Swarm manager的配置
  • Step 9: 配置Engine CLI使用TLS

在開始之前

文章包括使用OpenSSl創建你自己的CA的步驟。這類似于經營自己組織內部的CA和PKI。然而,這不是一個可用于生產環境的CA和PKI指南。這些步驟的僅僅是為了演示滿足后續配置Docker Swarm用于TLS。

Step 1: 設置的前提條件

為了完成這個過程你必須搭建5個Linux服務器??梢允俏锢頇C和虛擬機的混合;它們也可以是云主機。下面的表格列出了每個服務器的名字和它們的目的。

服務器名 描述
ca 作為一個CA服務器
swarm 作為Swarm Manager
node1 作為Swarm node
node2 作為Swarm node
client 作為一個遠端的Docker Engine client

確保你可以使用SSH訪問這5個服務器,并且它們之間可以相互通信通過使用DNS名解析。尤其需要:

  • 在Swarm Manager和Swarm node之間打開TCP的2376端口
  • 在Docker Engine client和Swarm Manager之間打開TCP的3376端口

你可以選擇不同的端口如果它們已經被占用了。這個例子假設你通過這些端口使用它們。

每個服務器的操作系統必須兼容Docker Engine。為了簡單起見,這一步和下面假設所有的服務器運行在Ubuntu 14.04 LTS上。

Step 2: 創建一個CA服務器

注意:如果你已經有可訪問的CA和證書,你可以跳過這一步。

在這一步,你配置一個Linux服務器作為一個CA。你使用這個CA去創建簽署密鑰。

  1. 登錄這個CA服務器的終端然后提升到root。
$sudo su
  1. 為CA創建一個私鑰命名為ca-priv-key.pem:
# openssl genrsa -out ca-priv-key.pem 2048
Generating RSA private key, 2048 bit long modulus
...........................................................+++
.....+++
e is 65537 (0x10001)
  1. 為CA創建一個公鑰命名為ca.pem

    這個公鑰基于上一步被創建的私鑰。

# openssl req -config /usr/lib/ssl/openssl.cnf -new -key ca-priv-key.pem -x509 -days 1825 -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
<output truncated>

現在你已經配置了一個公鑰和私鑰對為CA服務。你可以查看每個密鑰的內容。查看私鑰:

# openssl rsa -in ca-priv-key.pem -noout -text

查看公鑰:

# openssl x509 -in ca.pem -noout -text

下面的命令顯示了CA的公鑰的部分內容。

# openssl x509 -in ca.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 17432010264024107661 (0xf1eaf0f9f41eca8d)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, ST=CA, L=Sanfrancisco, O=Docker Inc
        Validity
            Not Before: Jan 16 18:28:12 2016 GMT
            Not After : Jan 13 18:28:12 2026 GMT
        Subject: C=US, ST=CA, L=San Francisco, O=Docker Inc
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:d1:fe:6e:55:d4:93:fc:c9:8a:04:07:2d:ba:f0:
                    55:97:c5:2c:f5:d7:1d:6a:9b:f0:f0:55:6c:5d:90:
<output truncated>

稍后,你將使用這個證書去簽署基礎設置中其它服務的密鑰。

Step 3: 創建并簽署密鑰

現在你又一個可用的CA,你需要創建一個密鑰對為Swarm Manager,Swarm nodes,和遠端的Docker Engine client。所有服務器創建密鑰對的命令和處理過程相同。你將創建下面的密鑰:

密鑰名 描述
ca-priv-key.pem 這是CA的私鑰必須要保證安全。它被用于在之后簽署環境中的其它新節點的密鑰。
ca.pem 這是CA的公鑰(也可以叫它證書)。它被安裝在環境中的所有節點,用于使節點信任由CA簽發的證書。通ca-priv-key.pem文件一起組成了CA的密鑰對。
node.csr 這是一個證書簽名請求(CSR).一個CSR是一個有效的CA申請,用于為指定的節點創建一個新的密鑰對。
node-priv.key 一個CA簽名的私鑰。節點依賴這個密鑰證明自己為遠端Docker Engine。與node-cert.pem文件一起組成了節點的密鑰對。
node-cert.pem CA簽名的證書。在這個例子中沒有用。與node-priv.pem文件一起組成了節點的密鑰對。

下面的命令顯示了怎樣創建密鑰為所有的節點。在你的CA服務器的工作目錄中執行這些命令。

  1. 登錄你的CA服務器終端,提升root權限。
$ sudo su
  1. 為你的Swarm manager創建一個私鑰,命名swarm-priv-key.pem
# openssl genrsa -out swarm-priv-key.pem 2048
Generating RSA private key, 2048 bit long modulus
............................................................+++
........+++
e is 65537 (0x10001)
  1. 使用上一步你創建的私鑰生成一個證書簽名請求(CSR)swarm.csr
# openssl req -subj "/CN=swarm" -new -key swarm-priv-key.pem -out swarm.csr

注意,這里僅僅是為了演示,創建一個CSR的過程在生產環境中于這里有所區別。

  1. 基于上一步創建的CSR,創建證書swarm-cert.pem.
# openssl x509 -req -days 1825 -in swarm.csr -CA ca.pem -CAkey ca-priv-key.pem -CAcreateserial -out swarm-cert.pem -extensions v3_req -extfile /usr/lib/ssl/openssl.cnf
<snip>
# openssl rsa -in swarm-priv-key.pem -out swarm-priv-key.pem

你現在已經有了Swarm Manager的密鑰對。

  1. 為基礎設施中剩余的節點(node1,node2和client)重復上面的步驟。
    記得替換swarm位置的值為你創建密鑰的相應節點。
服務器名 私鑰 CSR 證書
node1 node1-priv-key.pem node1.csr node1-cert.pem
node2 node2-priv-key.pem node2.csr node2-cert.pem
client client-priv-key.pem client.csr client-cert.pem
  1. 確認你的工作目錄中包含下面的文件:
# ls -l
total 64
-rw-r--r-- 1 root   root   1679 Jan 16 18:27 ca-priv-key.pem
-rw-r--r-- 1 root   root   1229 Jan 16 18:28 ca.pem
-rw-r--r-- 1 root   root     17 Jan 18 09:56 ca.srl
-rw-r--r-- 1 root   root   1086 Jan 18 09:56 client-cert.pem
-rw-r--r-- 1 root   root    887 Jan 18 09:55 client.csr
-rw-r--r-- 1 root   root   1679 Jan 18 09:56 client-priv-key.pem
-rw-r--r-- 1 root   root   1082 Jan 18 09:44 node1-cert.pem
-rw-r--r-- 1 root   root    887 Jan 18 09:43 node1.csr
-rw-r--r-- 1 root   root   1675 Jan 18 09:44 node1-priv-key.pem
-rw-r--r-- 1 root   root   1082 Jan 18 09:49 node2-cert.pem
-rw-r--r-- 1 root   root    887 Jan 18 09:49 node2.csr
-rw-r--r-- 1 root   root   1675 Jan 18 09:49 node2-priv-key.pem
-rw-r--r-- 1 root   root   1082 Jan 18 09:42 swarm-cert.pem
-rw-r--r-- 1 root   root    887 Jan 18 09:41 swarm.csr
-rw-r--r-- 1 root   root   1679 Jan 18 09:42 swarm-priv-key.pem

你可以查看每個密鑰的內容。對于私鑰:

# openssl rsa -in <key-name> -noout -text

對于公鑰(證書):

# openssl x509 -in <key-name> -noout -text

下面的命令顯示Swarm Manager的公鑰swarm-cert.pem的部分內容.

# openssl x509 -in ca.pem -noout -text
Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 9590646456311914051 (0x8518d2237ad49e43)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=US, ST=CA, L=Sanfrancisco, O=Docker Inc
    Validity
        Not Before: Jan 18 09:42:16 2016 GMT
        Not After : Jan 15 09:42:16 2026 GMT
    Subject: CN=swarm

<output truncated>

Step 4: 安裝密鑰

在這一步,你要安裝密鑰到相應基礎設施的服務器中。每個服務器需要三個文件:

  • 一個CA的公鑰文件拷貝(ca.pem)
  • 自己的私鑰
  • 自己的公鑰(證書)

下面的步驟顯示了如何通過使用scp拷貝這三個文件從CA服務器到每個服務器。作為拷貝的一個步驟,你將重命名每個文件根據下面的每個節點:

原始名 拷貝名
ca.pem ca.pem
<server>-cert.pem cert.pem
<server>-priv-key.pem key.pem
  1. 登錄你的CA服務器終端并且提升root。
$ sudo su
  1. 在Swarm manager上創建~/.certs目錄。這里我們假設用戶的帳號是ubuntu。
$ ssh ubuntu@swarm 'mkdir -p /home/ubuntu/.certs'
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容