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/

環境資訊

本次實戰的環境資訊如下:

  1. Docker服務所在機器(下面以A機器表示):CentOS Linux release 7.6.1810
  2. Docker服務版本:1.13.1
  3. 另一台驗證遠程連接的機器(下面以B機器表示)也是CentOS 7.6,其上安裝了Docker client 1.13.1

操作步驟

本次實戰的操作步驟如下:

  1. 製作證書,包括CA、服務端、客戶端的;
  2. 設置機器A上的Docker服務的TLS連接;
  3. 從機器B遠程連接機器A上的Docker服務;

製作證書(A機器)

  1. 在Linux伺服器上建一個目錄,進入此目錄,我這裡是/root/work
  2. 創建根證書RSA私鑰:
openssl genrsa -aes256 -out ca-key.pem 4096
  1. 頁面提示Enter pass phrase for ca-key.pem,此時輸入秘鑰的密碼,我這裡輸入了1234,回車後會要求再輸入一次,兩次密碼一致就會在當前目錄生成CA秘鑰文件ca-key.pem;
  2. 以此秘鑰創建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
  1. 生成簽名過的客戶端證書(期間會要求輸入密碼1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  1. 將多餘的文件刪除:
rm -rf ca.srl client.csr extfile.cnf server.csr
  1. 此時還剩以下文件:

文件名

作用

ca.pem

CA機構證書

ca-key.pem

根證書RSA私鑰

cert.pem

客戶端證書

key.pem

客戶私鑰

server-cert.pem

服務端證書

server-key.pem

服務端私鑰

至此,所有證書文件製作完成,接下來對Docker做TLS安全配置;

Docker的TLS連接設置(A機器)

  1. 打開文件/lib/systemd/system/docker.service,找到下圖紅框中的內容:
  1. 將上圖紅框中的一整行內容替換為以下內容:
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 
  1. 載入上述配置,再重啟docker服務:
systemctl daemon-reload && systemctl restart docker

配置完成,接下來驗證遠程TLS連接。

驗證遠程TLS連接(B機器)

  1. 假設前面我們操作的電腦為A,IP地址是192.168.121.138;
  2. 現在再準備一台電腦B,IP地址是192.168.121.132,用來驗證TLS加密遠程連接A上的Docker;
  3. 在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
  1. 在製作證書時沒有允許通過IP訪問服務端,所以B在連接A的Docker時不能直接用A的IP,所以要用host來訪問A,給B電腦增加一個host配置(如果B電腦是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
  1. 在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
  1. 不用證書連接試試,各種嘗試都失敗了:
[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遠程連接是,本文能給您提供參考。