盘Docker吗?Docker安全之TLS通讯加密部署

前言

一:Docker-TLS加密通讯部署

1.1:什么是TLS?有什么作用?

TLS(Transport Layer Security Protocol):传输层安全性协议,其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连线,防止在交换数据时受到窃听及篡改

TLS协议的优势是与高层的应用层协议(如HTTPFTPTelnet等)无耦合。应用层协议能透明地运行在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
    

谢谢赏阅!如有疑问可评论区交流!

原创文章 172 获赞 97 访问量 5万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/105852477