TLS加密遠程鏈接Docker

《Docker遠程鏈接設置》一文講述了開啓Docker遠程鏈接的方法,但那種方法不安全,由於任何客戶端均可以經過Docker服務的IP地址鏈接上去,今天咱們就來學習Docker官方推薦的安全的遠程鏈接方式:TLS加密鏈接,經過證書來保證安全性。linux

官方文檔

這裏是官方的權威文檔:https://docs.docker.com/engin...git

環境信息

本次實戰的環境信息以下:docker

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

操做步驟

本次實戰的操做步驟以下:shell

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

製做證書(A機器)

  1. 在Linux服務器上建一個目錄,進入此目錄,我這裏是<font color="blue">/root/work</font>
  2. 建立根證書RSA私鑰:
openssl genrsa -aes256 -out ca-key.pem 4096
  1. 頁面提示<font color="blue">Enter pass phrase for ca-key.pem</font>,此時輸入祕鑰的密碼,我這裏輸入了<font color="blue">1234</font>,回車後會要求再輸入一次,兩次密碼一致就會在當前目錄生成CA祕鑰文件<font color="blue">ca-key.pem</font>;
  2. 以此祕鑰建立CA證書,本身給本身簽發證書,本身就是CA機構,也能夠交給第三方機構去簽發:
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

此時生成的<font color="blue">ca.pem</font>文件就是CA證書;json

  1. 建立服務端私鑰:
openssl genrsa -out server-key.pem 4096

此時生成的<font color="blue">server-key.pem</font>文件就是服務端私鑰;centos

  1. 生成服務端證書籤名請求(csr即certificate signing request,裏面包含公鑰與服務端信息)
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

此時生成的<font color="blue">server.csr</font>文件就是服務端證書;安全

  1. 生成簽名過的服務端證書(期間會要求輸入密碼1234):
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

此時生成的<font color="blue">server-cert.pem</font>文件就是已蓋章生效的服務端證書;服務器

  1. 生成客戶私鑰:
openssl genrsa -out key.pem 4096

此時生成的<font color="blue">key.pem</font>文件就是客戶私鑰;tcp

  1. 生成客戶端證書籤名請求:
openssl req -subj "/CN=client" -new -key key.pem -out client.csr

此時生成的<font color="blue">client.csr</font>文件就是客戶端證書籤名請求;學習

  1. 生成名爲<font color="blue">extfile.cnf</font>的配置文件:
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. 打開文件<font color="blue">/lib/systemd/system/docker.service</font>,找到下圖紅框中的內容:

在這裏插入圖片描述

  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地址是<font color="blue">192.168.121.138</font>;
  2. 如今再準備一臺電腦B,IP地址是<font color="blue">192.168.121.132</font>,用來驗證TLS加密遠程鏈接A上的Docker;
  3. 在A機器執行如下命令,將A上的<font color="blue">ca.pem、cert.pem、key.pem</font>這三個文件複製到B機器的<font color="blue">/root/work</font>目錄(請提早建好此目錄):
scp /root/work/ca.pem root@192.168.121.132:/root/work \
&& scp /root/work/cert.pem root@192.168.121.132:/root/work \
&& scp /root/work/key.pem root@192.168.121.132:/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 "\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遠程鏈接是,本文能給您提供參考。

相關文章
相關標籤/搜索