- Docker存在安全问题
- 通过API访问控制
- 1.服务端开放端口
- 2.客户端远程登入控制
- TLS认证访问控制
- 1.配置主机名
- 2.创建tls目录存放相关文件
- 3.创建ca秘钥和证书
Docker存在安全问题
- Docker自身漏洞
作为一款应用Docker本身实现上会有代码缺陷。CVE官方记录Docker历史版本共有超过20项漏洞。
黑客常用的攻击手段主要有代码执行、权限提升、信息泄露、权限绕过等。
目前Docker 版本更迭非常快,Docker用户最好将Docker升级为最新版本。
- 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
- 放通端口
[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
- 将/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
- 到客户端(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