文章目录
前言
一:Docker-TLS加密通讯部署
1.1:什么是TLS?有什么作用?
TLS(Transport Layer Security Protocol):传输层安全性协议,其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。
1.2:为什么要使用TLS加密
为了防止链路劫持、会话劫持等问题导致 Docker 通信时被中 间人攻击,c/s 两端应该通过加密方式通讯。
1.3:在Docker中部署TLS
-
主机分配
主机名 IP地址 部署的服务 master 192.168.233.128 docker-ce client 192.168.233.129 docker-ce -
开局优化
[root@localhost ~]# hostnamectl set-hostname server '//两台主机修改主机名' [root@localhost ~]# su [root@server ~]# [root@localhost ~]# hostnamectl set-hostname client [root@localhost ~]# su [root@client ~]# [root@server ~]# cat >> /etc/hosts << EOF '//修改本地主机解析文件' > 192.168.233.128 server > 192.168.233.129 client > EOF [root@client ~]# cat >> /etc/hosts << EOF > 192.168.233.128 server > 192.168.233.129 client > EOF [root@client ~]# ping server '//是可以互通的' [root@server ~]# ping client
-
1、server服务器创建CA密码与CA证书
[root@server ~]# mkdir TLS [root@server ~]# cd TLS/ [root@server TLS]# [root@server TLS]# openssl genrsa -aes256 -out ca-key.pem 4096 '//使用rsa非对称秘钥,位数256位,-out 输出密钥文件ca-key.pem' Generating RSA private key, 4096 bit long modulus .................................................................................................................................................................++ .....................................++ e is 65537 (0x10001) Enter pass phrase for ca-key.pem: '//输入自定义密码123123' Verifying - Enter pass phrase for ca-key.pem: '//输入自定义密码123123' [root@server TLS]# ls ca-key.pem [root@server TLS]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem Enter pass phrase for ca-key.pem: '//输入CA秘钥密码123123' [root@server TLS]# ls ca-key.pem ca.pem '//subj 项目名称,new 新请求,x509 输出一个x509结构,而不是cert. req,days 由-x509生成的证书的有效天数。'
-
2、在master节点上创建server与client节点证书
通过在服务端上创建tls密钥证书,再下发给客户端,客户端通过私钥访问容器,这样就保证的docker通讯的安全性
CA证书只是一个官方认证的证书
接下来要创建server、client节点的证书
此时创建证书有三步
1.设置私钥 确保安全加密
2.私钥签名 确保身份真实不可抵赖
3.制作证书
csr是一个签名文件[root@server TLS]# openssl genrsa -out server-key.pem 4096 '//创建服务器秘钥' Generating RSA private key, 4096 bit long modulus .....................................................................++ ..........................................................................++ e is 65537 (0x10001) [root@server TLS]# ls ca-key.pem ca.pem server-key.pem [root@server TLS]# openssl req -new -key server-key.pem -sha256 -subj "/CN=*" -out server.csr '//基于服务端秘钥文件生成csr签名文件' [root@server TLS]# ls ca-key.pem ca.pem server-key.pem server.csr [root@server TLS]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem '//使用ca证书与私钥证书签名,导入签名ct.csr,指定CA文件和密钥文件,确定官方授权。输入自定义密码123123' Signature ok subject=/CN=* Getting CA Private Key Enter pass phrase for ca-key.pem: [root@server TLS]# ls ca-key.pem ca.pem ca.srl server-cert.pem server.csr server-key.pem '//相同方法生成client节点证书' [root@server TLS]# openssl genrsa -out client-key.pem 4096 '//生成客户端密钥' Generating RSA private key, 4096 bit long modulus .........................................................................................++ ........................++ e is 65537 (0x10001) [root@server TLS]# openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr '//生成客户端签名文件' [root@server TLS]# ls ca-key.pem ca.pem ca.srl client.csr client-key.pem server-cert.pem server.csr server-key.pem [root@server TLS]# echo extendedKeyUsage=clientAuth > extfile.cnf '//创建配置文件' [root@server TLS]# ls ca-key.pem ca.srl client-key.pem server-cert.pem server-key.pem ca.pem client.csr extfile.cnf server.csr [root@server TLS]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf '//基于ca证书,ca秘钥生成签名证书' Signature ok subject=/CN=client Getting CA Private Key Enter pass phrase for ca-key.pem: '//输入自定义密码123123' [root@server TLS]# ls ca-key.pem ca.srl client.csr extfile.cnf server.csr ca.pem client-cert.pem client-key.pem server-cert.pem server-key.pem [root@server TLS]# rm -rf ca.srl client.csr extfile.cnf server.csr '//删除多余文件'
-
3、配置Docker
[root@server TLS]# vim /usr/lib/systemd/system/docker.service ...省略内容 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/root/TLS/ca.pem --tlscert=/root/TLS/ct-cert.pem --tlskey=/root/TLS/ct-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock ...省略内容 [root@server TLS]# systemctl daemon-reload [root@server TLS]# systemctl restart docker [root@server TLS]# netstat -natp | grep docker tcp6 0 0 :::2376 :::* LISTEN 55402/dockerd [root@server TLS]# setenforce 0 setenforce: SELinux is disabled
-
4、将 client主机所需文件复制过去
[root@server TLS]# scp ca.pem [email protected]:/etc/docker [root@server TLS]# scp client* [email protected]:/etc/docker [root@ct TLS]#
-
5、本地验证
[root@ct TLS]# docker --tlsverify --tlscacert=ca.pem --tlskey=server-key.pem --tlscert=server-cert.pem -H tcp://server:2376 images REPOSITORY TAG IMAGE ID CREATED SIZE systemctl new a2c3616f15d1 5 days ago 717MB
-
6、client节点指定加密文件远程调用测试
[root@client ~]# cd /etc/docker/ [root@client docker]# ls ca.pem key.json client-cert.pem client-key.pem [root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://server:2376 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.4:使用Dockerfile和compose创建容器的时候需要注意
-
2016 年的 8 月 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 # Add your checks in below