Docker配置TLS认证

当拥有不只一台Linux服务器的时候就会想着把多台服务器的docker进行统一管理,而直接使用docker daemon socket是很不安全的,应为没有任何加密并且没有身份验证,任何人知道暴露的端口就可以操作本机的docker,而docker需要root权限运行,所以约等于让人得到了root权限。
为了解决这个问题,就需要启用证书的认证。

使用的平台

注:服务器信息经过处理

  • Portainer Web服务器 地址:192.168.1.1
  • 须启用docker daemon socket的远程主机 地址:192.168.2.1
    两台主机系统均为Debian,并已经安装好了Docker

申请证书、修改配置这些操作均在须启用docker daemon socket的远程主机进行操作

签发证书

这里使用自签名证书
这里创建一个文件夹用于存放所有证书

mkdir /home/ca
cd /home/ca

生成 CA 公钥和私钥

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem  #此处创建的证书为十年,绝对够用到换服务器了

创建 Server 端证书

请自行替换本机地址本机域名

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=本机地址" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:本机域名,IP:本机地址,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

创建 client 证书

openssl genrsa -out key.pem 4096
openssl req -subj '/CN=此处填写对端主机地址' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

修改docker的配置

修改/etc/default/docker文件

这里需要向文件中写入以下内容

DOCKER_OPTS=" -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tls  --tlscacert /home/ca/ca.pem --tlscert /home/ca/server-cert.pem  --tlskey /home/ca/server-key.pem"

修改/lib/systemd/system/docker.service文件

修改或添加以下内容

EnvironmentFile=/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

重启docker

systemctl daemon-reload
service docker restart

修改ufw

根据上方修改的配置,我们的docker会监听来自2375端口的请求,所以我们需要放行2375端口

ufw allow 2375
ufw enable

连接远端的主机

现在我们回到Portainer Web服务器,可参考下图经行连接远程主机

参考文章


Docker配置TLS认证
https://blog.xianyu.one/2022/05/07/docker/docker-daemon-tls/
作者
咸鱼
发布于
2022年5月7日
许可协议