赞
踩
Docker容器是目前很火的技术之一,应用的场景也非常之多,由此而来的安全问题更是称为了重中之重,本篇博客就Docker安全管理,做一些讲述。
次处列举了Docker 的8个使用场景,分别为:
① 简化配置
② 代码流水线管理
③ 提升开发效率
不同环境中, 开发者的共同目标
想让开发环境尽量贴近生产环境
想快速搭建开发环境
开发环境的机器通常内存比较小, 之前使用虚拟的时候, 我们经常需要为开发环境的机器加内存, 而现在Docker可以轻易的让几十个服务在Docker中跑起来
④ 隔离应用
开发时会在一个台机器上运行不同的应用
为了降低成本, 进行服务器整合
将一个整体式的应用拆分成低耦合的单个服务(微服务架构)
⑤ 整合服务器
⑥ 调式能力
⑦ 多租户环境
⑧ 快速部署
Docker 本身的架构与机制就可能产生问题,例如以下攻击场景:
黑客已经控制了宿主机上的一些容器,或者获得了通过在公有云上建立荣光其的方式,然后对宿主机或者其他容器发起攻击。
① 容器之间的局域网攻击
主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗、嗅探、广播风暴等攻击方式便可以用上
② DDos 攻击耗尽资源
Cgroups安全机制就是要防止此类工具,不要为单一的容器分配过多的资源即可避免此类问题
③ 有漏洞的系统调用
Docker与虚拟机的一个重要的区别就是Docker与宿主机共用一个操作系统内核。一旦宿主内核存在可以越权或者提权的漏洞,尽管Docker使用普通用户执行,在容器被侵入的时候,攻击者还可以利用内核漏洞作为跳板跳到宿主机做更多的事情。
④ 共享root用户权限
如果以root用户权限运行容器,容器内的root用户也就拥有了宿主机的root权限
docker exec -it 容器ID bash
Docker 的远程调用API接口存在未授权访问漏洞,至少应限制外网访问,可以使用Socket 方式访问
准备两台centos 7虚拟机
#关闭核心防护
[root@docker2 ~]# setenforce 0
#查看服务状态
[root@docker2 ~]# netstat -natp | grep docker
[root@docker2 ~]#
#可见,docker未对外提供访问的端口,无法访问
[root@docker2 ~]# vim /usr/lib/systemd/system/docker.service
#14行注销,14行准启动中地址指向的是本地的通讯文件目录
#15行插入以下内容,对外提供2375端口
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.226.133:2375
#以上配置项中,通讯文件使用的是unix的
#-H 指定监听地址为本地IP且对外提供的端口为2375
......省略部分内容
[root@docker2 ~]# systemctl daemon-reload
[root@docker2 ~]# systemctl restart docker
[root@docker2 ~]# netstat -natp | grep docker
tcp 0 0 192.168.226.133:2375 0.0.0.0:* LISTEN 28163/dockerd
#可见通过2375端口被访问
[root@docker2 ~]# docker -H tcp://192.168.226.133:2375 version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
......省略部分内容
[root@docker2 ~]# docker pull nginx
[root@docker2 ~]# docker run -itd --name c1 nginx /bin/bash
.....省略部分内容
#Dokcer 2 清空防火墙规则
iptbales -F
#Docker 1 远程查看Docker 2镜像列表
[root@docker1 ~]# docker -H tcp://192.168.226.133:2375 images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 602e111c06b6 2 days ago 127MB
[root@docker1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.226.132/24" reject"
success
#重载规则
[root@docker1 ~]# firewall-cmd --reload
success
参数详解:
–permanent :永久生效
–zone=public :公共区域
–add-rich-rule:定义副语言规则
rule family=“ipv4”:版本为ipv4
source address="192.168.226.132/24 :目标源地址为本地IP 24网段
reject :拒绝
对于外网访问本地端口的安全问题及建议如下:
① 安全问题:
一般来说,大量问题是因为Docker容器端口外放引起的漏洞。除了操作系统账户权限控制上的问题,更在于对Docker Daemon的进程管理上存在隐患,目前常用的Docker版本都支持Docker Daemon 管理宿主的iptables,而且一旦启动进程加上-p host_port:guest_port 的端口映射,Dokcer Daemon 会直接增加对于的FORWARD Chain并且-j ACCEPT,而默认的DROP规则是在INPUT链做的,对docker没法限制,这就留下了很严重的安全隐患。
② 建议:
TLS(Transport Layer Security,安全传输层),TLS是建立在传输层TCP协议之上的协议,服务于应用层,它的前身是SSL(Secure Socket Layer,安全套接字层),它实现了将应用层的报文进行加密后再交由TCP进行传输的功能。
为了防止链路劫持、会话劫持等问题导致Docker通讯时被中间人攻击,c/s 两端应该通过加密方式通讯
CA认证:
证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA 证书颁发的时候,证书中是包含密钥对的,同时用户信息也是进行加密的,所以CA颁发的证书具有两个特点:
① 用户发送的信息都是加密的
② 身份的唯一性
实验环境
两台centos7 (与上文的IP一致),镜像还原到只安装了Docker 的状态
Docker 1 作为服务端(master)
Docker 2 作为客户端(client)
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]# vim /etc/hosts
127.0.0.1 master
[root@master ~]# mkdir /tls
[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: #设置密码为123123
Verifying - Enter pass phrase for ca-key.pem: #重复输入
[root@master tls]# ls
ca-key.pem
参数详解:
openssl :开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听。
genrsa:rsa 非对称密钥
-aes256:指定密钥长度位256位
-out ca-key.pem:创建ca-key.pam密钥文件
④ 创建ca证书
[root@master tls]# openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pam
Enter pass phrase for ca-key.pem: #创建ca密钥时设置的密码
[root@master tls]# ls
ca-key.pem ca.pam
#此ca.pam证书是官方颁发的
参数详解、
req -new:请求创建新的证书
-x509:证书的一个参数
-days:证书周期是1000天
-key:指定密钥文件
-sha256:哈希验证
-subj “/CN=*”:指定项目名称
-out ca.pam:产生出ca证书
⑤ 创建证书
以上创建完成后,下面的步骤为:
① 创建服务端证书
#创建私钥
[root@master tls]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.............................................................................................................................................++
....................++
e is 65537 (0x10001)
#签名私钥
[root@master tls]# openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
#使用server-key.pem 密钥文件进行签名,生成签名文件
#server.csr 签名文件
[root@master tls]# ls
ca-key.pem ca.pam server.csr server-key.pem
#使用ca证书与私钥证书签名,密码输入123123,生成服务端 509证书
[root@master tls]# openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pam -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
Signature ok
subject=/CN=*
Getting CA Private Key
Enter pass phrase for ca-key.pem:
[root@master tls]# ls
ca-key.pem ca.pam ca.srl server-cert.pem server.csr server-key.pem
参数详解
openssl x509:使用openssl方式生成 509证书
-req :请求
-days 1000:有效期天数
-sha256:哈希值验证
-in server.csr :导入签名文件
-CA ca.pam :加入CA官方授权的证书
-CAkey ca-key.pem:加入CA官方的密钥
-CAcreateserial -out server-cert.pem:创建服务端的证书
② 创建客户端证书
客户端的证书也是要由服务端进行申请
#创建密钥
[root@master tls]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
................................................++
...............++
e is 65537 (0x10001)
[root@master tls]# ls
ca-key.pem ca.pam ca.srl key.pem server-cert.pem server.csr server-key.pem
#使用密钥进行签名
[root@master tls]# openssl req -subj "/CN=client" -new -key key.pem -out client.csr
[root@master tls]# ls
ca-key.pem ca.srl key.pem server.csr
ca.pam client.csr server-cert.pem server-key.pem
创建配置文件
区分服务端和客户端
[root@master tls]# echo extendedKeyUsage=clientAuth > extfile.cnf
[root@master tls]# ls
ca-key.pem ca.srl extfile.cnf server-cert.pem server-key.pem
ca.pam client.csr key.pem server.csr
[root@master tls]# openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pam -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: #密码123123
[root@master tls]# ls
ca-key.pem ca.srl client.csr key.pem server.csr
ca.pam cert.pem extfile.cnf server-cert.pem server-key.pem
[root@master tls]# rm -rf ca.srl client.csr extfile.cnf server.csr
[root@master tls]# ls
ca-key.pem ca.pam cert.pem key.pem server-cert.pem server-key.pem
[root@master tls]# vim /usr/lib/systemd/system/docker.service
#注释14行默认的准启动内容
#在15行添加准启动内容
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
#--tls 加密通讯。指定/tls目录下的证书。指定使用tcp访问方式,对外开启端口2376(使用unix通讯文件)
----->wq
[root@master tls]# systemctl daemon-reload
[root@master tls]# systemctl restart docker
[root@master tls]# scp ca.pem root@192.168.226.133:/etc/docker/ The authenticity of host '192.168.226.133 (192.168.226.133)' can't be established. ECDSA key fingerprint is SHA256:aSyVuV+25pwNT0PVyk530AC+5Age6Mm3zx2EEXFKdmU. ECDSA key fingerprint is MD5:5a:d1:49:cb:73:aa:a1:0e:be:41:0c:02:0c:91:30:a0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.226.133' (ECDSA) to the list of known hosts. root@192.168.226.133's password: ca.pem 100% 1765 1.3MB/s 00:00 [root@master tls]# scp cert.pem root@192.168.226.133:/etc/docker/ root@192.168.226.133's password: cert.pem 100% 1696 1.3MB/s 00:00 [root@master tls]# scp key.pem root@192.168.226.133:/etc/docker/ root@192.168.226.133's password: key.pem 100% 3243 2.6MB/s 00:00 #客户端查看推送的文件 [root@client docker]# ls ca.pem cert.pem daemon.json key.json key.pem
#服务端
[root@master tls]# setenforce 0
[root@master tls]# iptables -F
#客户端
[root@client docker]# setenforce 0
[root@master tls]# docker pull tomcat
[root@master tls]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 927899a31456 32 hours ago 647MB
#在服务端以TCP访问的形式查询镜像列表
[root@master tls]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 927899a31456 32 hours ago 647MB
参数详解
–tlsverify :TLS 证书
–tlscacert=ca.pem:CA官方颁发的ca证书
–tlscert=cert.pem:客户端证书
–tlskey=key.pem:客户端密钥证书
-H tcp://master:2376 images:使用tcp 通讯方式查询镜像列表
④ 客户端验证
将master地址添加到hosts
[root@client docker]# vim /etc/hosts
192.168.226.132 master
#添加以上信息
[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
tomcat latest 927899a31456 32 hours ago 647MB
# 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
配置思路:
① 在服务端创建ca官方的ca密钥和ca证书
② 设置服务端私钥:确保安全加密
③ 服务端私钥签名:确保身份真实不可抵赖
④ 制作证书
⑤ 客户端:
⑥ 在服务端将证书推送到客户端
⑦ 最后在客户端,包含ca.pem文件的目录中使用tcp 通讯访问查询服务端信息
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。