近日,白泽在使用 docker 的时候,开放了防火墙的端口,以 SSH 方式访问远程服务器的 docker 守护进程(无需使用密钥即可建立连接),随后竟遭到了挖矿木马的攻击,好一顿折腾之后,使用 TLS 证书加密通信才解决了问题。
部分腾讯云短信和云服务器安全主机管理后台的截图(失眠.jpg):
TLS For Docker:https://docs.docker.com/engine/security/protect-access/
TLS 的主要作用是提供加密、认证和数据完整性,以确保在网络上进行的通信是安全的。下面的实践在你对照复现的时候,白泽建议你同时打开 docker 的文档,一并参考,注意命令格式。
为了允许机器 A 通过 TLS 访问机器 B 上的 Docker,你需要在机器 B 上进行一系列设置,以确保 Docker 守护程序(Docker Daemon)使用 TLS,并为客户端提供相应的证书。
openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
生成 rsa 私钥
生成自签名证书(根证书 CA)
openssl genrsa -out server-key.pem 4096 openssl req -subj "/CN=主机名" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = IP:机器B的IP地址,DNS:机器B的DNS名 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf
extfile.cnf
配置文件,其中包含主题备用名称(subjectAltName)的信息,包括 DNS 名称和 IP 地址。echo extendedKeyUsage = serverAuth >> 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
ca-key.pem
) 和 CA 签名证书 (ca.pem
) 对服务器的 CSR (server.csr
) 进行签名,生成服务器的证书 (server-cert.pem
)。此命令还使用了 extfile.cnf
文件中的配置信息,确保证书包含了正确的主题备用名称和扩展属性。在 Docker 守护程序的启动配置中添加 TLS 相关的参数:
dockerd \ --tlsverify \ --tlscacert=ca.pem \ --tlscert=server-cert.pem \ --tlskey=server-key.pem \ -H=0.0.0.0:2376
防火墙配置: 如果机器 B 上有防火墙,确保允许来自机器 A 的流量通过 2376 端口。
🌟 Note:此时已经完成了服务端的配置,接下来需要在服务端上,借助根证书 CA,类似的生成客户端使用的证书,再将其拷贝到客户端机器上,即可使用 TLS 连接服务端 docker。
客户端的证书的生成和配置是类似的,这里简单罗列命令,不做重复解释。
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile-client.cnf
docker --tlsverify \ --tlscacert=ca.pem \ --tlscert=cert.pem \ --tlskey=key.pem \ -H=机器B的IP地址:2376 version
chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
mkdir -p ~/.docker cp -v {ca,cert,key}.pem ~/.docker export DOCKER_HOST=tcp://82.156.171.8:2376 DOCKER_TLS_VERIFY=1
当然只通过 export 配置环境变量只在当前会话生效,你需要在额外的配置文件中进行声明,这是 gpt 的回答:
https://docs.docker.com/engine/security/protect-access/
https://zhuanlan.zhihu.com/p/96110776
https://blog.csdn.net/xiaochong0302/article/details/128339576
https://developer.aliyun.com/article/1049851
本次事故,让我意识到服务器安全的重要性,每次*重装系统需要做很多数据备份迁移工作,服务也*暂停。平日维护服务器,更应当预防为主,做好规划,降低出错带来的恢复成本。
感兴趣可以关注公众号 「白泽talk」,白泽目前也打算打造一个氛围良好的行业交流群,欢迎加入:622383022。