完蛋,我被挖矿木马包围了|使用 TLS 连接 Docker
事故还原
近日,白泽在使用 docker 的时候,开放了防火墙的端口,以 SSH 方式访问远程服务器的 docker 守护进程(无需使用密钥即可建立连接),随后竟遭到了挖矿木马的攻击,好一顿折腾之后,使用 TLS 证书加密通信才解决了问题。
时间线
部分腾讯云短信和云服务器安全主机管理后台的截图(失眠.jpg):
TLS 实践
TLS For Docker:
https://docs.docker.com/engine/security/protect-access/
TLS 的主要作用是提供加密、认证和数据完整性,以确保在网络上进行的通信是安全的。下面的实践在你对照复现的时候,白泽建议你同时打开 docker 的文档,一并参考,注意命令格式。
为了允许机器 A 通过 TLS 访问机器 B 上的 Docker,你需要在机器 B 上进行一系列设置,以确保 Docker 守护程序(Docker Daemon)使用 TLS,并为客户端提供相应的证书。
服务端(docker 守护进程对应服务器)配置
一、在 B 机器上生成 CA(Certificate Authority)证书和密钥
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
生成 rsa 私钥
- 私钥生成:rsa
- 私钥位数:4096
- 加密私钥:aes256(
生成过程中会提示输入密码,用于对私钥进行加密,后续使用私钥时也会提示输入这个密码
)
生成自签名证书(根证书 CA)
- 格式:x509
- 签名:使用 sha256 计算 hash 摘要,对摘要使用私钥进行加密,加密的过程就是签名
- 作用:作为根证书用于对后续 server 和 client 端的证书进行签名
二、生成 Docker 守护程序的未签名证书和密钥
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=主机名" -sha256 -new -key server-key.pem -out server.csr
- 创建服务器密钥
- 生成服务器证书签名请求(CSR)文件:以便后续将其发送给证书颁发机构 (CA) 进行签名,从而得到服务器的证书
三、创建一个扩展属性配置文件(extfile.cnf),用于指定 IP 地址和 DNS 名称
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
:添加一个扩展属性,指定此证书仅用于服务器认证
四、生成 Docker 守护程序的签名证书
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 的私钥 (
ca-key.pem
) 和 CA 签名证书 (
ca.pem
) 对服务器的 CSR (
server.csr
) 进行签名,生成服务器的证书 (
server-cert.pem
)。此命令还使用了
extfile.cnf
文件中的配置信息,确保证书包含了正确的主题备用名称和扩展属性。
五、配置 Docker 守护程序
在 Docker 守护程序的启动配置中添加 TLS 相关的参数:
dockerd \
--tlsverify \
--tlscacert=ca.pem \
--tlscert=server-cert.pem \
--tlskey=server-key.pem \
-H=0.0.0.0:2376
防火墙配置:
如果机器 B 上有防火墙,确保允许来自机器 A 的流量通过 2376 端口。