Docker AC认证解决暴露2375端口引发的安全漏洞

Docker2375端口是Docker守护进程的默认未加密的远程API端口,用于通过Docker API远程管理Docker守护进程。如果在生产环境中对外开放2375端口,可能会引发安全漏洞,因为攻击者可以利用该端口进行未授权的访问和操作,从而对系统造成危害。

  1. 生成TLS证书

创建证书生成脚本,放置/opt/sh目录

mkdir -p /opt/sh /opt/cert/docker
touch /opt/sh/ecert.sh
vim /opt/sh/cert.sh

在cret.sh添加内容

#!/bin/bash
set -e
if [ -z $1 ]; then
	echo "请输入Docker服务器主机名"
	exit 0
fi
HOST=$1
mkdir -p /opt/cert/docker
cd /opt/cert/docker
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
# 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

执行cert.sh脚本,生成证书放置 /opt/cert/docker 目录中
PS:密码必须一致,其他信息可留空

# localhost可以是域名或者服务器IP
./createcert.sh example.com
  1. 配置Docker支持TLS

修改docker.service文件

vi /usr/lib/systemd/system/docker.service

修改以ExecStart开头的配置,开启TLS认证,并配置好CA证书、服务端证书和服务端私钥

# 将原来的ExecStart注释掉
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 创建一条新的
ExecStart=/usr/bin/dockerd \
--tlsverify --tlscacert=/opt/cert/docker/ca.pem  \
--tlscert=/opt/cert/docker/server-cert.pem \
--tlskey=/opt/cert/docker/server-key.pem \
-H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock

重新加载daemon并重启Docker

systemctl daemon-reload && systemctl restart docker
  1. 本地连接测试Docker API是否可用
# 没有指定证书访问测试
curl https//example.com:2375/info 

# 指定证书访问测试
curl https//example.com:2375/info --cert /opt/cert/docker/cert.pem --key /opt/cert/docker/key.pem --cacert /opt/cert/docker/ca.pem