"《Docker遠程連接設置》" 一文講述了開啟Docker遠程連接的方法,但那種方法不安全,因為任何客戶端都可以通過Docker服務的IP地址連接上去,今天我們就來學習Docker官方推薦的安全的遠程連接方式:TLS加密連接,通過證書來保證安全性。 官方文檔 這裡是官方的權威文檔:https:// ...
《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證書;
- 創建服務端私鑰:
openssl genrsa -out server-key.pem 4096
此時生成的server-key.pem文件就是服務端私鑰;
- 生成服務端證書簽名請求(csr即certificate signing request,裡面包含公鑰與服務端信息)
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
此時生成的server.csr文件就是服務端證書;
- 生成簽名過的服務端證書(期間會要求輸入密碼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文件就是已蓋章生效的服務端證書;
- 生成客戶私鑰:
openssl genrsa -out key.pem 4096
此時生成的key.pem文件就是客戶私鑰;
- 生成客戶端證書簽名請求:
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
此時生成的client.csr文件就是客戶端證書簽名請求;
- 生成名為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 "\x15\x03\x01\x00\x02\x02".
* 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 "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?
至此,TLS加密遠程連接Docker的實戰就完成了,希望您在設置安全的Docker遠程連接是,本文能給您提供參考。