前言
在工作學(xué)習(xí)中,為了提高項(xiàng)目部署效率,一般會在Idea中直接使用Docker插件連接服務(wù)器Docker容器,然后將項(xiàng)目打包與DockerFile一起build成Docker鏡像部署運(yùn)行。但是不可能服務(wù)器總是跟著主機(jī)的,因此呢時常會面臨的一個問題就是從A端訪問B端服務(wù)器上的Docker從而引發(fā)的Docker的遠(yuǎn)程訪問問題。
由于在默認(rèn)情況下,Docker的守護(hù)進(jìn)程會生成一個socket文件來進(jìn)行本地進(jìn)程通信,而不會監(jiān)聽任何端口,因此大多數(shù)情況下我們只能在本地使用docker客戶端或者使用Docker API進(jìn)行操作。如果想在其他主機(jī)上操作Docker主機(jī),就需要讓Docker守護(hù)進(jìn)程監(jiān)聽一個端口,這樣才能實(shí)現(xiàn)遠(yuǎn)程通信。
但需要注意的是不要將此方式用在外部網(wǎng)絡(luò)環(huán)境,以免帶來安全問題,因?yàn)樵谕獠烤W(wǎng)絡(luò)環(huán)境下暴露端口是很危險的事,別人隨時能攻擊甚至竊取你的數(shù)據(jù)。因此官方也給出了詳細(xì)警告及處理信息:
?因此我們不能僅僅去配置遠(yuǎn)程訪問就完事了,還要用安全證書進(jìn)行配置才行。對此官網(wǎng)也給出了相應(yīng)的解決方式:配置CA證書密鑰
?下面,我們一步一步來~
開啟遠(yuǎn)程訪問(不安全)
根據(jù)官網(wǎng)方法,進(jìn)入docker.service文件,編輯并在ExecStart上添加配置 -H tcp://127.0.0.1:2375
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
這里相當(dāng)于開放了2375端口,因此除了配置文件以外還要在防火墻開放端口,云服務(wù)器還需要開放端口策略等等。
[root@VM-12-4-centos ~]# firewall-cmd --query-port=2375/tcp
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.
?
no #沒開啟
#開啟端口號
[root@VM-12-4-centos ~]# firewall-cmd --add-port=2375/tcp --permanent
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.
?
success
#重啟防火墻
[root@VM-12-4-centos ~]# firewall-cmd --reload
success
重啟服務(wù)使得更改后的配置生效,并查看docker啟動狀態(tài)
[root@VM-12-4-centos server]# systemctl daemon-reload
[root@VM-12-4-centos server]# systemctl restart docker
[root@VM-12-4-centos server]# systemctl status docker
● docker.service - Docker Application Container Engine
? Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
? Active: active (running) since Mon 2023-04-10 09:00:30 CST; 15s ago
? ? Docs: https://docs.docker.com
Main PID: 6425 (dockerd)
? Tasks: 51
? Memory: 56.1M
? CGroup: /system.slice/docker.service
? ? ? ? ? ├─6425 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
? ? ? ? ? ├─6741 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
? ? ? ? ? ├─6747 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
? ? ? ? ? ├─6855 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
? ? ? ? ? ├─6861 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
? ? ? ? ? ├─6967 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
? ? ? ? ? └─6983 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
安全訪問配置流程
1,在指定文件夾新建一個存放CA密鑰的文件夾,筆者這里再docker文件下存放。
[root@VM-12-4-centos server]# cd docker
[root@VM-12-4-centos docker]# ll
total 0
[root@VM-12-4-centos docker]# mkdir ca_key
[root@VM-12-4-centos docker]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 10 10:27 ca_key
[root@VM-12-4-centos docker]# cd ca_key
2,在Docker主機(jī)上通過命令生成CA私鑰和公鑰
執(zhí)行命令:openssl genrsa -aes256 -out ca-key.pem 4096
[root@VM-12-4-centos ca_key]# 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:
Verify failure
User interface error
139698349328272:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:pem_lib.c:385:
[root@VM-12-4-centos ca_key]# 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:
這里需要輸入密碼并確認(rèn),只要兩次輸入一致就行,否則會像重置密碼數(shù)據(jù)兩次新密碼一樣報(bào)驗(yàn)證錯誤。需要注意的是:Linux上并不會顯示輸入的密碼信息,因此要格外注意別輸錯了。
如果成功,該文件下就有了pem證書文件生成:
[root@VM-12-4-centos ca_key]# ll
total 4
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem
3,補(bǔ)全CA信息
執(zhí)行命令:openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem根據(jù)要求依次輸入訪問密碼、國家、省、市、組織名稱、單位名稱、隨便一個名字、郵箱等,需要這些信息作為證書申請。
[root@VM-12-4-centos ca_key]# 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) [XX]:CN
State or Province Name (full name) []:HUBei
Locality Name (eg, city) [Default City]:WuHan
Organization Name (eg, company) [Default Company Ltd]:ZC
Organizational Unit Name (eg, section) []:QA
Common Name (eg, your name or your server's hostname) []:192.168.98.128(ip地址)
Email Address []:8888888888@qq.com
現(xiàn)在我們有了CA,就可以創(chuàng)建服務(wù)器密鑰和證書簽名請求(CSR)。
Tips:確?!癈ommon Name”與用于連接Docker的主機(jī)名匹配,否則后續(xù)遠(yuǎn)程連接會失敗!
4,生成service-key.pem
執(zhí)行命令:openssl genrsa -out server-key.pem 4096
[root@VM-12-4-centos ca_key]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
...........................................................................................++
....++
e is 65537 (0x10001)
[root@VM-12-4-centos ca_key]# ll
total 12
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem
-rw-r--r-- 1 root root 2082 Apr 10 10:56 ca.pem
-rw-r--r-- 1 root root 3247 Apr 10 11:45 server-key.pem
5,用CA簽署公鑰
由于TLS連接可以通過IP地址和DNS名稱進(jìn)行,因此在創(chuàng)建證書時需要指定IP地址或者域名。填寫的IP
或者域名,都是將來對外開放的地址,也就是用于連接的地址。例如,要允許使用127.0.0.1進(jìn)行連接:
執(zhí)行命令:openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
[root@VM-12-4-centos ca_key]# openssl req -subj "/CN=127.0.0.1" -sha256 -new -key server-key.pem -out server.csr
6,匹配白名單
設(shè)置允許哪些IP
可以遠(yuǎn)程連接docker
。
-
允許指定
IP
可以遠(yuǎn)程連接docker
。echo subjectAltName = DNS:$HOST,IP:XX.XX.XX.XX,IP:XX.XX.XX.XX >> extfile.cnf
$HOST
是你的IP
或者域名,使用時將$HOST
替換為自己的IP
或者域名。如:
# 127.0.0.1 服務(wù)器上的 docker,只允許ip地址為225.225.225.0的客戶連接 echo subjectAltName = DNS:127.0.0.1,IP:225.225.225.0 >> extfile.cnf # ideaopen.cn 服務(wù)器上的 docker,只允許ip地址為225.225.225.0的客戶連接 echo subjectAltName = DNS:ideaopen.cn,IP:225.225.225.0 >> extfile.cnf
-
允許所有
IP
連接設(shè)置
IP
為0.0.0.0
即可。如:
echo subjectAltName = DNS:127.0.0.1,IP:0.0.0.0 >> extfile.cnf
注:只允許永久證書的才可以連接成功
然后需要將Docker守護(hù)進(jìn)程密鑰的擴(kuò)展使用屬性設(shè)置為僅用于服務(wù)器身份驗(yàn)證:
echo extendedKeyUsage = serverAuth >> extfile.cnf
7,生成已簽名的證書(signed certificate)
這里執(zhí)行命令后需要輸入之前設(shè)置的密碼
[root@VM-12-4-centos ca_key]# 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=127.0.0.1
Getting CA Private Key
Enter pass phrase for ca-key.pem:
授權(quán)插件提供了更細(xì)粒度的控制,以補(bǔ)充來自雙向TLS的身份驗(yàn)證。除了上述描述的其他信息外,在Docker守護(hù)進(jìn)程上運(yùn)行的授權(quán)插件還接收用于連接Docker客戶端的證書信息。
如果第二次申請頒發(fā)證書,可能會出現(xiàn)ca.srl: No such file or directory的問題。
此時我們echo “01” > ca.srl 即可,這個文件影響到ca頒發(fā)的證書的序號,而證書序號應(yīng)該是唯一的,所以這點(diǎn)需要控制好。
8,生成客戶端key
對于客戶端身份驗(yàn)證,我們還需要創(chuàng)建客戶端密鑰和證書簽名請求:
注意:為了簡化接下來的幾個步驟,我們可以在Docker守護(hù)進(jìn)程的主機(jī)上執(zhí)行此步驟。
[root@VM-12-4-centos ca_key]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
......................................++
.................................++
e is 65537 (0x10001)
[root@VM-12-4-centos ca_key]# openssl req -subj '/CN=client' -new -key key.pem -out client.csr
此外為了使密鑰適合客戶端身份驗(yàn)證,還需要創(chuàng)建一個新的擴(kuò)展配置文件:
[root@VM-12-4-centos ca_key]# echo extendedKeyUsage = clientAuth >> extfile.cnf
[root@VM-12-4-centos ca_key]# echo extendedKeyUsage = clientAuth > extfile-client.cnf
然后就可以生成已簽名的客戶端key了。
[root@VM-12-4-centos ca_key]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
> ? -CAcreateserial -out cert.pem -extfile extfile-client.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:
此時可以看到我們當(dāng)初創(chuàng)建的ca_key文件里已經(jīng)有很多文件了。
[root@VM-12-4-centos ca_key]# ll
total 44
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem
-rw-r--r-- 1 root root 2082 Apr 10 10:56 ca.pem
-rw-r--r-- 1 root root ? 17 Apr 10 13:45 ca.srl
-rw-r--r-- 1 root root 1854 Apr 10 13:45 cert.pem
-rw-r--r-- 1 root root 1582 Apr 10 13:40 client.csr
-rw-r--r-- 1 root root ? 30 Apr 10 13:43 extfile-client.cnf
-rw-r--r-- 1 root root ?102 Apr 10 13:42 extfile.cnf
-rw-r--r-- 1 root root 3243 Apr 10 13:40 key.pem
-rw-r--r-- 1 root root 1895 Apr 10 13:36 server-cert.pem
-rw-r--r-- 1 root root 1586 Apr 10 13:26 server.csr
-rw-r--r-- 1 root root 3247 Apr 10 11:45 server-key.pem
但是有很多多余的配置文件,生成cert.pem
,server-cert.pem
后,一些簽名請求和擴(kuò)展配置文件可以安全刪除了。
#刪除多余文件
[root@VM-12-4-centos ca_key]# rm -v client.csr server.csr extfile.cnf extfile-client.cnf
rm: remove regular file ‘client.csr’? y
removed ‘client.csr’
rm: remove regular file ‘server.csr’? y
removed ‘server.csr’
rm: remove regular file ‘extfile.cnf’? y
removed ‘extfile.cnf’
rm: remove regular file ‘extfile-client.cnf’? y
removed ‘extfile-client.cnf’
9,修改權(quán)限
為了防止密鑰文件被誤刪或者損壞,我們可以改變一下文件權(quán)限,讓它只讀就可以。
[root@VM-12-4-centos ca_key]# chmod -v 0400 ca-key.pem key.pem server-key.pem
mode of ‘ca-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)
mode of ‘key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)
mode of ‘server-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)
為了防止證書損壞,我們也刪除它的寫入權(quán)限。
[root@VM-12-4-centos ca_key]# chmod -v 0444 ca.pem server-cert.pem cert.pem
mode of ‘ca.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
mode of ‘server-cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
mode of ‘cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
歸集服務(wù)器證書
將證書存放在docker配置文件夾下
[root@VM-12-4-centos ca_key]# cp server-*.pem /etc/docker/
[root@VM-12-4-centos ca_key]# cp ca.pem /etc/docker/
10,修改Docker配置
這里需要設(shè)置Docker
的守護(hù)程序,讓它僅接收來自提供了CA
信任證書的客戶端連接。
#vim
vim /lib/systemd/system/docker.service
# 也可以vi
vi /lib/systemd/system/docker.service
將 ExecStart
屬性值進(jìn)行修改:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service
?
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 ? ? 修改為下面的->
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/www/server/docker/ca_key/ca.pem --tlscert=/www/server/docker/ca_key/server-cert.pem --tlskey=/www/server/docker/ca_key/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
重載配置并啟動Docker
[root@VM-12-4-centos ca_key]# systemctl daemon-reload
[root@VM-12-4-centos ca_key]# systemctl restart docker
[root@VM-12-4-centos ca_key]# systemctl status docker
● docker.service - Docker Application Container Engine
? Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
? Active: active (running) since Mon 2023-04-10 14:07:15 CST; 9s ago
? ? Docs: https://docs.docker.com
Main PID: 5392 (dockerd)
? Tasks: 50
? Memory: 43.2M
? CGroup: /system.slice/docker.service
? ? ? ? ? ├─5392 /usr/bin/dockerd --tlsverify --tlscacert=/www/server/docker/ca_key/ca.pem --tlscert=/www/server/docker/ca_key/server-cert.pem --tlskey=/www/server/docker/ca_key/server-key...
? ? ? ? ? ├─5585 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
? ? ? ? ? ├─5591 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
? ? ? ? ? ├─5603 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
? ? ? ? ? ├─5608 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
? ? ? ? ? ├─5713 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
? ? ? ? ? └─5718 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
IDEA遠(yuǎn)程連接測試
將服務(wù)器中的如下四個證書文件下載到本地,并創(chuàng)建文件夾存放。
?然后在IDEA中配置docker證書地址與遠(yuǎn)程連接配置。證書文件夾就是本地存放那四個證書文件的本地目錄。
看到下面的連接成功就證明IDEA已經(jīng)與遠(yuǎn)程Docker連接成功,就可以在項(xiàng)目中用Docker進(jìn)行協(xié)同操作了。文章來源:http://www.zghlxwxcb.cn/news/detail-485794.html
后記
看了這么一大串配置流程,一步一步來操作顯然非常麻煩,而且大多操作其實(shí)完全可以進(jìn)行封裝使用,因此將創(chuàng)建證書的操作用腳本封裝起來用才能事半功倍。具體的腳本和使用方法已經(jīng)放到筆者資源里了。有需求自取即可~文章來源地址http://www.zghlxwxcb.cn/news/detail-485794.html
到了這里,關(guān)于Docker開啟并配置遠(yuǎn)程安全訪問的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!