TLS加密遠程連接Docker
- 2019 年 10 月 4 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/boling_cavalry/article/details/100601169
《Docker遠程連接設置》一文講述了開啟Docker遠程連接的方法,但那種方法不安全,因為任何客戶端都可以通過Docker服務的IP地址連接上去,今天我們就來學習Docker官方推薦的安全的遠程連接方式:TLS加密連接,通過證書來保證安全性。
官方文檔
這裡是官方的權威文檔:https://docs.docker.com/engine/security/https/
環境資訊
本次實戰的環境資訊如下:
- Docker服務所在機器(下面以A機器表示):CentOS Linux release 7.6.1810
- Docker服務版本:1.13.1
- 另一台驗證遠程連接的機器(下面以B機器表示)也是CentOS 7.6,其上安裝了Docker client 1.13.1
操作步驟
本次實戰的操作步驟如下:
- 製作證書,包括CA、服務端、客戶端的;
- 設置機器A上的Docker服務的TLS連接;
- 從機器B遠程連接機器A上的Docker服務;
製作證書(A機器)
- 在Linux伺服器上建一個目錄,進入此目錄,我這裡是/root/work
- 創建根證書RSA私鑰:
openssl genrsa -aes256 -out ca-key.pem 4096
- 頁面提示Enter pass phrase for ca-key.pem,此時輸入秘鑰的密碼,我這裡輸入了1234,回車後會要求再輸入一次,兩次密碼一致就會在當前目錄生成CA秘鑰文件ca-key.pem;
- 以此秘鑰創建CA證書,自己給自己簽發證書,自己就是CA機構,也可以交給第三方機構去簽發:
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
此時生成的ca.pem文件就是CA證書; 5. 創建服務端私鑰:
openssl genrsa -out server-key.pem 4096
此時生成的server-key.pem文件就是服務端私鑰; 6. 生成服務端證書籤名請求(csr即certificate signing request,裡面包含公鑰與服務端資訊)
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
此時生成的server.csr文件就是服務端證書; 7. 生成簽名過的服務端證書(期間會要求輸入密碼1234):
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
此時生成的server-cert.pem文件就是已蓋章生效的服務端證書; 8. 生成客戶私鑰:
openssl genrsa -out key.pem 4096
此時生成的key.pem文件就是客戶私鑰; 9. 生成客戶端證書籤名請求:
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
此時生成的client.csr文件就是客戶端證書籤名請求; 10. 生成名為extfile.cnf的配置文件:
echo extendedKeyUsage=clientAuth > extfile.cnf
- 生成簽名過的客戶端證書(期間會要求輸入密碼1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
- 將多餘的文件刪除:
rm -rf ca.srl client.csr extfile.cnf server.csr
- 此時還剩以下文件:
文件名 |
作用 |
---|---|
ca.pem |
CA機構證書 |
ca-key.pem |
根證書RSA私鑰 |
cert.pem |
客戶端證書 |
key.pem |
客戶私鑰 |
server-cert.pem |
服務端證書 |
server-key.pem |
服務端私鑰 |
至此,所有證書文件製作完成,接下來對Docker做TLS安全配置;
Docker的TLS連接設置(A機器)
- 打開文件/lib/systemd/system/docker.service,找到下圖紅框中的內容:

- 將上圖紅框中的一整行內容替換為以下內容:
ExecStart=/usr/bin/dockerd-current --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/server-cert.pem --tlskey=/root/work/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
- 載入上述配置,再重啟docker服務:
systemctl daemon-reload && systemctl restart docker
配置完成,接下來驗證遠程TLS連接。
驗證遠程TLS連接(B機器)
- 假設前面我們操作的電腦為A,IP地址是192.168.121.138;
- 現在再準備一台電腦B,IP地址是192.168.121.132,用來驗證TLS加密遠程連接A上的Docker;
- 在A機器執行以下命令,將A上的ca.pem、cert.pem、key.pem這三個文件複製到B機器的/root/work目錄(請提前建好此目錄):
scp /root/work/ca.pem [email protected]:/root/work && scp /root/work/cert.pem [email protected]:/root/work && scp /root/work/key.pem [email protected]:/root/work
- 在製作證書時沒有允許通過IP訪問服務端,所以B在連接A的Docker時不能直接用A的IP,所以要用host來訪問A,給B電腦增加一個host配置(如果B電腦是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
- 在B上執行以下命令,即可連接A的Docker服務:
docker --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/cert.pem --tlskey=/root/work/key.pem -H tcp://docker-daemon:2376 version
控制台顯示以下資訊,其中Server部分就是A機器的Docker資訊:
Client: Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64 Go version: go1.10.3 Git commit: b2f74b2/1.13.1 Built: Wed May 1 14:55:20 2019 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64 Go version: go1.10.3 Git commit: 7f2769b/1.13.1 Built: Mon Aug 5 15:09:42 2019 OS/Arch: linux/amd64 Experimental: false
- 不用證書連接試試,各種嘗試都失敗了:
[root@centos7 work]# docker -H tcp://192.168.121.138:2375 images Cannot connect to the Docker daemon at tcp://192.168.121.138:2375. Is the docker daemon running? [root@centos7 work]# docker -H tcp://docker-daemon:2375 images Cannot connect to the Docker daemon at tcp://docker-daemon:2375. Is the docker daemon running? [root@centos7 work]# docker -H tcp://192.168.121.138:2376 images Get http://192.168.121.138:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "x15x03x01x00x02x02". * Are you trying to connect to a TLS-enabled daemon without TLS? [root@centos7 work]# docker -H tcp://docker-daemon:2376 images Get http://docker-daemon:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "x15x03x01x00x02x02". * Are you trying to connect to a TLS-enabled daemon without TLS?
至此,TLS加密遠程連接Docker的實戰就完成了,希望您在設置安全的Docker遠程連接是,本文能給您提供參考。