前言
本就是内网测试服务器,最近电网领导要来了,服务器突然搞审查,要求修复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
- 验证端口是否已成功打开
应该能够看到端口 2376 在输出中firewall-cmd --zone=public --list-ports
成果
- 网页访问
- 密钥客户端保存
- IDEA 配置
小结
-
Docker TLS 的作用:Docker TLS 用于保护 Docker 守护进程和客户端之间的通信,防止敏感数据在传输过程中被窃取或篡改,以及确保通信双方的身份验证。
-
证书和密钥生成:为了启用 Docker TLS,首先需要生成一组证书和密钥。通常包括生成自签名的根证书(CA 证书)、服务器证书和私钥,以及客户端证书和私钥。
-
CA 证书:根证书(CA 证书)用于签发和验证服务器证书和客户端证书。它是信任的根源,用于验证通信双方的身份。
-
服务器证书和私钥:服务器证书和私钥用于验证和加密 Docker 守护进程的通信。服务器证书包含服务器的公钥,并用于客户端验证服务器的身份。
-
客户端证书和私钥:客户端证书和私钥用于验证和加密客户端与 Docker 守护进程的通信。客户端证书包含客户端的公钥,并用于服务器验证客户端的身份。
-
配置 Docker 守护进程:在 Docker 守护进程的配置文件中,需要指定 TLS 相关的参数,包括 CA 证书、服务器证书、服务器私钥等。这样 Docker 守护进程就能够使用 TLS 进行安全通信。
-
客户端使用 TLS:客户端在使用 TLS 连接到 Docker 守护进程时,需要提供自己的证书和私钥,并验证服务器的证书。客户端通过 TLS 连接可以执行 Docker 相关操作,并确保通信的安全性。
-
定期更新证书:为了保持安全,证书应该定期更新。过期的证书可能导致连接失败或安全风险。
-
防火墙配置:为了使用 Docker TLS,需要确保防火墙允许相应的端口(默认为 2376)进行通信。
通过使用 Docker TLS,可以增加 Docker 环境的安全性,保护敏感数据和通信的机密性。但是,要确保正确配置和管理证书,并采取适当的安全措施,以保护证书和密钥的机密性和完整性。