Docker 守護程序+遠端連線+安全訪問 (完整收藏版)
一 Docker服務端,客戶端和CA證書
預設情況下,Docker通過非聯網的Unix套接字執行。它還可以選擇使用HTTP套接字進行通訊。
這裡有三個角色,Docker服務端和Docker客戶端和CA簽名的證書
- Docker服務端:對應執行Docker守護程式的主機
- 通過開放埠(一般為2376)支援遠端連線
- 通過指定tlsverify標誌並將Docker的tlscacert標誌指向可信的CA證書來啟用TLS以實現安全訪問(僅允許由該CA簽名的證書進行身份驗證的客戶端連線)
- Docker客戶端:即預設情況下的Docker主機
- 當使用證書連線時,僅能連線到具有該CA簽名的證書的伺服器
- CA簽名的證書
- 作用:服務端和客戶端證書都只對應一份信任列表,信任列表裡是服務端的資訊(如ip或域名等等),服務端持有服務端證書,僅接受持有客戶端證書的主機訪問(這裡可以再加上其他的限制,詳情見下文)
注意:
Docker服務端也可以不開啟TLS驗證,不過這樣子很不安全,生產環境下應當儘量避免.如果只是試驗性的,可以指定關閉TLS驗證,但只對特定主機開放,方法見後文
/etc/docker/daemon.json
配置相關如果Docker服務端沒有開啟TLS驗證,則Docker客戶端不需要使用證書連線.但如果客戶端不使用證書連線開啟了TLS驗證的服務端,則會報錯,如下:
Get http://遠端主機ip:2376/v1.38/version: 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?
- 如果Docker客戶端連線時使用的證書內不含目的主機的資訊,則會提示對方主機不在證書信任列表內,訪問失敗
二 使用OpenSSL建立CA和服務端金鑰key
注意:將以下示例中的所有$HOST
例項替換為Docker守護程式主機的域名(DNS name)(由於我沒有配域名,所以直接用主機ip代替了,有影響的地方我會再做提醒)
以下步驟在Docker服務端進行:
步驟1:生成CA私鑰ca-key.pem
- 說明:
ca-key.pem是一個臨時檔案,最後可以刪除。 - 指令:
openssl genrsa -aes256 -out ca-key.pem 4096
例子如下,需要設定密碼並驗證
$ openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
............................................................................................................................................................................................++
........++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:
步驟2:使用CA私鑰生成自簽名CA證書ca.pem
- 說明:生成證書時,通過-days 365設定證書的有效期。單位為天,預設情況下為30天。有了CA證書後,就可以建立伺服器金鑰和證書籤名請求(CSR)了
- 指令:
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
- 例子如下,需要驗證密碼並輸入資訊,注意”Common Name”設定為伺服器所在主機的域名(我只填了Country Name 為CN,Province Name為Guangdong,後面直接回車也沒關係,反正也只是自己用的證書)
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Queensland
Locality Name (eg, city) []:Brisbane
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
Organizational Unit Name (eg, section) []:Sales
Common Name (e.g. server FQDN or YOUR name) []:$HOST
Email Address []:[email protected]
步驟3:生成伺服器私鑰server-key.pem和證書籤名請求server-csr
- 說明:
CSR:Certificate Signing Request,證書籤名請求,server-csr是一個臨時檔案,生成server-cert.pem以後,可以刪除。
這裡分兩小步
- 第一步生成伺服器私鑰server-key.pem
- 第二步使用伺服器私鑰另加CN資訊生成證書籤名請求server-csr.pem
- 如下(注意這裡的CN資訊對應的是伺服器所在主機域名,如果沒有的話也沒關係,可以通過下一步的
extfile.cnf
配置IP地址連線):
$ openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.....................................................................++
.................................................................................................++
e is 65537 (0x10001)
$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
步驟4:編寫extfile.cnf(重要)
說明:這個檔案用於指定下一步生成簽名證書的一些屬性配置,這裡我們主要用到兩個屬性,如果要其他要求(如限制指定ip範圍的客戶端才能連線)的可以看OpenSSL x509v3_config文件
- subjectAltName
主題備選名稱,是有點像上一步生成server.csr時所用的選項-subj "/CN=$HOST"
的東西,這個更像一個說明補充,這裡可以填信任的DNS域名和主機IP等等,因為沒有域名,所以我只填了Docker伺服器的主機IP
另外,需要特別注意,這裡對應生成的是一份信任列表,這裡所說的信任是對服務端的信任,所以填的是服務端的資訊
(如域名,IP),我之前看到有文章說這裡的列表是客戶端的列表,只有在列表中的客戶端才能訪問伺服器,這種說法是錯誤,在使用證書連線到伺服器時,會報錯說伺服器IP不在信任列表中( 如遠端主機ip為ip3,證書的信任列表為ip1和ip2時,若使用該證書訪問遠端主機,則會報錯x509: certificate is valid for ip1, ip2, not ip3
) - extendedKeyUsage
擴充套件金鑰用法,此擴充套件包含一個用法列表,用於指示證書公鑰可用於的目的
- subjectAltName
- 如下
1 將Docker守護程式金鑰的擴充套件使用屬性設定為僅用於伺服器身份驗證
2 將域名(DNS Name)$HOST和IP為10.10.10.20(私有地址,用於區域網登入)和127.0.0.1(本地地址,用於本機登入)和公網ip(用於遠端登入)
注意:
事實上只配一個公網IP就行了,其他的視實際需求而定,本機的話一般不那麼麻煩,通過docker本身的配置即可使用本機控制,這裡配127.0.0.1主要是為了測試是否能連通,如果只配了私有地址則只有本區域網可訪問,安全性更高
echo extendedKeyUsage = serverAuth >> extfile.cnf
echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1,IP:公網ip >> extfile.cnf
步驟5:使用CA證書生成伺服器簽名證書server-cert.pem
注意,上面總共生成了兩大模組的檔案和一個extfile.cnf配置檔案,這三部分之間是彼此獨立的,到了這一步,也是最後一步才真正做了整合.
這裡要用到的有,(1)CA私鑰ca-key.pem和CA簽名檔案ca.pem,(2)證書籤名請求server-csr(3)配置檔案extfile.cnf
指令如下:
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
例:
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=your.host.com
Getting CA Private Key
Enter pass phrase for ca-key.pem:
至此,Docker服務端金鑰建立完畢
三 利用CA建立客戶端金鑰key
注意:生成金鑰需要使用CA私鑰和簽名檔案,為簡化流程,避免CA檔案在服務端和客戶端之間的傳輸,以下步驟仍在Docker服務端進行
建立客戶端金鑰的過程和服務端類似,CA相關已經建立好了,extfile.cnf配置檔案也簡單很多,具體如下
步驟1:生成客戶端私鑰key.pem和證書籤名請求client-csr
如下
$ openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
.........................................................++
................++
e is 65537 (0x10001)
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
步驟2:編寫擴充套件配置檔案extfile.cnf
注意,如果是在剛才建立伺服器私鑰的資料夾下,應該還有原來的extfile.cnf檔案,為避免覆寫,可以先執行重新命名
mv extfile.cnf extfile.cnf.old
建立擴充套件配置檔案並使金鑰適用於客戶端身份驗證的指令如下:
echo extendedKeyUsage = clientAuth >> extfile.cnf
步驟3:生成簽名檔案cert.pem
如下
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:
四 修改檔案許可權
步驟1:刪除兩個證書籤名請求檔案
rm -v client.csr server.csr
步驟2:修改金鑰檔案許可權為只由所有者讀取
chmod -v 0400 ca-key.pem key.pem server-key.pem
步驟3:修改證書檔案許可權為只讀
chmod -v 0444 ca.pem server-cert.pem cert.pem
五 啟動Docker守護程序
啟動Docker守護程序有兩種方法,直接用帶參指令或者修改daemon.json配置檔案,另外,還有一種方式使用systemctl修改docker.service檔案,這種不推薦,這裡不作介紹.需要注意的是,不管是哪一種方法,只要對同一屬性做了配置,都會導致衝突而啟動失敗.所以建議只使用一種.
注意,監聽unix:///var/run/docker.sock
是為了實現本機docker直接控制,監聽tcp://0.0.0.0:2376
表示監聽2376埠所有連線,又這裡開啟了TLS驗證,則會根據我們給定的TLS檔案去做驗證
服務端需要的TLS檔案有CA證書ca.pem,服務端證書server-cert.pem,服務端金鑰server-key.pem
下面的兩種方法的介紹
1 指令啟動
dockerd --tlsverify=true \
--tlscacert=/opt/docker-ssh/ca.pem \
--tlscert=/opt/docker-ssh/server-cert.pem \
--tlskey=/opt/docker-ssh/server-key.pem \
--host tcp://0.0.0.0:2376 \
--host unix:///var/run/docker.sock
2 daemon.json配置啟動
配置/etc/docker/daemon.json
檔案如下,注意,映象地址與本文無關,可不配置
{
"tlsverify": true,
"tlscacert": "/opt/docker-ssh/ca.pem",
"tlscert": "/opt/docker-ssh/server-cert.pem",
"tlskey": "/opt/docker-ssh/server-key.pem",
"hosts": ["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"registry-mirrors": ["https://5ehijrnq.mirror.aliyuncs.com"]
}
然後通過systemctl正常啟動,指令如下
systemctl restart docker
六 驗證遠端控制
客戶端需要的TLS檔案有CA證書ca.pem,客戶端證書cert.pem,客戶端金鑰key.pem
連線的指令格式如下,以docker version為例,其中$HOST為遠端主機ip
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=$HOST:2376 version
結果如下圖:
將version換成其他即可如在本機一樣控制遠端docker
七 參考
相關推薦
Docker 守護程序+遠端連線+安全訪問 (完整收藏版)
一 Docker服務端,客戶端和CA證書 預設情況下,Docker通過非聯網的Unix套接字執行。它還可以選擇使用HTTP套接字進行通訊。 這裡有三個角色,Docker服務端和Docker客戶端和CA簽名的證書 Docker服務端:對應執行
docker使用ssh遠端連線容器(沒錢買伺服器又不想安裝虛擬機器患者必備)
沒錢買伺服器又不想安裝虛擬機器怎麼辦? 我們知道docker是可以用exec來直接訪問容器的,但是還不夠high,有時候要模擬伺服器的登入總不能用docker exec吧,來吧,老司機帶你飛! 以centos為例,需要幾步操作 1.安裝openssh-server 2.初始化root使用者密碼 3.
Docker守護程序
其中守護程序有兩種方式,一種是使用基本的命令 [root@localhost ~]# docker run -i -t 映象名 /bin/bash 然後使用ctrl+p,ctrl+q返回。 [root@localhost ~]# docker ru
ubuntu中docker守護程序無法啟動
在阿里雲上安裝了docker 但是無法啟動服務, 執行命令 service docker start 系統提示 start: Job failed to start 執行docker -d 出現如下提示:FATA[0000] Shutting do
docker 安裝MySQL遠端連線(阿里雲伺服器)
1. 下載Mysql的Docker映象:$ docker search mysql (搜尋mysql映象) $ docker pull mysql (下載mysql映象,預設最新版本) 2. 執行映象,設定root賬號初始密碼(123456),對映本地宿主機埠3306到Docker埠3306。測試過程沒有
mysql遠端連線和訪問慢的解決方法
轉載1:今天公司的網路做了調整,造成原本連線很快的mysql伺服器,連線速度奇慢。以前幾十毫秒的連線現在完成一次要近5秒鐘,在排除了網路問題後,只有從mysql下手。原來每次訪問db,mysql就會試圖去解析來訪問的機器的domain name,如果這時解析不料,等一段時間會失敗,資料才能被取過來。解決方
遠端連線webservice遇到無法訪問的問題解決辦法
如果在本地測試webservice可以執行,在遠端卻顯示“測試窗體只能用於來自本地計算機的請求”或者"The test form is only available for requests from the local machine. ",那是因為沒有開啟遠端訪問的
PHP-Websockets 上傳檔案2 優化支援php socket客戶端和websocket連線websocket伺服器 以守護程序方式執行編碼
WebsocketServer: users.php <?php class WebSocketUser { public $socket; public $id; public $headers = array(); public $handsh
DOCKER 建立 執行 授權遠端連線 MYSQL(阿里雲伺服器)
1.docker建立mysql sudo docker pull mysql 拉取mysql的映象 ubuntu 需要加sudo #-p 23306 :3306 這是 將mysql的3306埠對映到伺服器上的23306埠 #--name=stock_v2這個容器的名字 #MYSQ
開啟MySQL遠端訪問許可權允許遠端連線(解決Host is not allowed to connect to this MySQL server問題)
登陸mysql資料庫 [[email protected] data]# mysql -uroot -p123456 檢視user表 mysql> select host,user,password from user;
Docker學習之守護程序
在讀《第一本Docker書》這本教程時,遇到Docker守護程序這個概念。首先需要理解守護程序是什麼,自然也就知道Docker守護程序的含義。 守護程序來自於Linux系統下的一部分,對於不太熟悉Linux系統的我來說,暫時只要知道守護程序是幹什麼的就可以了,所以寫一下我在查閱資料後對守護程序的
yum 方式安裝MySQL5.7並配置遠端連線完整教程Linux(CentOS7)
轉載註明出處:https://blog.csdn.net/zouguo1211/article/details/83867896 前言 系統資訊:CentOS Linux release 7.5.1804 (Core) MySQL版本:mysql-5.7 接下來的操作均是
Linux 安裝Oracle11g完整安裝圖文教程另附基本操作(轉載),另附plsql遠端連線方法
1) 寫在前面: Good Good Study,Day Day up 2) 最近自己在搗鼓虛擬機器上安裝oracle,花了自己前前後後大概1周時間,差點放棄.還好堅持到了最後; 3) Linux 安裝Oracle11g完整安裝圖文教程 主要參考
長時間連線傳輸不斷守護程序命令
Linux使用screen實現程序守護 2018-02-08 分類:Linux 閱讀(371) 評論(0) 需求 在使用 SSH 或者telent 遠端登入到Linux 伺服器,執行一些需要很長時間才能完成的任務或者必須要長期不間斷執行的任務(比如系統備份、ftp
docker 建立mysql映象,併成功進行遠端連線
1.安裝 1.1 拉取映象 docker pull mysql 拉取成功可以驗證一下 docker images 1.2 建立並啟動一個mysql容器 docker run --name ly-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d
xshell一直連線中斷 守護程序
重新登入使用last指令檢視登入情況 pts的理解 who:檢視目前有誰線上 pts是所謂的偽終端或虛擬終端,具體表現就是你開啟一個終端,這個終端就叫pts/0,如果你再開啟一個終端,這個新的終端就叫pts /1。 比如我們使用 ps -ef | grep ngi
7、CentOS7 安裝Docker之擴充套件(設定守護程序對外開放)
設定守護程序對外開放 雖然預設下你的Docker daemon只允許在本機訪問,但有時候也有充足理由讓其他人訪問。你可能有什麼問題想讓其他人遠端除錯,或者你可能想允許DevOps工作流來啟動主機上的一個程序。 問題 你想對其
MySQL遠端訪問許可權 允許遠端連線
1 首先cd / 到根目錄,開啟mysql控制檯 登入資料庫 mysql -u root -p 2、授權遠端連線 mysql> use mysql; Database changed mysql> grant all privileges on *.* to [e
ConnMan連線管理守護程序
連線管理器(ConnMan)是一個連線管理守護程序(connmand),用於管理執行Linux作業系統的裝置中的Internet連線。它提供低記憶體消耗,並對網路條件變化進行快速,連貫,同步的反應。 ConnMan有各種外掛,是一個完全模組化的系統,可以擴充套件以支援各種有線或無線技術.外掛方法
sqlite3的程序安全訪問測試
前言 想寫個demo, 由C程式寫sqlite3資料庫中的表A, 由java程式去讀sqlite3資料庫中的表A. 這樣,就涉及到sqlite3的執行緒安全和程序安全訪問。 寫好測試程式後,跑起來,很失望。 sqlite3同一個表無法由2個程序同時讀寫表記錄。 總有一個程序會出現“dat