开篇废话
在公司推广Docker Swarm,为了方便操作,自制了一个Web管理页面,控制Swarm的行为,利用了Docker Engine API进行通信。正在自己美滋滋的时候,公司的漏洞扫描提醒我,不管把Remote API的2375端口暴露在外网还是内网,都是不安全的。我心想,那就搞个CA证书呗,不过,我一直不太喜欢做这个配置, 因为不感兴趣,好麻烦啊。迫于生活,打开Docker官网,开始配置过程。
配置过程
1 找一个干净的文件夹作为工作目录。
2 生成CA私钥和公钥。
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=Docker主机名" -sha256 -new -key server-key.pem -out server.csr
允许所有IP访问,但只有证书才可以连接成功。
echo subjectAltName = DNS:Docker主机名,IP:0.0.0.0,IP:127.0.0.1 >> extfile.cnf
3 生成签名证书。
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
4 创建客户端密钥和证书签名请求。
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
5 防止密钥和证书意外损坏,删除其写权限。
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
6 修改/usr/lib/systemd/system/docker.service文件中的ExecStart,追加TLS配置。
7 重启docker服务。
systemctl daemon-reload
systemctl restart docker
8 验证。
netstat -nplt
curl http://127.0.0.1:2376/info
curl https://127.0.0.1:2376/info
成功!
curl https://127.0.0.1:2376/info --cert /opt/cert/cert.pem --key /opt/cert/key.pem --cacert /opt/cert/ca.pem
复制cert.pem,key.pem,ca.pem到客户机,访问成功!