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


例:

创建私钥

Docker-tls(ssl)加密通信_配置文件

创建证书

Docker-tls(ssl)加密通信_docker_02

用ca证书签发server端证书

Docker-tls(ssl)加密通信_服务端_03

用ca证证书签发client端证书

Docker-tls(ssl)加密通信_docker_04

 

Docker-tls(ssl)加密通信_客户端_05

配置docker服务配置文件

Docker-tls(ssl)加密通信_服务器_06

 

Docker-tls(ssl)加密通信_服务器_07

 

Docker-tls(ssl)加密通信_配置文件_08

将/tls目录中的ca.pem、client-cert.pem、client-key.pem三个文件复制到另一台主机

Docker-tls(ssl)加密通信_docker_09

 

Docker-tls(ssl)加密通信_配置文件_10

修改服务端的主机名和ip映射

Docker-tls(ssl)加密通信_客户端_11

 Docker-tls(ssl)加密通信_服务器_12

在客户端上操作

修改客户端的主机名和ip映射

Docker-tls(ssl)加密通信_服务端_13

客户端验证

Docker-tls(ssl)加密通信_服务端_14

二、避免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