Ssl

docker swarm join 使用什麼證書?

  • June 25, 2020

我正在嘗試設置一個 docker swarm。

我需要我的節點通過 TLS 進行通信。

我使用extendedKeyUsage = serverAuth 為管理器節點創建了一個證書

我已經使用以下 daemon.json 配置了管理器節點:

{
   "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
   "tlscacert": "/var/docker/ca.pem",
   "tlscert": "/var/docker/server-cert.pem",
   "tlskey": "/var/docker/server-key.pem",
   "tlsverify": true
}

為了測試這一點,我創建了一個客戶端證書,使用它從我的筆記型電腦連接到 docker api,我能夠成功連接。

現在我需要向 swarm 添加一個工作節點。

我已經以與管理節點相同的方式設置它;使用類似的 daemon.json。我已經使用了一個帶有 extendedKeyUsage = serverAuth 的 SSL 密鑰,並以與管理節點相同的方式證明了客戶端連接。

然後在管理器中我執行了 docker swarm init

要將工作節點加入 swarm,我使用以下命令: docker swarm join –token XXX dockman.myhost.com:2376

但我收到一個錯誤:

Error response from daemon: rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = "transport: authentication handshake failed: remote error: tls: bad certificate"

我想我可以通過嘗試從工作節點連接到管理節點上的 docker API 來進一步測試它:

sudo docker --tlsverify --tlscacert=/var/docker/ca.pem --tlscert=./server-cert.pem --tlskey=./server-key.pem -H=127.0.0.1:2376 version

結果是:

Client: Docker Engine - Community
Version:           19.03.5
API version:       1.40
Go version:        go1.12.12
Git commit:        633a0ea838
Built:             Wed Nov 13 07:29:52 2019
OS/Arch:           linux/amd64
Experimental:      false
The server probably has client authentication (--tlsverify) enabled. Please check your TLS client certification settings: Get https://127.0.0.1:2376/v1.40/version: remote error: tls: bad certificate

這第二個測試給了我更多的思考。當然它會失敗,因為我試圖連接伺服器證書而不是客戶端證書,但這不正是 docker swarm join 試圖做的嗎?將客戶端證書放入 daemon.json 對我來說沒有意義。我用Google搜尋了伺服器和客戶端都製作了一個證書,這是可能的,但似乎是不好的做法。如果需要,我會認為它會在教程中介紹。

我一直被困在這一點上。我無法確定需要什麼證書設置。

我一直在關注 https://github.com/docker/docker.github.io/blob/master/swarm/configure-tls.md 這描述了證書的創建,但根本沒有提到客戶端或伺服器身份驗證。

更新 1

我發現一個文件說證書需要是客戶端和伺服器

https://hub.docker.com/_/swarm/

所以我將節點證書重新製作為客戶端和伺服器。現在 docker version 命令在從節點執行時有效,但在 swarm join 時無效。

您將 Swarm 模式(docker swarm和類似的 CLI)與基於經典容器的 Swarm(作為 docker hub 上的容器託管)混合在一起。這是兩種不同的工具。

兩組文件見:

Swarm Mode 不需要手動配置 TLS,都是內置的,Swarm Mode 的埠與 docker API 套接字的埠不同。你不想在沒有充分理由的情況下在網路上公開 docker API(這是黑客的常見來源),而 Swarm Mode 不是一個理由。

因此,您應該刪除該命令的-H選項dockerd以及那裡的任何 TLS 選項。然後docker swarm init在第一個管理器上執行,它將生成 TLS 憑據並提供一個包含自簽名證書雜湊的令牌。然後其他管理器和工作人員執行 adocker swarm join以生成客戶端證書,連接到管理器,從令牌驗證管理器證書的雜湊,並使用連接令牌的秘密部分向管理器驗證自己。

以上將加密管理人員和工作人​​員之間的管理平面。要加密工作人員之間在覆蓋網路上傳輸的數據,您需要在您創建的覆蓋網路上啟用 IPSec:

docker network create --opt encrypted --driver overlay app-overlay-net

有關此功能的文件位於:https ://docs.docker.com/v17.09/engine/userguide/networking/overlay-security-model/

引用自:https://serverfault.com/questions/999364