• Docker存在安全问题
  • 通过API访问控制
  • 1.服务端开放端口
  • 2.客户端远程登入控制
  • TLS认证访问控制
  • 1.配置主机名
  • 2.创建tls目录存放相关文件
  • 3.创建ca秘钥和证书


Docker存在安全问题

  1. Docker自身漏洞

作为一款应用Docker本身实现上会有代码缺陷。CVE官方记录Docker历史版本共有超过20项漏洞。
黑客常用的攻击手段主要有代码执行、权限提升、信息泄露、权限绕过等。
目前Docker 版本更迭非常快,Docker用户最好将Docker升级为最新版本。

  1. Docker 源码问题

Docker提供了Docker hub(公有仓库),可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境。
但同时也带来了一些安全问题。例如下面三种方式:

(1) 黑客上传恶意镜像如果有黑客在制作的镜像中植入木马、后门等恶意软件,那么环境从一开始就已经不安全了,后续更没有什么安全可言。

(2)镜像使用有漏洞的软件Docker Hub 上能下载的镜像里面,75%的镜像都安装了有漏洞的软件。
所以下载镜像后,需要检查里面软件的版本信息,对应的版本是否存在漏洞,并及时更新打上补丁。

(3)中间人攻击篡改镜像镜像在传输过程中可能被篡改,目前新版本的 Docker已经提供了相应的校验机制来预防这个问题。

通过API访问控制

  • Docker的远程调用API接口存在未授权访问漏洞,至少应限制外网访问。建议使用Socket方式访问。

1.服务端开放端口

[root@master tls]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.10.10:2375   ##将准启动配置改为这条
[root@master tls]# systemctl daemon-reload  ##重载进程
[root@master tls]# systemctl restart docker   ##重启docker
[root@master ~]# netstat -anpt |grep 2375
tcp        0      0 192.168.10.10:2375      0.0.0.0:*               LISTEN      3910/dockerd

2.客户端远程登入控制

验证登入192.168.10.10控制镜像容器

[root@client ~]# docker images    ##首先查看本地镜像
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
centos                stress              ff638256123c        11 hours ago        401MB
compose_nginx_nginx   latest              2e9d53f55a43        3 days ago          455MB
centos                7                   8652b9f0cb4c        3 days ago          204MB
[root@client ~]# docker -H tcp://192.168.10.10 images    ##查看镜像,通过API登入master控制
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c39a868aad02        12 days ago         133MB

TLS认证访问控制

1.配置主机名

[root@localhost~]# hostnamectl set-hostname master
[root@localhost~]# su
[root@master ~]# echo “127.0.0.1 master” >>/etc/hosts

2.创建tls目录存放相关文件

[root@master ~]# mkdir /tls
[root@master ~]# cd /tls

3.创建ca秘钥和证书

1 创建ca秘钥

[root@master tls]# openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
....................................++
..........................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:                 ## 输入密码
Verifying - Enter pass phrase for ca-key.pem:     ##再次输入密码

2 创建ca证书

[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem
Enter pass phrase for ca-key.pem:     ##输入密码,创建证书

3 创建服务器私钥

[root@master tls]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
..........................++
............++
e is 65537 (0x10001)

4 签名私钥

[root@master tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

5 使用ca证书与私钥证书签名

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
Signature ok
subject=/CN=*
Getting CA Private Key
Enter pass phrase for ca-key.pem:     ##输入认证密码

6 生成客户端密钥

[root@master tls]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
......................................................++
........................................++
e is 65537 (0x10001)

7 签名客户端

[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr

8 创建配置文件

[root@master tls]# echo extendedKeyUsage=clientAuth > extfile.cnf

9 签名证书

[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:     ##输入密码

10 删除多余文件,以.pem结尾的是有用文件

[root@master tls]# ls
ca-key.pem  ca.pem  ca.srl  cert.pem  client.csr  extfile.cnf  key.pem  server-cert.pem  server.csr  server-key.pem
[root@master tls]# ls *.pem
ca-key.pem  ca.pem  cert.pem  key.pem  server-cert.pem  server-key.pem

[root@master tls]# ls |egrep -v "*.pem" |xargs rm -rf   ##删除无用文件

[root@master tls]# ls
ca-key.pem  ca.pem  cert.pem  key.pem  server-cert.pem  server-key.pem
  1. 放通端口
[root@master tls]#  vim /lib/systemd/system/docker.service
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   
##修改准启动项
[root@master tls]# systemctl daemon-reload
[root@master tls]# systemctl restart docker
  1. 将/tls/ca.pem /tls/cert.pem /tls/key.pem三个文件复制到另一台主机(客户端)
[root@master tls]# scp ca.pem cert.pem key.pem root@192.168.10.20:/etc/docker/

root@192.168.10.20's password: 
ca.pem                                         100% 1765   891.6KB/s   00:00    
cert.pem                                       100% 1696     2.1MB/s   00:00    
key.pem                                        100% 3243     4.7MB/s   00:00
  1. 到客户端(192.168.10.20)访问控制测试
[root@client ~]# ls /etc/docker/*.pem    ##查看证书文件
/etc/docker/ca.pem  /etc/docker/cert.pem  /etc/docker/key.pem

[root@client ~]# echo "192.168.10.10 master" >>/etc/hosts

[root@client docker]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c39a868aad02        12 days ago         133MB