Docker API 加持TLS+CA

开篇废话

    在公司推广Docker Swarm,为了方便操作,自制了一个Web管理页面,控制Swarm的行为,利用了Docker Engine API进行通信。正在自己美滋滋的时候,公司的漏洞扫描提醒我,不管把Remote API的2375端口暴露在外网还是内网,都是不安全的。我心想,那就搞个CA证书呗,不过,我一直不太喜欢做这个配置, 因为不感兴趣,好麻烦啊。迫于生活,打开Docker官网,开始配置过程。

配置过程

1 找一个干净的文件夹作为工作目录。

2 生成CA私钥和公钥。

openssl genrsa -aes256 -out ca-key.pem 4096


生成ca-key.pem

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem


生成ca.pem

openssl genrsa -out server-key.pem 4096


生成server-key.pem

openssl req -subj "/CN=Docker主机名" -sha256 -new -key server-key.pem -out server.csr


生成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


生成server-cert.pem

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


生成cert.pem

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配置。

修改 /usr/lib/systemd/system/docker.service

7 重启docker服务。

systemctl daemon-reload

systemctl restart docker

8 验证。

netstat -nplt

2376端口

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到客户机,访问成功!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容