一 前言
- 实验机器腾讯云centos7
- docker启用远程管理端口默认没有ssl,容易被当作矿机使用。所以可以启用ca签发证书来加密客户端和服务端。
- docker版本
Client: Docker Engine - Community
Version: 20.10.0
API version: 1.41
Go version: go1.13.15
Git commit: 7287ab3
Built: Tue Dec 8 18:55:43 2020
OS/Arch: darwin/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.12)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:37:17 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
二 准备
1. yum
# yum 更新
yum update
# yum 查找包
yum list [包名] --showduplicates | sort -r
# yum 安装包
yum install [包名]
# yum 卸载包
yum remove [包名]
2. docker
# dockerd 服务端
dockerd
--tlsverify # 是否启用tls
--tlscacert=ca.pem # ca证书公钥
--tlscert=server-cert.pem # ca签发服务端公钥
--tlskey=server-key.pem # 服务端私钥
-H tcp://0.0.0.0:2375 # 开放管理ip:prot
-H unix:///var/run/docker.sock # 绑定进程
# docker 客户端
docker
-H=www.marsareas.top:2375 # 目标服务器ip:prot 默认连接本地docker
--tlsverify=true # 使用tls
--tlscacert=ca.pem # ca证书公钥
--tlscert=cert.pem # ca签发客户端公钥
--tlskey=key.pem # 客户端私钥
[option] # 其他命令。例如 version
# dockerd 重载配置
systemctl daemon-reload
# docker服务重启
systemctl restart docker
# docker服务暂停
systemctl stop docker
# docker服务状态
systemctl status docker
3.filewail
腾讯云请注意服务器的访问安全策略,可能需要界面二次添加访问入口(流量出口不需要)
# 添加防火墙开放端口
sudo firewall-cmd --zone=public --add-port=21/tcp --permanent
# 移除防火墙开放端口
sudo firewall-cmd --zone=public --remove-port=21/tcp --permanent
# 防火墙重启
sudo firewall-cmd --reload
三 配置tls
step1 生成ca证书和签发docker客户端和服务端证书
# 选择证书目录
mkdir /Users/{主机名}/ssl
cd /Users/{主机名}/ssl
# !/bin/bash
# 一键生成TLS和CA证书
# Create : 2021-12-08
# Update : 2021-12-08
# @Autor : zyj
# 服务器主机名
export SERVER="请输入主机名 or 域名 or ip"
# 密码
export PASSWORD="ca签发密码"
# 证书有效时间
export DAYS=365
# 1. 生成CA证书
# 1.1 生成CA密钥
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048
# 1.2 生成CA证书
openssl req -new -x509 -passin "pass:$PASSWORD" -days $DAYS -key ca-key.pem -sha256 -out ca.pem -subj "/CN=$SERVER"
# 2. 签发服务端TLS证书
# 2.1 生成服务端密钥
openssl genrsa -out server-key.pem 2048
# 2.2 ca签发服务端证书
openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server.csr
openssl x509 -req -days $DAYS -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem
# 3. 签发客户端TLS证书
# 3.1 生成客户端密钥
openssl genrsa -out key.pem 2048
# 3.2 ca签发客户端证书
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
sh -c 'echo "extendedKeyUsage=clientAuth" >> extfile.cnf'
openssl x509 -req -days $DAYS -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf
# 4,整理文件
# 4.1 添加权限
chmod 0444 ca-key.pem server-key.pem key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
# 4.2 打印文件信息
ls -la
结果
zyj@yujingzhengdeMacBook-Pro ~/Users/zyj/ssl sh ./generator.sh
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................+++++
..............................................................................+++++
e is 65537 (0x010001)
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................+++++
....................+++++
e is 65537 (0x010001)
Signature ok
subject=CN = 请输入主机名 or 域名 or ip
Getting CA Private Key
Generating RSA private key, 2048 bit long modulus (2 primes)
...........+++++
......................................+++++
e is 65537 (0x010001)
Signature ok
subject=CN = client
Getting CA Private Key
total 104
drwxr-xr-x 14 zyj staff 448 12 8 23:46 .
drwxr-xr-x 8 zyj staff 256 12 8 23:08 ..
-rw-r--r--@ 1 zyj staff 6148 12 8 23:46 .DS_Store
-r--r--r-- 1 zyj staff 1766 12 8 23:46 ca-key.pem # ca密钥
-r--r--r-- 1 zyj staff 1135 12 8 23:46 ca.pem # ca证书
-rw-r--r-- 1 zyj staff 41 12 8 23:46 ca.srl # 无用
-r--r--r-- 1 zyj staff 1038 12 8 23:46 cert.pem # ca签发客户端证书
-rw-r--r-- 1 zyj staff 887 12 8 23:46 client.csr # 无用
-rw-r--r-- 1 zyj staff 28 12 8 23:46 extfile.cnf # 无用
-rwxrwxrwx@ 1 zyj staff 1428 12 8 23:46 generator.sh
-r--r--r-- 1 zyj staff 1675 12 8 23:46 key.pem # 客户端密钥
-r--r--r-- 1 zyj staff 1013 12 8 23:46 server-cert.pem # ca签发服务端证书
-r--r--r-- 1 zyj staff 1675 12 8 23:46 server-key.pem # 服务端密钥
-rw-r--r-- 1 zyj staff 903 12 8 23:46 server.csr # 无用
step2 配置docker服务端证书
上传证书
# 1 建立ssl证书目录
mkdir -p /usr/local/ssl/docker
# 2 上传服务端证书 密钥 和ca证书
rz
ca.pem server-cert.pem server-key.pem
配置dockerd使用证书
# 1 备份配置
cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service.back
# 2 修改docker使用证书
vim /usr/lib/systemd/system/docker.service
# 注释
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 添加
ExecStart=/usr/bin/dockerd \
--tlsverify \
--tlscacert=/usr/local/ssl/docker/ca.pem \
--tlscert=/usr/local/ssl/docker/server-cert.pem \
--tlskey=/usr/local/ssl/docker/server-key.pem \
-H tcp://0.0.0.0:2375
# 保存
ESC :wq ENTER
# 3 重启生效docker
systemctl daemon-reload && systemctl restart docker
# 4 开启防火墙端口
sudo firewall-cmd --zone=public --add-port=2375/tcp --permanent
# 5 防火墙重启
sudo firewall-cmd --reload
step3 配置docker客户端使用证书
方式1:环境变量
# 设置证书位置
# 客户端证书 cert.pem
# 客户端密钥 key.pem
# ca证书 ca.pem
export DOCKER_CERT_PATH=/Users/zyj/ssl/
# 设置使用TLS (使用后本地docker无法连接) 不推荐
export DOCKER_TLS_VERIFY=1
# 设置远程dockerhost (使用后本地docker无法连接)不推荐
export DOCKER_HOST= tcp://ip:port
docker version
docker -H=ip:host --tlsverify=true version
方式2:命令行
docker -H=ip:host --tlsverify=true --tlscacert=/Users/zyj/ssl/ca.pem --tlscert=/Users/zyj/ssl/cert.pem --tlskey=/Users/zyj/ssl/key.pem version
方式3:idea插件