docker swarm join 使用什麼證書?
我正在嘗試設置一個 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 上的容器託管)混合在一起。這是兩種不同的工具。兩組文件見:
- 群模式:https ://docs.docker.com/engine/swarm/
- Classic Swarm:https ://github.com/docker/classicswarm (之前的文件已從 docker 的網站上刪除)
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/