Docker配置TLS认证开启远程访问

默认情况下,Docker 通过监听本地的 unix socket 运行,同时还可以通过 TCP 进行通信,方便对 Docker 集群 管理。Docker 官方提供了通过 TLS 加密,来保证只有信任的客户端才能远程访问 Docker 服务。

采用私有 CA 签名证书。客户端只能够连接到该 CA 签名的证书和服务器。

使用 OpenSSL 创建 CA 、server 和 client

使用过程中涉及到三个方面

  1. 创建私有 CA 证书
  2. 使用 CA 证书对 Server 证书签名
  3. 使用 CA 证书对 client 证书签名

生成 CA 公钥和私钥。

1
2
3
4
5
6
// 1. 生成 ca key  需要设置一个密码
# openssl genrsa -aes256 -out ca-key.pem 4096

// 2. 创建 ca 公钥
# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

创建 Server 端证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//创建 server key
# openssl genrsa -out server-key.pem 4096

//证书签名请求文件 /CN后的填使用正式的ip或者域名
# openssl req -subj "/CN=192.168.1.123" -sha256 -new -key server-key.pem -out server.csr

//使用 CA 证书签名文件

// extfile.cnf IP:XXXX 允许访问的ip
# echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf
# 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

创建 client 证书

1
2
3
4
5
6
7
8
// 客户端证书
# openssl genrsa -out key.pem 4096
// 客户端签名请求文件
# openssl req -subj '/CN=client' -new -key key.pem -out client.csr
# echo extendedKeyUsage = clientAuth > extfile-client.cnf
// CA 签名
# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

server 端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//1. 停止 docker 服务
$ service docker stop

//2.1 修改文件/etc/default/docker 添加变量 Docker_OPTS
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS=""
DOCKER_OPTS=" -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tls --tlscacert /root/.docker/openssl/ca.pem --tlscert /root/.docker/openssl/server-cert.pem --tlskey /root/.docker/openssl/server-key.pem"


// 2.2 修改文件: /lib/systemd/system/docker.service 添加变量 $DOCKER_OPTS
## Add EnviromentFile + add "$DOCKER_OPTS" at end of ExecStart
## After change exec "systemctl daemon-reload"

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

// 重启 docker 服务
$ service docker start


Client 端访问

$HOST 为服务端地址

1
2
3
$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \
-H=$HOST:2375 version

portainer 添加 Endpoint

20190628151918.png

官方文档

https://docs.docker.com/engine/security/https/

作者

张巍

发布于

2019-06-28

更新于

2019-06-28

许可协议

评论