docker——tls(ssl)加密通信
目录
一、DockerClient端与DockerDaemon的通信安全(https证书)
1.1 背景
为了防止链路劫持、会话劫持等问题导致Docker通信时被中间人攻击,c/s两端应该通过TLS加密方式通讯
1.2 使用证书访问的工作流程
通过在服务端上创建tls密钥证书,再下发给客户端,客户端通过私钥访问容器,这样就保证的docker通讯的安全性
(1)客户端发起请求,连接到服务器的进程端口。
(2)服务器必须要有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
(3)服务器将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
(4)客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的密钥对,用证书的公钥加密。
(5)客户端将公钥加密后的密钥发送到服务器。
(6)服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,这样传输的数据都是密文了。
(7)服务器将加密后的密文数据返回到客户端。
(8)客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据
1.3 部署思路
首先创建ca证书,ca证书只是一个官方认证的证书,接下来要创建server、client节点的证书
此时创建证书有三步:
1.设置私钥,确保安全加密
2.使用私钥签名,确保身份真实不可抵赖
3.使用ca证书制作证书
1.4 证书创建过程
1.4.1 环境准备
服务器 | ip | 组件 |
---|---|---|
master | 192.168.80.11 | docker-ce |
client | 192.168.80.12 | docker-ce |
1.4.2 创建一个存放目录
mkdir /tls
cd /tls/
1.4.2 生成ca证书
1)创建ca私钥
openssl genrsa -aes256 -out ca-key.pem 4096 #输入123456
==========================================================
genrsa:使用RSA算法产生私钥
-aes256:使用256位密钥的AES算法对私钥进行加密,这样每次使用私钥文件都将输入密码,可省略
-out:输出文件的路径,若未指定输出文件,则为标准输出
4096:指定私钥长度,默认为1024。该项必须为命令行的最后一项参数
==========================================================
2)创建ca证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem #输入123456
==========================================================
req:执行证书签发命令
-new:新证书签发请求
-x509:生成x509格式证书,专用于创建私有CA时使用
-days:证书的有效时长,单位是天
-key:指定私钥路径
-sha256:证书摘要采用sha256算法
-subj:证书相关的用户信息(subject的缩写)
-out:输出文件的路径
==========================================================
1.4.3 用ca证书签发server端证书
1)创建服务器私钥
openssl genrsa -out server-key.pem 4096
2)生成证书签名请求文件(csr文件)
openssl req -new -key server-key.pem -sha256 -subj "/CN=*" -out server.csr
3)使用ca证书与私钥证书签发服务端签名证书
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem #输入123456
==========================================================
x509:生成x509格式证书
-req:输入csr文件
-in:要输入的csr文件
-CA:指定ca证书的路径
-CAkey:指定ca证书的私钥路径
-CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl
==========================================================
1.4.4 用ca证证书签发client端证书
1)生成客户端私钥
openssl genrsa -out client-key.pem 4096
2)生成证书签名请求文件
openssl req -new -key client-key.pem -subj "/CN=*" -out client.csr
3)创建扩展配置文件,使秘钥适合客户端身份验证
echo extendedKeyUsage=clientAuth > extfile.cnf
4)使用ca证书签发客户端签名证书
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf #输入123456
1.4.5 删除两个证书签名请求文件和扩展配置文件
rm -rf ca.srl client.csr extfile.cnf server.csr
1.4.6 配置docker服务配置文件
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
1.4.7 重启docker服务
systemctl daemon-reload
systemctl restart docker
netstat -natp | grep 2376
1.4.8 修改服务端的主机名和ip映射
hostnamectl set-hostname master
su
vim /etc/hosts
127.0.0.1 master
1.4.9 本地验证
cd /tls/
docker --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H tcp://master:2376 pull cirros
docker --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H tcp://master:2376 images
1.4.10 在客户端上操作
1.将/tls目录中的ca.pem、client-cert.pem、client-key.pem 三个文件复制到另一台主机
scp ca.pem 192.168.80.12:/etc/docker/
scp client-cert.pem 192.168.80.12:/etc/docker/
scp client-key.pem 192.168.80.12:/etc/docker/
2.修改客户端的主机名和ip映射
hostnamectl set-hostname client
su
vim /etc/hosts
192.168.80.11 master
3.客户端验证
cd /etc/docker/
docker --tlsverify --tlscacert=ca.pem --tlscert=client-cert.pem --tlskey=client-key.pem -H tcp://master:2376 images
1.5 避免Docker容器中信息泄露
近几年Github上大量泄露个人或企业各种账号密码,出现这种问题一般都使用 dockerfile 或者 docker-compose 文件创建容器。如果这些文件中存在账号密码等认证信息,一旦Docker容器对外开放,则这些宿主机上的敏感信息也会随之泄露
可以通过以下方式检查容器创建模板的内容。
# check created users
grep authorized_keys $dockerfile
# check OS users
grep "etc/group" $dockerfile
# Check sudo users
grep "etc/sudoers.d" $dockerfile
# Check ssh key pair
grep ".ssh/.*id_rsa" $dockerfile