通信安全—docker建立用戶端與服務端TLS證書連接配接
- 一、TLS證書的作用
- 二、建立證書
-
- 1、建立目錄
- 2、建立私鑰
- 3、建立證書
- 4、建立擴充配置檔案
- 三、簽署證書
- 四、Docker中配置TLS證書
- 五、測試
- 擴充一:指令示範
- 擴充二:原理說明
-
- 大概流程
-
- (1)什麼叫做秘鑰
- (2)什麼叫簽名
- (3)什麼是hash值
- (4)證書
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxMGVPJzZE9UNNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3UWZlRmY3QmM2ADO1ImZ5EDMwQDNjNGZxADNllTZwQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一、TLS證書的作用
在遠端上調用Docker時,若沒有設定TLS證書,那麼docker能被所有人調用,而TLS的作用就是限制指定的主機對Docker進行遠端調用,進而保證docker的安全。
二、建立證書
使用openssl來建立CA,并簽署秘鑰/證書。
1、建立目錄
首先建立一個certs目錄,并内置三個子目錄 ca、client、server,分别用來存放證書,用戶端密鑰,服務端密鑰。
### 在登入使用者下遞歸建立三個目錄
mkdir -p ~/certs/{ca,client,server}
2、建立私鑰
運作openssl建立CA秘鑰,并将CA憑證儲存在~/certs/ca 目錄下。
###建立密鑰ca-key.pem,用于建立對應的證書
openssl genrsa -out ~/certs/ca/ca-key.pem 2048
3、建立證書
通過建立的密鑰,建立
###建立證書:ca.pem
openssl req -x509 -new -nodes -key ~/certs/ca/ca-key.pem \ -days 10000 -out ~/certs/ca/ca.pem -subj '/CN=docker-CA'
4、建立擴充配置檔案
建立一個用于client的openssl配置檔案~/certs/client/openssl.cnf
###建立檔案:openssl.cnf
vim ~/certs/client/openssl.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
建立一個用于server的openssl配置檔案~/certs/server/openssl.cnf
alt_names中的ip為Docker Server的ip,即client需要通路的ip,若有多個docker服務,此處填寫多個,否則client将無法通路Docker Server
###建立配置檔案:openssl.cnf
vim ~/certs/server/openssl.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = docker.local
IP.1 = 192.168.9.1
IP.2 = 192.168.9.2
三、簽署證書
為服務端建立并簽署證書:
- ~/certs/server/key.pem
- ~/certs/server/cert.csr
- ~/certs/server/cert.pem
###建立服務端
openssl genrsa -out ~/certs/server/key.pem 2048
openssl req -new -key ~/certs/server/key.pem \
-out ~/certs/server/cert.csr \
-subj '/CN=docker-server' -config ~/certs/server/openssl.cnf
openssl x509 -req -in ~/certs/server/cert.csr -CA ~/certs/ca/ca.pem \
-CAkey ~/certs/ca/ca-key.pem -CAcreateserial \
-out ~/certs/server/cert.pem -days 365 -extensions v3_req \
-extfile ~/certs/server/openssl.cnf
為用戶端建立并簽署證書:
- ~/certs/client/key.pem
- ~/certs/client/cert.csr
- ~/certs/client/cert.pem
$ openssl genrsa -out ~/certs/client/key.pem 2048
$ openssl req -new -key ~/certs/client/key.pem -out ~/certs/client/cert.csr \
-subj '/CN=docker-client' -config ~/certs/client/openssl.cnf
$ openssl x509 -req -in ~/certs/client/cert.csr -CA ~/certs/ca/ca.pem \
-CAkey ~/certs/ca/ca-key.pem -CAcreateserial \
-out ~/certs/client/cert.pem -days 365 -extensions v3_req \
-extfile ~/certs/client/openssl.cnf
建立成功後可見的目錄結構:
├── ca
│ ├── ca-key.pem
│ ├── ca.pem
│ └── ca.srl
├── client
│ ├── cert.csr
│ ├── cert.pem
│ ├── key.pem
│ └── openssl.cnf
└── server
├── cert.csr
├── cert.pem
├── key.pem
└── openssl.cnf
四、Docker中配置TLS證書
檢視配置檔案位置:
systemctl show --property=FragmentPath docker
回顯:FragmentPath=/lib/systemd/system/docker.service
配置檔案中開啟TLS,并配置服務端證書,将上一步生成好的server證書和ca.pem拷貝至/etc/docker/ssl
替換配置檔案13行:/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ssl/ca.pem --tlscert=/etc/docker/ssl/cert.pem --tlskey=/etc/docker/ssl/key.pem
###這是複雜的修改:此處不解釋
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock \
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
--init-path=/usr/libexec/docker/docker-init-current \
--seccomp-profile=/etc/docker/seccomp.json \
--tlsverify \
--tlscacert=/etc/docker/ssl/ca.pem \
--tlscert=/etc/docker/ssl/cert.pem \
--tlskey=/etc/docker/ssl/key.pem \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
$REGISTRIES
修改之後重新加載systemd和Docker服務
###重載服務配置檔案
sudo systemctl daemon-reload
###重新開機服務
sudo systemctl restart docker
五、測試
用戶端:未使用TLS證書,通路遠端docker
用戶端:使用TLS證書通路遠端Docker
擴充一:指令示範
###檢視CRL分發點在證書X509v3詳細資訊(client-cert.pem)
openssl x509 -in client-cert.pem -noout -text
###撤銷用戶端證書(client-cert.pem)
openssl ca -config ./openssl.cnf -revoke client-cert.pem
###驗證證書是否有效
openssl verify -CAfile ca.pem client-cert.pem
### 立即撤銷了用戶端的通路權限(有問題,沒搞懂)
openssl ca -config intermediate/openssl.cnf -revoke intermediate/certs/[email protected]
###設定防火牆通路規則:Iptables
##啟動防火牆
systemctl start firewalld
## 然後,在主控端的 firewalld 上做 IP 通路控制即可。(source address 是用戶端位址)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.88.77" port protocol="tcp" port="2375" accept"
firewall-cmd --reload
##用戶端操作實作遠端調用
docker -H tcp://192.168.88.67 images
擴充二:原理說明
對稱和非對稱秘鑰雙重加密的流程圖
大概流程
- 先對明文—>對稱加密—>形成密文和對稱秘鑰
- 然後将對稱秘鑰+簽名—>非對稱加密(私鑰加密)—>形成加密的秘鑰
- 使用hash算法算出hash值
- 最後将密文、加密的秘鑰、hash值傳給對方
- 對方收到這三樣資料
- 對加密的秘鑰—>非對稱解密(公鑰解密)—>解密出對稱秘鑰和簽名(簽名用于身份認證)
- 使用對稱秘鑰—>對稱解密—>解密出明文
-
對明文使用hash算法,對比傳來的hash值
一樣說明沒有被改動,讀取資料;反之被改的,棄掉資料
(1)什麼叫做秘鑰
對稱秘鑰(AES、DES、3DES) 相對于家裡的鎖和對應的鑰匙 效率高,但不安全。
非對稱秘鑰(rsa,公鑰-私鑰)相當于古代的虎符,不能從私鑰推導出公鑰。
效率不高(需要加密,轉換慢)。
(2)什麼叫簽名
簽名就是身份資訊。
比如:使用支付寶轉賬時,誰轉給了商家,轉賬的誰就是簽名。
(3)什麼是hash值
Hash算法是一個廣義的算法,在這裡做數字簽名來保障資料傳遞的安全性,如何確定資料的安全性,通過hash值對比确定資料完整性和安全性。
(4)證書
證書格式:x509(國際标準),需要機構CA頒發。
CA:電子認證服務,證書頒發機構,是受信任的第三方,承擔公鑰體系中的公鑰的合法性建議的責任。
首先CA先頒發ca證書,然後用證書和相關資訊找CA頒發server證書、client證書,cilent證書要推送給client。