TLS加密遠程連接Docker

来源:https://www.cnblogs.com/bolingcavalry/archive/2019/09/07/11482827.html
-Advertisement-
Play Games

"《Docker遠程連接設置》" 一文講述了開啟Docker遠程連接的方法,但那種方法不安全,因為任何客戶端都可以通過Docker服務的IP地址連接上去,今天我們就來學習Docker官方推薦的安全的遠程連接方式:TLS加密連接,通過證書來保證安全性。 官方文檔 這裡是官方的權威文檔:https:// ...


《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機器)

  4. 在Linux伺服器上建一個目錄,進入此目錄,我這裡是/root/work
  5. 創建根證書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證書;

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

此時生成的server-key.pem文件就是服務端私鑰;

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

此時生成的server.csr文件就是服務端證書;

  1. 生成簽名過的服務端證書(期間會要求輸入密碼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文件就是已蓋章生效的服務端證書;

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

此時生成的key.pem文件就是客戶私鑰;

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

此時生成的client.csr文件就是客戶端證書簽名請求;

  1. 生成名為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,找到下圖紅框中的內容:
    在這裡插入圖片描述
  2. 將上圖紅框中的一整行內容替換為以下內容:
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 "\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遠程連接是,本文能給您提供參考。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 - 簡介 我們在寫代碼的過程中, 不可避免的重度依賴所處的開發環境. 本文重點帶大家在 Window 搭建 C 簡單控制台項目. 當作存檔, 用於記錄項目搭建各種重覆操作. 在詳細過程之前, 我們約定下基礎環境 Best new version Window Best new version ...
  • lambda是表達式,用於創建匿名函數,可以和filter、map、reduce配合使用。 本文環境Python3.7。 ...
  • const在不同位置時的不同意義 指針類型前:聲明一個指向常量的指針,程式中不能通過指針來改變它所指向的值,但指針本身的值可以改變,即指針可以指向其他數據; \" "號和指針名之間,聲明一個指針常量(常指針),指針本身的值不可改變,即不能指向其他數據,但指向的數據的值可以改變; 兩個地方都加,聲明指 ...
  • 0907自我總結 重新整理django中Auth模塊 一.設置 預設Auth表單 預設是使用自帶的 表單 自定義Auth表單 一定要在 中告訴 ,我現在使用我新定義的 表來做用戶認證。寫法如下: 在 創建表單模型可以對 進行繼承因為我們可以從源碼中看出來auth自帶的user表示繼承 類,所有我們可 ...
  • 一、函數名 ​ 函數名是⼀個變數, 但它是⼀個特殊的變數, 與括弧配合可以執⾏函數的變數。 1. 函數名的記憶體地址 2. 函數名可以賦值給其他變數 3. 函數名可以當做函數的參數 4. 函數名可以作為函數的返回值 二、閉包 1. 定義 ​ 如果在一個內部函數里,對在外部作用於(但不是在全局作用域)的 ...
  • Struts中的標簽可分為2類: 通用|普通標簽 包括流程式控制制標簽、數據訪問標簽 UI標簽 包括表單標簽、非表單標簽 Struts2中的標簽均帶有首碼s。 常用的流程式控制制標簽 1、if-elseif-else標簽 條件判斷 test指定條件,滿足條件時,顯示標簽體的內容。 2、iterator標簽 ...
  • 周末手擼管理系統(一) 已完成 大體模板 用戶登入註冊 明天加商品訂單商品進去 完成效果圖 1.首先進行設置 2.創建模型以及form組件 userinfo_form.py 3.頁面 4.路由 5.視圖 `大家周末娛樂` ...
  • 線性表,即線性存儲結構,將具有“一對一”關係的數據“線性”地存儲到物理空間中,這種存儲結構就稱為線性存儲結構,簡稱線性表。 註意:使用線性表存儲的數據,要求數據類型必須一致,線性表存儲的數據,要麼全不都是整形,要麼全部都是字元串。一半是整形,另一半是字元串的一組數據無法使用線性表存儲。 線性表存儲數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...