【Docker】TLS 认证

本文介绍了如何在内网测试服务器上,因领导来访需要加强审查,通过使用TLS证书来修复Docker的2375端口缺陷。文章提供了一个脚本来生成必要的证书和配置Docker守护进程,包括创建CA证书、服务器证书和客户端证书,以及配置防火墙规则以允许2376端口通信,从而确保Docker通信的安全性和身份验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本就是内网测试服务器,最近电网领导要来了,服务器突然搞审查,要求修复docker 2375 端口缺陷。

为了继续使用插件,使用TLS证书修复该问题。

TLS

TLS(Transport Layer Security)是一种加密协议,用于在计算机网络上提供安全通信。它的前身是SSL(Secure Sockets Layer)协议,后来逐渐发展成为TLS。

主要目标是确保通信的机密性和完整性,以及对通信双方进行身份验证。它使用加密算法对传输的数据进行加密,防止数据在传输过程中被窃取或篡改。同时,TLS 也提供了数字证书来验证通信双方的身份,以防止中间人攻击和欺骗。

TLS 在很多应用中被广泛使用,特别是在保护敏感信息(如用户名、密码、支付信息等)的互联网通信中。常见的应用包括安全网页浏览(HTTPS)、电子邮件传输(SMTPS、IMAPS、POP3S)、虚拟私有网络(VPN)等。

通过使用 TLS,通信双方可以建立一个安全的通信通道,保护数据的隐私和完整性,并确保双方的身份。

脚本

请自己酌情修改!

创建文件,复制粘贴,保存,赋予脚本权限,执行即可。

#!/bin/bash
# docker_tls.sh
# 环境:CentOS 7.9

set -e

########## 配置信息 ##########

PORT=2376
SERVER_CERTS_DIR="/etc/docker/secret/server_tls"    # 服务器密钥存放目录
CLIENT_CERTS_DIR="/etc/docker/secret/client_tls"    # 客户端密钥存放目录
CA_CERTS_FILE="/etc/docker/secret/ca.pem"           # CA 证书文件路径
COUNTRY="CN"
STATE="Shanghai"
CITY="Shanghai"
ORGANIZATION="Elven"
ORGANIZATIONAL_UNIT="Dev"
COMMON_NAME=$(hostname)
EMAIL="admin@example.com"
PASSWORD="MijsfR"

########## 生成证书 ##########

echo "Generating Docker TLS certificates..."

# 创建目录并设置权限
mkdir -p "$SERVER_CERTS_DIR"
mkdir -p "$CLIENT_CERTS_DIR"
chmod 700 "$SERVER_CERTS_DIR" "$CLIENT_CERTS_DIR"

# 生成 CA 证书和私钥
if [[ ! -f "$CA_CERTS_FILE" ]]; then
    openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "$SERVER_CERTS_DIR/ca-key.pem" 4096
    openssl req -new -x509 -days 3650 -key "$SERVER_CERTS_DIR/ca-key.pem" -sha256 -out "$CA_CERTS_FILE" \
        -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=ca/emailAddress=$EMAIL"
    chmod 0444 "$CA_CERTS_FILE"
fi

# 生成服务器证书和私钥
openssl genrsa -out "$SERVER_CERTS_DIR/server-key.pem" 4096
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "$SERVER_CERTS_DIR/server-key.pem" -out "$SERVER_CERTS_DIR/server.csr"
echo subjectAltName = IP:$(hostname -I | awk '{print $1}') > "$SERVER_CERTS_DIR/extfile.cnf"
echo extendedKeyUsage = serverAuth >> "$SERVER_CERTS_DIR/extfile.cnf"
openssl x509 -req -days 3650 -sha256 -in "$SERVER_CERTS_DIR/server.csr" -passin "pass:$PASSWORD" \
  -CA "$CA_CERTS_FILE" -CAkey "$SERVER_CERTS_DIR/ca-key.pem" -CAcreateserial -out "$SERVER_CERTS_DIR/server-cert.pem" -extfile "$SERVER_CERTS_DIR/extfile.cnf"

# 设置证书和私钥文件权限
chmod 0400 "$SERVER_CERTS_DIR/server-key.pem"
chmod 0444 "$CA_CERTS_FILE" "$SERVER_CERTS_DIR/server-cert.pem"

# 生成客户端密钥
openssl genrsa -out "$CLIENT_CERTS_DIR/key.pem" 4096
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "$CLIENT_CERTS_DIR/key.pem" -out "$CLIENT_CERTS_DIR/client.csr"
echo extendedKeyUsage = clientAuth > "$CLIENT_CERTS_DIR/extfile.cnf"
openssl x509 -req -days 3650 -sha256 -in "$CLIENT_CERTS_DIR/client.csr" -passin "pass:$PASSWORD" \
  -CA "$CA_CERTS_FILE" -CAkey "$SERVER_CERTS_DIR/ca-key.pem" -CAcreateserial -out "$CLIENT_CERTS_DIR/cert.pem" -extfile "$CLIENT_CERTS_DIR/extfile.cnf"

# 设置客户端证书和私钥文件权限
chmod 0400 "$CLIENT_CERTS_DIR/key.pem"
chmod 0444 "$CA_CERTS_FILE" "$CLIENT_CERTS_DIR/cert.pem"

# 清理临时文件
rm -f "$SERVER_CERTS_DIR/ca-key.pem" "$SERVER_CERTS_DIR/server.csr" "$SERVER_CERTS_DIR/extfile.cnf"
rm -f "$CLIENT_CERTS_DIR/client.csr" "$CLIENT_CERTS_DIR/extfile.cnf"

########## 配置 Docker 守护进程 ##########

echo "Configuring Docker daemon..."

# 备份 Docker 配置文件
DOCKER_SERVICE_FILE="/usr/lib/systemd/system/docker.service"
DOCKER_SERVICE_BACKUP="/usr/lib/systemd/system/docker.service.bak"
cp "$DOCKER_SERVICE_FILE" "$DOCKER_SERVICE_BACKUP"

# 更新 Docker 配置文件
DOCKER_TLS_OPTS=" --tlsverify \
  --tlscacert=$CA_CERTS_FILE \
  --tlscert=$SERVER_CERTS_DIR/server-cert.pem \
  --tlskey=$SERVER_CERTS_DIR/server-key.pem \
  --tlsverify \
  -H fd:// -H 0.0.0.0:$PORT"

sed -i "s|^ExecStart=.*|ExecStart=/usr/bin/dockerd $DOCKER_TLS_OPTS|" "$DOCKER_SERVICE_FILE"

# 重新加载 systemd 配置
systemctl daemon-reload

########## 完成 ##########

echo "Docker TLS certificates and configuration have been generated successfully."

########## 重启Docker ##########

sudo systemctl restart docker

防火墙

  • 开放2376/tcp
    firewall-cmd --zone=public --add-port=2376/tcp --permanent
    
  • 重新加载防火墙规则以使更改生效
    firewall-cmd --reload
    
  • 验证端口是否已成功打开
    firewall-cmd --zone=public --list-ports
    
    应该能够看到端口 2376 在输出中

成果

  • 网页访问在这里插入图片描述
  • 密钥客户端保存
    在这里插入图片描述
  • IDEA 配置
    在这里插入图片描述

小结

  1. Docker TLS 的作用:Docker TLS 用于保护 Docker 守护进程和客户端之间的通信,防止敏感数据在传输过程中被窃取或篡改,以及确保通信双方的身份验证。

  2. 证书和密钥生成:为了启用 Docker TLS,首先需要生成一组证书和密钥。通常包括生成自签名的根证书(CA 证书)、服务器证书和私钥,以及客户端证书和私钥。

  3. CA 证书:根证书(CA 证书)用于签发和验证服务器证书和客户端证书。它是信任的根源,用于验证通信双方的身份。

  4. 服务器证书和私钥:服务器证书和私钥用于验证和加密 Docker 守护进程的通信。服务器证书包含服务器的公钥,并用于客户端验证服务器的身份。

  5. 客户端证书和私钥:客户端证书和私钥用于验证和加密客户端与 Docker 守护进程的通信。客户端证书包含客户端的公钥,并用于服务器验证客户端的身份。

  6. 配置 Docker 守护进程:在 Docker 守护进程的配置文件中,需要指定 TLS 相关的参数,包括 CA 证书、服务器证书、服务器私钥等。这样 Docker 守护进程就能够使用 TLS 进行安全通信。

  7. 客户端使用 TLS:客户端在使用 TLS 连接到 Docker 守护进程时,需要提供自己的证书和私钥,并验证服务器的证书。客户端通过 TLS 连接可以执行 Docker 相关操作,并确保通信的安全性。

  8. 定期更新证书:为了保持安全,证书应该定期更新。过期的证书可能导致连接失败或安全风险。

  9. 防火墙配置:为了使用 Docker TLS,需要确保防火墙允许相应的端口(默认为 2376)进行通信。

通过使用 Docker TLS,可以增加 Docker 环境的安全性,保护敏感数据和通信的机密性。但是,要确保正确配置和管理证书,并采取适当的安全措施,以保护证书和密钥的机密性和完整性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总在寒冷清秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值