Docker開啟遠程連接並實現安全通信詳解
正文
Docker 使用瞭客戶端 — 服務端模型。服務端對外提供 REST API。
默認安裝方式,客戶端和服務端在同一臺主機上,通過本地安全 PIC Socket 進行通信,例如 Linux 中 /var/run/docker.sock。我們還可以配置它們通過網絡進行通信。它們默認網絡配置使用不安全的 HTTP Socket,端口為 2375。
在生產環境這是不能接受的。通過 TLS 的方式連接解決這個問題。生產環境中推薦這種配置,即使在可信內網中,也建議使用該方式!
Docker 為 TLS 提供兩種模式
- daemon 模式:Docker daemon 隻接收認證客戶端的請求。
- 客戶端模式:Docker 客戶端隻接收認證的 daemon 發起的請求。
同時使用它們,能提供最高的安全等級。
下面開始介紹如何完成 TLS 的配置,總體步驟如下。
- 創建 CA 。
- 為 daemon 創建密鑰對。
- 為客戶端創建密鑰對。
- 分發密鑰
- Docker 配置 TLS 模式
創建 CA
在 node2 運行下面的命令。
- 為 CA 創建私鑰(過程中需要設置密碼)
$ openssl genrsa -aes256 -out ca-key.pem 4096
當前目錄新增一個 ca-key.pem 文件,這是 CA 私鑰。
- 用 CA 私鑰生成公鑰(過程需要輸入之前的密碼)
$ openssl req -new -x509 -days 730 -key ca-key.pem -sha256 -out ca.pem
當前目錄新增一個 ca.pem 文件,這是 CA 公鑰,也叫”證書“。
為 daemon 創建密鑰對
在 node3 運行下面的命令。
- 為 daemon 創建私鑰。
$ openssl genrsa -out daemon-key.pem 4096
當前目錄新增一個 daemon-key.pem 文件,這是 daemon 節點的私鑰。
- 創建證書簽名請求並發送到 CA。
$ openssl req -subj "/CN=daemon" \ -sha256 -new -key daemon-key.pem -out daemon.csr
當前目錄新增一個 daemon.csr 文件,這是 CSR。
為證書添加屬性。 創建文件,名為 extfile.cnf。示例中使用瞭 daemon 節點的 DNS 名稱和 IP。每個人的環境中可能值不同。
$ subjectAltName = DNS:daemon,IP:192.168.57.3 extendedKeyUsage = serverAuth
- 生成證書 使用 CSR 文件、CA 密鑰、extfile.cnf 文件完成簽名和 daemon 證書配置。
$ openssl x509 -req -days 730 -sha256 \ -in daemon.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out daemon-cert.pem -extfile extfile.cnf
此時,已經擁有一個可用 CA ,同時 daemon 的 Node3 節點也有瞭自己的密鑰。
繼續下面內容前,刪除 CSR 和 extfile.cnf。
$ rm daemon.csr extfile.cnf
為客戶端創建密鑰對
在 node3 運行下面的命令。
為客戶端創建密鑰
$ openssl genrsa -out client-key.pem 4096
當前目錄新增一個 client-key.pem 文件。
創建 CSR。
$ openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
當前目錄新增一個 client.csr 文件。
創建 extfile.cnf 文件 將證書設置為客戶端認證可用。文件內容如下。
extendedKeyUsage = clientAuth
生成證書 使用 CSR 文件、CA 密鑰、extfile.cnf 文件完成簽名和客戶端證書配置。
$ openssl x509 -req -days 730 -sha256 \ -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out client-cert.pem -extfile extfile.cnf
刪除 CSR 和 extfile.cnf ,因為不會用到它們瞭。 $ rm client.csr extfile.cnf
此時,在工作目錄下應該有如下 7 個文件。
ca-key.pem ca.pem ca.srl client-cert.pem client-key.pem daemon-cert.pem daemon-key.pem
分發密鑰
- 從 CA (剛才證書生成的 node) 復制 ca.pem、daemon-cert.pem、daemon-key.pem 到 node3(daemon 節點)。
- 從 CA (剛才證書生成的 node) 復制 ca.pem、client-cert.pem、client-key.pem 到 node1(客戶端節點)。
這裡用 scp 完成復制操作。在 scp 的過程中對部分文件進行瞭重命名。重命名非常重要,因為 Docker 對文件命名有規范。
// Daemon files $ scp ./ca.pem ubuntu@daemon:/home/ubuntu/.docker/ca.pem $ scp ./daemon-cert.pem ubuntu@daemon:/home/ubuntu/.docker/cert.pem $ scp ./daemon-key.pem ubuntu@daemon:/home/ubuntu/.docker/key.pem // Client files $ scp ./ca.pem ubuntu@client:/home/ubuntu/.docker/ca.pem $ scp ./client-cert.pem ubuntu@client:/home/ubuntu/.docker/cert.pem $ scp ./client-key.pem ubuntu@client:/home/ubuntu/.docker/key.pem
Docker 配置 TLS 模式
進入 Node3(daemon 節點)完成下面的配置。
找到 daemon.json 配置文件。在 Linux 上位於 /etc/docker,編輯 daemon.json 文件,添加如下行。
"tls": true, "tlsverify": true, "tlscacert": "/home/ubuntu/.docker/ca.pem", "tlscert": "/home/ubuntu/.docker/cert.pem", "tlskey": "/home/ubuntu/.docker/key.pem", "hosts": ["tcp://你的 daemon 的IP:2376"]
這些 daemon.json 中的參數意義如下。
- tlsverify :開啟 TLS 認證。
- tlscacert :指定daemon可信任的 CA。
- tlscert :向 Docker 指定 daemon 證書的位置。
- tlskey :向 Docker 指定daemon私鑰的位置。
- hosts :向 Docker 指定需要綁定 daemon 的具體 Socket。
警告:部分版本的 Linux 系統運行 systemd 的,不允許在 daemon.json 中使用“hosts”選項。替換方案是在 systemd 配置文件中進行重寫。創建名為 /etc/systemd/system/docker.service.d/override.conf 的新文件。在其中加入下列 3 行內容,然後保存。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://你的 daemon 的IP:2376”
重啟 daemon 。
$ systemctl daemon-reload $ systemctl restart docker.service
如果重啟失敗且錯誤為
docker.service: Main process exited, code=exited, status=1/FAILURE
為瞭讓它工作,編輯 /lib/systemd/system/docker.service
,修改如下內容之後再次嘗試重啟。
# 修改前: ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock # 修改後: ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
理論上,/etc/systemd/system/docker.service.d/override.conf
與 /etc/docker/daemon.json
可以同時修改,但是並不建議這麼做,如果僅修改 /etc/docker/daemon.json
沒有出現任何問題,那就太棒瞭。
進入 Docker 客戶端節點,配置臨時環境變量。
$ export DOCKER_HOST=tcp://你的 daemon IP 地址:2376
嘗試運行 $ docker version
,會出現錯誤,類似無法連接 daemon。接著設置另一個環境變量。
$ export DOCKER_TLS_VERIFY=1
它是告知 Docker 客戶端使用證書對全部命令進行簽名,此時再試試 $ docker version
!
🎉 恭喜。你成功完成瞭客戶端與 daemon 完成安全的通信。
以上就是Docker開啟遠程連接並實現安全通信詳解的詳細內容,更多關於Docker遠程連接安全通信的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Docker開啟安全的TLS遠程連接訪問方式
- docker remote api一鍵TLS加密的實現
- Docker Machine深入詳解
- Docker 環境配置以及問題解決方案
- centos搭建部署docker環境的詳細步驟