天天看點

通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

通信安全—docker建立用戶端與服務端TLS證書連接配接

  • 一、TLS證書的作用
  • 二、建立證書
    • 1、建立目錄
    • 2、建立私鑰
    • 3、建立證書
    • 4、建立擴充配置檔案
  • 三、簽署證書
  • 四、Docker中配置TLS證書
  • 五、測試
  • 擴充一:指令示範
  • 擴充二:原理說明
    • 大概流程
      • (1)什麼叫做秘鑰
      • (2)什麼叫簽名
      • (3)什麼是hash值
      • (4)證書
通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

一、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
           

三、簽署證書

為服務端建立并簽署證書:

  1. ~/certs/server/key.pem
  2. ~/certs/server/cert.csr
  3. ~/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
           

為用戶端建立并簽署證書:

  1. ~/certs/client/key.pem
  2. ~/certs/client/cert.csr
  3. ~/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

通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

用戶端:使用TLS證書通路遠端Docker

通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

擴充一:指令示範

###檢視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

           
通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

擴充二:原理說明

對稱和非對稱秘鑰雙重加密的流程圖

通信安全—docker建立用戶端與服務端TLS證書連接配接一、TLS證書的作用二、建立證書三、簽署證書四、Docker中配置TLS證書五、測試擴充一:指令示範擴充二:原理說明

大概流程

  1. 先對明文—>對稱加密—>形成密文和對稱秘鑰
  2. 然後将對稱秘鑰+簽名—>非對稱加密(私鑰加密)—>形成加密的秘鑰
  3. 使用hash算法算出hash值
  4. 最後将密文、加密的秘鑰、hash值傳給對方
  5. 對方收到這三樣資料
  6. 對加密的秘鑰—>非對稱解密(公鑰解密)—>解密出對稱秘鑰和簽名(簽名用于身份認證)
  7. 使用對稱秘鑰—>對稱解密—>解密出明文
  8. 對明文使用hash算法,對比傳來的hash值

    一樣說明沒有被改動,讀取資料;反之被改的,棄掉資料

(1)什麼叫做秘鑰

對稱秘鑰(AES、DES、3DES) 相對于家裡的鎖和對應的鑰匙 效率高,但不安全。

非對稱秘鑰(rsa,公鑰-私鑰)相當于古代的虎符,不能從私鑰推導出公鑰。

效率不高(需要加密,轉換慢)。

(2)什麼叫簽名

簽名就是身份資訊。

比如:使用支付寶轉賬時,誰轉給了商家,轉賬的誰就是簽名。

(3)什麼是hash值

Hash算法是一個廣義的算法,在這裡做數字簽名來保障資料傳遞的安全性,如何確定資料的安全性,通過hash值對比确定資料完整性和安全性。

(4)證書

證書格式:x509(國際标準),需要機構CA頒發。

CA:電子認證服務,證書頒發機構,是受信任的第三方,承擔公鑰體系中的公鑰的合法性建議的責任。

首先CA先頒發ca證書,然後用證書和相關資訊找CA頒發server證書、client證書,cilent證書要推送給client。