Docker がリモート アクセス接続許可を安全に開きます

1. Docker がリモートアクセスを完全に開放

Docker サービスは外部アクセスに対して完全にオープンであり、操作は次のとおりです。

# 开启端口命令  (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=2375/tcp --permanent
# 重新载入
firewall-cmd --reload

# 使用 vim 编辑docker服务配置文件
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配置并重启服务
systemctl daemon-reload && systemctl restart docker

# 然后直接在命令行客户端输入如下命令,IP地址改为自己的
curl http://192.168.56.20:2375/version
# 或者在浏览器直接访问,IP地址改为自己的
http://192.168.56.20:2375/version

次の情報が表示された場合は、Docker サービスのリモート アクセス設定が正常に変更されたことを意味します。
ここに画像の説明を挿入します
特に注意すべき点: Docker の外部アクセス権を完全にオープンにすると、他人から攻撃される可能性があり、非常に安全ではありません。他人がサーバーのアドレスを知っている限り、認証なしで自由に Docker サービスに接続できます。したがって、完全にオープンにするのは独自のイントラネットでの使用が推奨されており、クラウド サーバーで直接完全にオープンにすることは推奨されません。

2. Docker はリモート アクセスを開き、認証と通信の暗号化を有効にします。

Docker のフルオープンなリモートアクセスによる上記のセキュリティリスクを解決するには、Docker サービス上で通信認証と暗号化を行う必要がありますが、その操作はまず証明書と秘密鍵を格納するファイルディレクトリを作成します

mkdir -p /data/certificate/linux-ca && cd /data/certificate/linux-ca

次に、linux-ca フォルダーで次の操作を実行します。

  1. 自己署名ルート証明書と秘密キーを生成する:
    次のコマンドを実行して、ルート証明書秘密キー ファイル (例ca-key.pem: )を生成します。
    openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096
    
    b. 次のコマンドを実行してルート証明書ファイル (例: ca.pem) を生成し、秘密キーで署名します。証明書を生成するときは、証明書に有効期間 (通常は数年) を割り当てます。
    # 直接指定证书的主题信息
    openssl req -x509 -new -key ca-key.pem -sha256 -days 365 -passin pass:123456 -out ca.pem
    
  2. 自己署名サーバー証明書と秘密キーを生成します:
    a. 次のコマンドを実行して、秘密キー ファイル (例server-key.pem: )を生成します。
    openssl genrsa -out server-key.pem 4096
    
    b. 次のコマンドを実行して、証明書署名要求ファイル (例: server.csr) を生成します。
    CSR ファイルを生成するときは、組織名、組織単位、国などの情報を指定する必要があります。
    # 直接指定证书的主题信息
    openssl req -new -key server-key.pem -out server.csr
    
    c. 次のコマンドを実行して、自己署名サーバー証明書 (例: 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
    
  3. 自己署名クライアント証明書と秘密キーを生成します:
    a. 次のコマンドを実行して、クライアント秘密キー ファイル (例key.pem: )を生成します。
    openssl genrsa -out key.pem 4096
    
    b. 次のコマンドを実行して、クライアント証明書署名要求ファイル (例client.csr: ) を生成します。CSR ファイルを生成するときは、組織名、組織単位、国などの情報を指定する必要があります。
    openssl req -new -key key.pem -out client.csr
    
    c. 次のコマンドを実行して自己署名クライアント証明書 (例: 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
    

4 つの冗長なリクエスト ファイルを削除します。

rm -f server.csr client.csr extfile-server.cnf extfile-client.cnf

上記の手順を完了すると、次のファイルが得られます。

  • ルート証明書ファイル:ca.pem
  • ルート証明書の秘密キー ファイル:ca-key.pem
  • サーバー側の証明書ファイル:server-cert.pem
  • サーバー側の秘密鍵ファイル:server-key.pem
  • クライアント証明書ファイル:cert.pem
  • クライアント秘密鍵ファイル:key.pem

次の 4 つの点に特別な注意を払う必要があります。
4. ルート証明書名はca.pem
である必要があります。 5. クライアント証明書はcert.pem
である必要があります。 6. クライアント秘密鍵はkey.pem
である必要があります。 7. サーバーを追加する必要があります。 commonName 情報の IP アドレスを入力する場合、そうしないと Docker の起動に失敗する可能性があります。
8. サーバーとクライアントが秘密キーを作成するとき、追加の暗号化パスワードを追加することはできません。そうしないと、サーバーとクライアントは暗号化パスワードを解析できません。

次に、Docker デーモン構成ファイル daemon.json を構成します。具体的な操作は次のとおりです。

# 先查看 /etc/docker/daemon.json 是否存在,如果不存在则创建,存在则直接修改
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 内のアドレスを変更する必要があります。
上記内容を完了後、ブラウザで https://192.168.56.10:2375/version を使用すると情報が取得できず、本人認証が必要と表示されます。
ここに画像の説明を挿入します

3. Dockerサービスの起動認証と通信の暗号化を素早く完了

2 番目のステップの煩雑なプロセスの問題を解決するために、2 つの自動構成シェル スクリプトを作成し、パブリック ネットワークにアップロードしました。これにより、2 番目のステップのすべてのプロセスを非常に迅速に完了できます。作成したスクリプトは次のよう
動作します。

# 证书脚本
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

自分で作成して利用する場合は、以下の手順を参考にしてください 具体的な操作は以下の通りです。

3.1 まず、証明書と秘密キーを作成するシェル スクリプトです。

任意の名前で cert.sh スクリプト ファイルを作成し、次の内容を入力するだけです。

#!/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"

# 检查输入的证书路径是否已经存在
# 如果不存在,则创建;如果存在则删除后创建
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

# 定义服务端证书扩展配置
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 = [email protected]

[v3_req]
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = 0.0.0.0"

# 将服务端证书的扩展配置写入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 = [email protected]

[v3_req]
extendedKeyUsage = clientAuth"

# 将客户端证书的扩展配置写入extfile-client.cnf文件
echo "$client_conf" > extfile-client.cnf


# 创建根证书RSA私钥
openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096
# 创建CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/CN=$ip"

# 创建服务端私钥
openssl genrsa -out server-key.pem 4096
# 创建服务端签名请求证书文件
openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr
# 创建签名生效的服务端证书文件 
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

# 创建客户端私钥
openssl genrsa -out key.pem 4096
# 创建客户端签名请求证书文件
openssl req -subj "/CN=$ip" -new -key key.pem -out client.csr
# 创建签名生效的客户端证书文件
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 参数,rm 命令将会显示每个被删除的文件或目录的名称,以便您能够看到操作的进展和结果。
rm -f -v client.csr server.csr extfile-server.cnf extfile-client.cnf
# 为所有用户设置对这些文件的读取权限
chmod -v 444 ca-key.pem key.pem server-key.pem
chmod -v 444 ca.pem server-cert.pem cert.pem

このスクリプトでは、証明書と秘密キーのストレージ アドレス、ルート秘密キーのパスワード、サーバーの IP アドレスの 3 つのパラメータをコンソールに入力するだけで済み、他に行うことはありません。
上記の手順に従って cert.sh スクリプト ファイルを作成し、スクリプトの内容を入力すると、次のコマンドでスクリプトを実行できます。

source /xxx/cert.sh

スクリプトを実行するには、source コマンドの後にスクリプトの絶対アドレスまたは相対アドレスを指定します。

3.2 Docker デーモン構成スクリプトの作成

任意の名前で daemon.sh スクリプト ファイルを作成し、次の内容を入力します。

#!/bin/bash

# 读取控制台输入,需要输入一个目录
read -p "please input the cert store path: " certDir
echo your cert store path is: "$certDir"
# 检查输入的证书路径是否已经存在
# 如果不存在,则直接退出
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配置目录不存在则创建;存在则删除后创建
if [ ! -d "$daemonDir" ]; then
	echo ""
	echo "$daemonDir not exist, it will be create"
	mkdir -p "$daemonDir" && cd "$daemonDir"
	# 将替换后的内容保存到新的 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"
	# 将替换后的内容保存到新的 JSON 文件
	echo "$json_content" > "$daemonDir/daemon.json"
fi

systemctl daemon-reload && systemctl restart docker

次に、ソース コマンドの後にスクリプトの絶対アドレスまたは相対アドレスを指定して、スクリプトを実行できます。

source /xxx/daemon.sh

このスクリプトは主にDockerサービスの通信暗号化、サービス認証、イメージアクセラレーション設定の3つの設定を行うもので、使用方法は前回のスクリプトと同様です。スクリプトの実行中に、以前に作成した証明書と秘密キーのストレージ アドレスを入力するように求められます。正しいアドレスを入力する必要があります。入力しないと、Docker サービスは証明書と秘密キーを読み取ることができません。

4.IDEAがDockerサービスに接続します

証明書フォルダーを Windows にローカルにダウンロードするには、
ca.pem、cert.pem、key.pem の 3 つのファイルのみが必要です。これらをローカルにダウンロードし、フォルダーにロードします。特定の
ここに画像の説明を挿入します
IDEA 構成では、次の手順を実行できます。設定する:

  1. IDEA を開き、設定に入ります。
  2. Docker セクション (通常は、Build、Execution、Deployment の下の Docker) に移動します。
  3. 以下の TCP ソケット構成オプションを見つけて、構成を使用して Docker デーモンに接続します
  4. エンジン API URL に Docker サービス接続アドレスを入力します (例: https://192.168.56.10:2375)。
  5. 「証明書」フォルダー内の 3 つの証明書ファイルを含むフォルダーを選択して、サーバーに対してクライアントを認証します。
  6. 設定を保存し、Docker サービスへの接続を試行します。
    ここに画像の説明を挿入します
    なお、具体的な設定手順はIDEAのバージョンによって異なる場合がありますので、ご使用のバージョンに合わせて調整してください。

5. Maven が Docker サービスに接続する

場合によっては、Docker でのプロジェクトの迅速なパッケージ化とデプロイメントを容易にするために、独自のプロジェクトを構成して Docker サービスの接続構成を構成する必要があるため、次の構成が必要です。

        <!-- 项目maven插件统一管理 -->
        <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远程地址 -->
                        <dockerHost>${docker.host}</dockerHost>
                        <!-- docker打包镜像名称 -->
                        <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
                        <!-- DockerFile的存放位置 -->
                        <dockerDirectory>${project.basedir}</dockerDirectory>
                        <!-- 由于docker服务使用加密通信,开启了认证,因此需要提供通信证书 -->
                        <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>

構成が長すぎるため、主要な部分のみを選択して表示しましたが、完全な構成を構成したい場合は、メッセージを残すかプライベート メッセージを送信してください。
私のブログが良いと思っていただけましたら、ぜひ「いいね!」や「お気に入り」をしていただき、コメントなどでコミュニケーションをいただけるとさらに嬉しいです!

おすすめ

転載: blog.csdn.net/python15397/article/details/131649168