Docker開啟遠(yuǎn)程連接并實(shí)現(xiàn)安全通信詳解
正文
Docker 使用了客戶端 -- 服務(wù)端模型。服務(wù)端對(duì)外提供 REST API。
默認(rèn)安裝方式,客戶端和服務(wù)端在同一臺(tái)主機(jī)上,通過(guò)本地安全 PIC Socket 進(jìn)行通信,例如 Linux 中 /var/run/docker.sock。我們還可以配置它們通過(guò)網(wǎng)絡(luò)進(jìn)行通信。它們默認(rèn)網(wǎng)絡(luò)配置使用不安全的 HTTP Socket,端口為 2375。
在生產(chǎn)環(huán)境這是不能接受的。通過(guò) TLS 的方式連接解決這個(gè)問題。生產(chǎn)環(huán)境中推薦這種配置,即使在可信內(nèi)網(wǎng)中,也建議使用該方式!
Docker 為 TLS 提供兩種模式
- daemon 模式:Docker daemon 只接收認(rèn)證客戶端的請(qǐng)求。
- 客戶端模式:Docker 客戶端只接收認(rèn)證的 daemon 發(fā)起的請(qǐng)求。
同時(shí)使用它們,能提供最高的安全等級(jí)。
下面開始介紹如何完成 TLS 的配置,總體步驟如下。
- 創(chuàng)建 CA 。
- 為 daemon 創(chuàng)建密鑰對(duì)。
- 為客戶端創(chuàng)建密鑰對(duì)。
- 分發(fā)密鑰
- Docker 配置 TLS 模式
創(chuàng)建 CA
在 node2 運(yùn)行下面的命令。
- 為 CA 創(chuàng)建私鑰(過(guò)程中需要設(shè)置密碼)
$ openssl genrsa -aes256 -out ca-key.pem 4096
當(dāng)前目錄新增一個(gè) ca-key.pem 文件,這是 CA 私鑰。
- 用 CA 私鑰生成公鑰(過(guò)程需要輸入之前的密碼)
$ openssl req -new -x509 -days 730 -key ca-key.pem -sha256 -out ca.pem
當(dāng)前目錄新增一個(gè) ca.pem 文件,這是 CA 公鑰,也叫”證書“。
為 daemon 創(chuàng)建密鑰對(duì)
在 node3 運(yùn)行下面的命令。
- 為 daemon 創(chuàng)建私鑰。
$ openssl genrsa -out daemon-key.pem 4096
當(dāng)前目錄新增一個(gè) daemon-key.pem 文件,這是 daemon 節(jié)點(diǎn)的私鑰。
- 創(chuàng)建證書簽名請(qǐng)求并發(fā)送到 CA。
$ openssl req -subj "/CN=daemon" \ -sha256 -new -key daemon-key.pem -out daemon.csr
當(dāng)前目錄新增一個(gè) daemon.csr 文件,這是 CSR。
為證書添加屬性。 創(chuàng)建文件,名為 extfile.cnf。示例中使用了 daemon 節(jié)點(diǎn)的 DNS 名稱和 IP。每個(gè)人的環(huán)境中可能值不同。
$ subjectAltName = DNS:daemon,IP:192.168.57.3 extendedKeyUsage = serverAuth
- 生成證書 使用 CSR 文件、CA 密鑰、extfile.cnf 文件完成簽名和 daemon 證書配置。
$ openssl x509 -req -days 730 -sha256 \ -in daemon.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out daemon-cert.pem -extfile extfile.cnf
此時(shí),已經(jīng)擁有一個(gè)可用 CA ,同時(shí) daemon 的 Node3 節(jié)點(diǎn)也有了自己的密鑰。
繼續(xù)下面內(nèi)容前,刪除 CSR 和 extfile.cnf。
$ rm daemon.csr extfile.cnf
為客戶端創(chuàng)建密鑰對(duì)
在 node3 運(yùn)行下面的命令。
為客戶端創(chuàng)建密鑰
$ openssl genrsa -out client-key.pem 4096
當(dāng)前目錄新增一個(gè) client-key.pem 文件。
創(chuàng)建 CSR。
$ openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr
當(dāng)前目錄新增一個(gè) client.csr 文件。
創(chuàng)建 extfile.cnf 文件 將證書設(shè)置為客戶端認(rèn)證可用。文件內(nèi)容如下。
extendedKeyUsage = clientAuth
生成證書 使用 CSR 文件、CA 密鑰、extfile.cnf 文件完成簽名和客戶端證書配置。
$ openssl x509 -req -days 730 -sha256 \ -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out client-cert.pem -extfile extfile.cnf
刪除 CSR 和 extfile.cnf ,因?yàn)椴粫?huì)用到它們了。 $ rm client.csr extfile.cnf
此時(shí),在工作目錄下應(yīng)該有如下 7 個(gè)文件。
ca-key.pem ca.pem ca.srl client-cert.pem client-key.pem daemon-cert.pem daemon-key.pem
分發(fā)密鑰
- 從 CA (剛才證書生成的 node) 復(fù)制 ca.pem、daemon-cert.pem、daemon-key.pem 到 node3(daemon 節(jié)點(diǎn))。
- 從 CA (剛才證書生成的 node) 復(fù)制 ca.pem、client-cert.pem、client-key.pem 到 node1(客戶端節(jié)點(diǎn))。
這里用 scp 完成復(fù)制操作。在 scp 的過(guò)程中對(duì)部分文件進(jìn)行了重命名。重命名非常重要,因?yàn)?Docker 對(duì)文件命名有規(guī)范。
// Daemon files $ scp ./ca.pem ubuntu@daemon:/home/ubuntu/.docker/ca.pem $ scp ./daemon-cert.pem ubuntu@daemon:/home/ubuntu/.docker/cert.pem $ scp ./daemon-key.pem ubuntu@daemon:/home/ubuntu/.docker/key.pem // Client files $ scp ./ca.pem ubuntu@client:/home/ubuntu/.docker/ca.pem $ scp ./client-cert.pem ubuntu@client:/home/ubuntu/.docker/cert.pem $ scp ./client-key.pem ubuntu@client:/home/ubuntu/.docker/key.pem
Docker 配置 TLS 模式
進(jìn)入 Node3(daemon 節(jié)點(diǎn))完成下面的配置。
找到 daemon.json 配置文件。在 Linux 上位于 /etc/docker,編輯 daemon.json 文件,添加如下行。
"tls": true, "tlsverify": true, "tlscacert": "/home/ubuntu/.docker/ca.pem", "tlscert": "/home/ubuntu/.docker/cert.pem", "tlskey": "/home/ubuntu/.docker/key.pem", "hosts": ["tcp://你的 daemon 的IP:2376"]
這些 daemon.json 中的參數(shù)意義如下。
- tlsverify :開啟 TLS 認(rèn)證。
- tlscacert :指定daemon可信任的 CA。
- tlscert :向 Docker 指定 daemon 證書的位置。
- tlskey :向 Docker 指定daemon私鑰的位置。
- hosts :向 Docker 指定需要綁定 daemon 的具體 Socket。
警告:部分版本的 Linux 系統(tǒng)運(yùn)行 systemd 的,不允許在 daemon.json 中使用“hosts”選項(xiàng)。替換方案是在 systemd 配置文件中進(jìn)行重寫。創(chuàng)建名為 /etc/systemd/system/docker.service.d/override.conf 的新文件。在其中加入下列 3 行內(nèi)容,然后保存。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://你的 daemon 的IP:2376”
重啟 daemon 。
$ systemctl daemon-reload $ systemctl restart docker.service
如果重啟失敗且錯(cuò)誤為
docker.service: Main process exited, code=exited, status=1/FAILURE
為了讓它工作,編輯 /lib/systemd/system/docker.service
,修改如下內(nèi)容之后再次嘗試重啟。
# 修改前: ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock # 修改后: ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
理論上,/etc/systemd/system/docker.service.d/override.conf
與 /etc/docker/daemon.json
可以同時(shí)修改,但是并不建議這么做,如果僅修改 /etc/docker/daemon.json
沒有出現(xiàn)任何問題,那就太棒了。
進(jìn)入 Docker 客戶端節(jié)點(diǎn),配置臨時(shí)環(huán)境變量。
$ export DOCKER_HOST=tcp://你的 daemon IP 地址:2376
嘗試運(yùn)行 $ docker version
,會(huì)出現(xiàn)錯(cuò)誤,類似無(wú)法連接 daemon。接著設(shè)置另一個(gè)環(huán)境變量。
$ export DOCKER_TLS_VERIFY=1
它是告知 Docker 客戶端使用證書對(duì)全部命令進(jìn)行簽名,此時(shí)再試試 $ docker version
!
?? 恭喜。你成功完成了客戶端與 daemon 完成安全的通信。
以上就是Docker開啟遠(yuǎn)程連接并實(shí)現(xiàn)安全通信詳解的詳細(xì)內(nèi)容,更多關(guān)于Docker遠(yuǎn)程連接安全通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker-compose.yml參數(shù)的用法(配置文件)
這篇文章主要介紹了docker-compose.yml參數(shù)的用法(配置文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Docker部署web項(xiàng)目的實(shí)現(xiàn)
這篇文章主要介紹了Docker部署web項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Docker鏡像構(gòu)建之docker commit的使用
本文主要介紹了Docker鏡像構(gòu)建之docker commit的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Docker consul的容器服務(wù)更新與發(fā)現(xiàn)的問題小結(jié)
這篇文章主要介紹了Docker consul的容器服務(wù)更新與發(fā)現(xiàn),講解了服務(wù)注冊(cè)與發(fā)現(xiàn)的基本概念講解,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08如何使用?docker?搭建一個(gè)?mysql?服務(wù)
這篇文章主要介紹了如何使用?docker?搭建一個(gè)mysql服務(wù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09詳解Docker鏡像提交命令commit的工作原理和使用方法
這篇文章主要介紹了詳解Docker鏡像提交命令commit的工作原理和使用方法,可以依據(jù)這個(gè)容器創(chuàng)建本地鏡像,并可把這個(gè)鏡像推送到Docker hub中,以便在網(wǎng)絡(luò)上下載使用,感興趣的可以了解一下2018-11-11將Docker容器打包并在其他服務(wù)器上運(yùn)行的全過(guò)程
Docker容器使得應(yīng)用程序的部署和管理變得更加簡(jiǎn)單和高效,有時(shí),我們可能需要將一個(gè)運(yùn)行中的Docker容器打包,并在其他服務(wù)器上運(yùn)行,本文將詳細(xì)介紹如何實(shí)現(xiàn)這一過(guò)程,需要的朋友可以參考下2024-05-05Dockerfile指令與基本結(jié)構(gòu)的講解
今天小編就為大家分享一篇關(guān)于Dockerfile指令與基本結(jié)構(gòu)的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03使用docker的python基礎(chǔ)鏡像時(shí)要指定patch版本原理
這篇文章主要為大家介紹了使用docker的python基礎(chǔ)鏡像時(shí)要指定patch版本原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10