【Docker】TLS 认证

前言

本就是内网测试服务器,最近电网领导要来了,服务器突然搞审查,要求修复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 环境的安全性,保护敏感数据和通信的机密性。但是,要确保正确配置和管理证书,并采取适当的安全措施,以保护证书和密钥的机密性和完整性。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Docker是一个开源的轻量级虚拟化平台,可以帮助用户打包、分发和运行应用程序以及其依赖项,使得应用程序在不同的环境中具备可移植性和一致性。 Nginx是一个高性能的开源HTTP服务器和反向代理服务器,可以用于处理静态和动态内容,支持高并发和负载均衡。 OpenSSL是一个开放源代码的软件库,用于实现安全的套接字层(SSL)和传输层安全(TLS)协议,提供了加密和认证机制,用于保护网络通信的安全性。 双向认证是指在客户端和服务器之间建立安全通信时,双方都需要验证对方的身份。在Docker环境中使用Nginx和OpenSSL实现双向认证可以提高通信的安全性。 首先,需要生成证书和私钥。可以使用OpenSSL生成自签名的证书和私钥,其中私钥用于签署证书,并使用公钥加密通信。 然后,将生成的证书和私钥加载到Docker容器中的Nginx配置文件中。在Nginx配置文件中,需要配置SSL证书和私钥的路径,并启用SSL功能。 接下来,需要配置Nginx的双向认证。在Nginx配置文件中,需要指定客户端验证的方式为ssl_verify_client,并设置为on。这样Nginx会要求客户端提供证书进行认证。 最后,需要在客户端上生成证书和私钥,并将证书加入到操作系统的信任列表中。客户端发起请求时,Nginx会验证客户端提供的证书和私钥。 使用Docker、Nginx和OpenSSL实现双向认证可以确保服务器和客户端之间的通信安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

总在寒冷清秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值