Docker安全開放遠(yuǎn)程訪問連接權(quán)限方式
1、Docker完全開放遠(yuǎn)程訪問
Docker服務(wù)完全開放對外訪問權(quán)限操作如下:
# 開啟端口命令 (--permanent永久生效,沒有此參數(shù)重啟后失效) firewall-cmd --zone=public --add-port=2375/tcp --permanent # 重新載入 firewall-cmd --reload # 使用 vim 編輯docker服務(wù)配置文件 vim /lib/systemd/system/docker.service # 找到如下配置行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock # 將其注釋掉或者直接刪除,替換成下面的配置行.然后保存退出 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock # 重新加載docker配置并重啟服務(wù) systemctl daemon-reload && systemctl restart docker # 然后直接在命令行客戶端輸入如下命令,IP地址改為自己的 curl http://192.168.56.20:2375/version # 或者在瀏覽器直接訪問,IP地址改為自己的 http://192.168.56.20:2375/version
出現(xiàn)如下信息則代表修改Docker服務(wù)設(shè)置遠(yuǎn)程訪問成功。
特別注意的點:
完全開放Docker對外訪問權(quán)限有可能會遭到別人攻擊,這是很不安全的,只要別人知道你的服務(wù)器地址就能夠隨意連接你的Docker服務(wù),而不需要任何認(rèn)證,因此,完全開放只推薦自己在內(nèi)網(wǎng)使用,不推薦在云服務(wù)器上直接完全開放。
2、Docker開放遠(yuǎn)程訪問并開啟認(rèn)證和通信加密
為了解決上面Docker完全開放遠(yuǎn)程訪問所帶來的安全隱患,我們需要對Docker服務(wù)進行通信認(rèn)證和加密,操作如下:
首先創(chuàng)建一個文件目錄,用于存放證書和私鑰
mkdir -p /data/certificate/linux-ca && cd /data/certificate/linux-ca
然后在 linux-ca 文件夾下進行以下操作:
生成自簽名的根證書和私鑰
- a. 執(zhí)行以下命令生成根證書私鑰文件(例如
ca-key.pem
):
openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096
- b. 執(zhí)行以下命令生成根證書文件(例如
ca.pem
)并使用私鑰進行簽名。在生成證書時,你需要為其分配一個有效期,通常為幾年。
# 直接指定證書的主題信息 openssl req -x509 -new -key ca-key.pem -sha256 -days 365 -passin pass:123456 -out ca.pem
生成自簽名的服務(wù)端證書和私鑰
- a. 執(zhí)行以下命令生成私鑰文件(例如
server-key.pem
):
openssl genrsa -out server-key.pem 4096
- b. 執(zhí)行以下命令生成證書簽名請求文件(例如
server.csr
)。
在生成 CSR 文件時,你需要提供一些信息,如組織名稱、組織單位、所在國家等。
# 直接指定證書的主題信息 openssl req -new -key server-key.pem -out server.csr
- c. 執(zhí)行以下命令生成自簽名的服務(wù)器證書(例如
server-cert.pem
),并使用 CSR 文件和私鑰進行簽名。
echo extendedKeyUsage = serverAuth >> extfile-server.cnf openssl x509 -req -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out server-cert.pem -extfile extfile-server.cnf
生成自簽名的客戶端證書和私鑰
- a. 執(zhí)行以下命令生成客戶端私鑰文件(例如
key.pem
):
openssl genrsa -out key.pem 4096
- b. 執(zhí)行以下命令生成客戶端證書簽名請求文件(例如
client.csr
)。在生成 CSR 文件時,你需要提供一些信息,如組織名稱、組織單位、所在國家等。
openssl req -new -key key.pem -out client.csr
- c. 執(zhí)行以下命令生成自簽名的客戶端證書(例如
cert.pem
),并使用 CSR 文件和私鑰進行簽名。在生成證書時,你需要為其分配一個有效期,通常為幾年。
echo extendedKeyUsage = clientAuth > extfile-client.cnf openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out cert.pem -extfile extfile-client.cnf
刪除多余的四個請求文件:
rm -f server.csr client.csr extfile-server.cnf extfile-client.cnf
完成了上述步驟后,你將獲得以下文件:
- 根證書文件:
ca.pem
- 根證書私鑰文件:
ca-key.pem
- 服務(wù)器端證書文件:
server-cert.pem
- 服務(wù)器端私鑰文件:
server-key.pem
- 客戶端證書文件:
cert.pem
- 客戶端私鑰文件:
key.pem
特別要注意的是以下四點:
- 根證書名稱必須為 ca.pem
- 客戶端證書必須為 cert.pem
- 客戶端私鑰必須為 key.pem
- 在輸入 commonName 信息時必須添加服務(wù)器的IP地址,否則Docker可能啟動失敗
服務(wù)端和客戶端創(chuàng)建私鑰是不能額外添加加密密碼,不然會導(dǎo)致服務(wù)端、客戶端無法解析。
然后是配置Docker守護進程配置文件 daemon.json 具體操作如下:
# 先查看 /etc/docker/daemon.json 是否存在,如果不存在則創(chuàng)建,存在則直接修改 cat /etc/docker/daemon.json mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "tls": true, "tlsverify": true, "tlscacert": "/data/certificate/linux-ca/ca.pem", "tlscert": "/data/certificate/linux-ca/server-cert.pem", "tlskey": "/data/certificate/linux-ca/server-key.pem", "registry-mirrors": [ "http://hub-mirror.c.163.com", "https://ung2thfc.mirror.aliyuncs.com", "https://mirror.ccs.tencentyun.com", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://mirror.baidubce.com" ] } EOF systemctl daemon-reload && systemctl restart docker
在以上操作中,我們需要填寫正確的證書和私鑰存放地址,如果你是按照我上面的步驟來,那沒有問題,你什么都不用改。
如果你的證書和私鑰的存放地址是自己定義的地址,那么,你需要將 daemon.json 中的地址也相應(yīng)的修改一下。
完成以上內(nèi)容后,此時我們在瀏覽器使用 https://192.168.56.10:2375/version 就無法獲取信息了,提示需要身份認(rèn)證
3、快速完成Docker服務(wù)開啟認(rèn)證和通信加密
為了解決第二步流程比較繁瑣的問題,我編寫了兩個自動化配置Shell腳本并且我將其上傳到了公網(wǎng),它們能夠幫助我們非??焖俚耐瓿傻诙降乃辛鞒?,
你們可以直接選擇使用我創(chuàng)建好的腳本,操作如下:
# 證書腳本 curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/cert.sh chmod +x cert.sh source cert.sh # Docker守護進程腳本 curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/daemon.sh chmod +x daemon.sh source daemon.sh
如果自己創(chuàng)建然后使用,可以參考下面的步驟,具體操作如下:
首先是創(chuàng)建證書和私鑰的Shell腳本
我們只需要創(chuàng)建一個 cert.sh 腳本文件,名稱可以任取,然后填入如下內(nèi)容:
#!/bin/bash # 從控制臺讀取必要輸入信息 read -p "please input the cert store path: " certDir echo your cert store path is: "$certDir" read -p "please input the ca-key's password: " password echo your password is: "$password" read -p "please input the IP of your server: " ip echo your server IP is: "$ip" # 檢查輸入的證書路徑是否已經(jīng)存在 # 如果不存在,則創(chuàng)建;如果存在則刪除后創(chuàng)建 if [ ! -d "$certDir" ]; then echo "" echo "$certDir , not exist, it will be create" echo "" mkdir -p $certDir else echo "" echo "$certDir , already exist , it will be delete then create" echo "" rm -rf $certDir mkdir -p $certDir fi cd $certDir # 定義服務(wù)端證書擴展配置 server_conf="[req] prompt = no distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = CN stateOrProvinceName = JX localityName = SR organizationName = PY organizationalUnitName = XS commonName = $ip emailAddress = 2320391937@qq.com [v3_req] extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = 0.0.0.0" # 將服務(wù)端證書的擴展配置寫入extfile-server.cnf文件 echo "$server_conf" > extfile-server.cnf # 定義客戶端證書擴展配置 client_conf="[req] prompt = no distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = CN stateOrProvinceName = JX localityName = SR organizationName = PY organizationalUnitName = XS commonName = $ip emailAddress = 2320391937@qq.com [v3_req] extendedKeyUsage = clientAuth" # 將客戶端證書的擴展配置寫入extfile-client.cnf文件 echo "$client_conf" > extfile-client.cnf # 創(chuàng)建根證書RSA私鑰 openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096 # 創(chuàng)建CA證書 openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/CN=$ip" # 創(chuàng)建服務(wù)端私鑰 openssl genrsa -out server-key.pem 4096 # 創(chuàng)建服務(wù)端簽名請求證書文件 openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr # 創(chuàng)建簽名生效的服務(wù)端證書文件 openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile-server.cnf # 創(chuàng)建客戶端私鑰 openssl genrsa -out key.pem 4096 # 創(chuàng)建客戶端簽名請求證書文件 openssl req -subj "/CN=$ip" -new -key key.pem -out client.csr # 創(chuàng)建簽名生效的客戶端證書文件 openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf # 刪除多余文件 # 使用了 -v 參數(shù),rm 命令將會顯示每個被刪除的文件或目錄的名稱,以便您能夠看到操作的進展和結(jié)果。 rm -f -v client.csr server.csr extfile-server.cnf extfile-client.cnf # 為所有用戶設(shè)置對這些文件的讀取權(quán)限 chmod -v 444 ca-key.pem key.pem server-key.pem chmod -v 444 ca.pem server-cert.pem cert.pem
該腳本只需要我們在控制臺輸入證書和私鑰的存放地址、根私鑰密碼以及服務(wù)器IP地址三個參數(shù)即可,其他的什么都不用做。
如果你按照上面的步驟創(chuàng)建好了 cert.sh 腳本文件并填入了腳本內(nèi)容,那么接下來我們就可以通過如下命令來執(zhí)行腳本了
source /xxx/cert.sh
使用 source 命令后接腳本的絕對地址或者相對地址即可執(zhí)行腳本。
創(chuàng)建Docker守護進程配置腳本
我們創(chuàng)建一個 daemon.sh 腳本文件,名稱可以任取,然后填入如下內(nèi)容:
#!/bin/bash # 讀取控制臺輸入,需要輸入一個目錄 read -p "please input the cert store path: " certDir echo your cert store path is: "$certDir" # 檢查輸入的證書路徑是否已經(jīng)存在 # 如果不存在,則直接退出 if [ ! -d "$certDir" ]; then echo "" echo "$certDir , not exist, please input a correct cert path" exit fi json_content='{ "tls": true, "tlsverify": true, "tlscacert": "$certDir/ca.pem", "tlscert": "$certDir/server-cert.pem", "tlskey": "$certDir/server-key.pem", "registry-mirrors": [ "http://hub-mirror.c.163.com", "https://ung2thfc.mirror.aliyuncs.com", "https://mirror.ccs.tencentyun.com", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://mirror.baidubce.com" ] }' # 替換變量 json_content=$(echo "$json_content" | sed "s|\$certDir|$certDir|g") daemonDir='/etc/docker' # 如果docker配置目錄不存在則創(chuàng)建;存在則刪除后創(chuàng)建 if [ ! -d "$daemonDir" ]; then echo "" echo "$daemonDir not exist, it will be create" mkdir -p "$daemonDir" && cd "$daemonDir" # 將替換后的內(nèi)容保存到新的 JSON 文件 echo "$json_content" > "$daemonDir/daemon.json" else echo "" echo "$daemonDir already exist, it will be delete then create" rm -rf "$daemonDir" mkdir -p "$daemonDir" && cd "$daemonDir" # 將替換后的內(nèi)容保存到新的 JSON 文件 echo "$json_content" > "$daemonDir/daemon.json" fi systemctl daemon-reload && systemctl restart docker
然后我們可以通過 source 命令后接腳本的絕對地址或者相對地址即可執(zhí)行腳本。
source /xxx/daemon.sh
這個腳本主要是對Docker服務(wù)進行通信加密、服務(wù)認(rèn)證、鏡像加速配置這三個設(shè)置,使用方式和上一個腳本一樣。
在執(zhí)行腳本的過程中,會提示我們輸入之前創(chuàng)建的證書和私鑰的存放地址,我們必須填寫正確的地址,否則會導(dǎo)致Docker服務(wù)無法讀取證書和私鑰。
4、IDEA連接Docker服務(wù)
下載證書文件夾到Windows本地,
只需要這三個文件即可:ca.pem、cert.pem、key.pem 將他們下載到本地并裝入一個文件夾中
在具體的 IDEA 配置中,可以按照以下步驟進行設(shè)置:
- 打開 IDEA,進入 Settings 。
- 導(dǎo)航到 Docker 部分(一般是 Build, Execution, Deployment 下的 Docker)。
- 找到 Connect to Docker daemon with 配置下面的 TCP socket 配置選項
- 在 Engine API URL 中填入Docker服務(wù)連接地址,例如:https://192.168.56.10:2375
- 在 Certificates folder 中選擇裝有三個證書文件的文件夾,用以客戶端向服務(wù)端的身份認(rèn)證
- 保存設(shè)置并嘗試連接到 Docker 服務(wù)。
需要注意的是,具體的設(shè)置步驟可能因 IDEA 版本而異,請根據(jù)你使用的版本進行適當(dāng)調(diào)整。
5、Maven連接Docker服務(wù)
有時候我們需要讓自己的項目配置Docker服務(wù)的連接配置,以方便快速進行項目打包并部署在Docker中,因此,我們需要如下配置:
<!-- 項目maven插件統(tǒng)一管理 --> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> </plugin> <!-- docker插件,用于制作鏡像 --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${docker-maven.version}</version> <!-- docker配置 --> <configuration> <!-- docker遠(yuǎn)程地址 --> <dockerHost>${docker.host}</dockerHost> <!-- docker打包鏡像名稱 --> <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName> <!-- DockerFile的存放位置 --> <dockerDirectory>${project.basedir}</dockerDirectory> <!-- 由于docker服務(wù)使用加密通信,開啟了認(rèn)證,因此需要提供通信證書 --> <dockerCertPath>C:\Users\23203\Desktop\linux-ca</dockerCertPath> <!-- 配置制作鏡像時需要依賴的資源,此處依賴項目jar包 --> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </pluginManagement>
因為配置過長,我只選取關(guān)鍵的部分展示。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Docker搭建Graylog分布式日志采集系統(tǒng)的詳細(xì)過程
Graylog是一個開源的日志管理工具,支持日志收集、解析、存儲、搜索和可視化,它可以從各種數(shù)據(jù)源收集日志,并通過內(nèi)置的解析器將日志格式化,本文介紹基于Docker搭建Graylog分布式日志采集系統(tǒng),感興趣的朋友一起看看吧2025-02-02Linux環(huán)境下安裝docker環(huán)境(親測無坑)
大家好,本篇文章主要講的是Linux環(huán)境下安裝docker環(huán)境(親測無坑),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12