Docker-tls(ssl)加密通信
Docker-tls(ssl)加密通信
一、DockerClient端与DockerDaemon的通信安全(https证书)
1.背景
为了防止链路劫持、会话劫持等问题导致Docker通信时被中间人攻击,c/s两端应该通过TLS加密方式通讯
2.使用证书访问的工作流程
通过在服务端上创建tls密钥证书,再下发给客户端,客户端通过私钥访问容器,这样就保证的docker通讯的安全性
(1)客户端发起请求,连接到服务器的进程端口。
(2)服务器必须要有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
(3)服务器将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
(4)客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的密钥对,用证书的公钥加密。
(5)客户端将公钥加密后的密钥发送到服务器。
(6)服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,这样传输的数据都是密文了。
(7)服务器将加密后的密文数据返回到客户端。
(8)客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据
3.部署思路
首先创建ca证书,ca证书只是一个官方认证的证书,接下来要创建server、client节点的证书
此时创建证书有三步:
1.设置私钥,确保安全加密
2.使用私钥签名,确保身份真实不可抵赖
3.使用ca证书制作证书
4.证书创建过程
准备环境
服务器 | ip | 组件 |
---|---|---|
master | 192.168.30.12 | docker-ce |
client | 192.168.30.16 | docker-ce |
//首先创建一个存放目录 mkdir /tls cd /tls/ //生成ca证书 (1)创建ca私钥 openssl genrsa -aes256 -out ca-key.pem 4096 #输入123123 ---------------------------------------------------------------------------------------------------------- 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 #输入123123 ---------------------------------------------------------------------------------------------------------- req:执行证书签发命令 -new:新证书签发请求 -x509:生成x509格式证书,专用于创建私有CA时使用 -days:证书的有效时长,单位是天 -key:指定私钥路径 -sha256:证书摘要采用sha256算法 -subj:证书相关的用户信息(subject的缩写) -out:输出文件的路径 ---------------------------------------------------------------------------------------------------------- //用ca证书签发server端证书 (3)创建服务器私钥 openssl genrsa -out server-key.pem 4096 (4)生成证书签名请求文件(csr文件) openssl req -new -key server-key.pem -sha256 -subj "/CN=*" -out server.csr (5)使用ca证书与私钥证书签发服务端签名证书,输入123123 openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem ---------------------------------------------------------------------------------------------------------- x509:生成x509格式证书 -req:输入csr文件 -in:要输入的csr文件 -CA:指定ca证书的路径 -CAkey:指定ca证书的私钥路径 -CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl ---------------------------------------------------------------------------------------------------------- //用ca证证书签发client端证书 (6)生成客户端私钥 openssl genrsa -out client-key.pem 4096 (7)生成证书签名请求文件 openssl req -new -key client-key.pem -subj "/CN=client" -out client.csr (8)创建扩展配置文件,使秘钥适合客户端身份验证 echo extendedKeyUsage=clientAuth > extfile.cnf (9)使用ca证书签发客户端签名证书,输入123123 openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf //删除两个证书签名请求文件和扩展配置文件 rm -rf ca.srl client.csr extfile.cnf server.csr //配置docker服务配置文件 vim /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 //重启docker服务 systemctl daemon-reload systemctl restart docker netstat -natp | grep 2376 setenforce 0 //将 /tls 目录中的 ca.pem、client-cert.pem、client-key.pem 三个文件复制到另一台主机 scp ca.pem root@192.168.80.10:/etc/docker/ scp cert.pem root@192.168.80.10:/etc/docker/ scp key.pem root@192.168.80.10:/etc/docker/ //修改服务端的主机名和 ip 映射 hostnamectl set-hostname master su vim /etc/hosts 127.0.0.1 master //本地验证 docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images //在客户端上操作 hostnamectl set-hostname client su vim /etc/hosts 192.168.80.10 master cd /etc/docker/ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images
例:
创建私钥
创建证书
用ca证书签发server端证书
用ca证证书签发client端证书
配置docker服务配置文件
将/tls目录中的ca.pem、client-cert.pem、client-key.pem三个文件复制到另一台主机
修改服务端的主机名和ip映射
在客户端上操作
修改客户端的主机名和ip映射
客户端验证
二、避免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