一、docker存在的安全问题
1、docker 自身漏洞
docker 应用本身实现上会有代码缺陷,docker 历史版本共有超过 20 项漏洞
2、docker公有仓库安全问题
docker 提供了 docker hub,可以让用户上传创建的镜像,以便其他用户下载,快速搭建环境。但同时也带来了一些安全问题,例如:黑客上传恶意镜像、镜像使用有漏洞的软件、中间人攻击篡改镜像。
3、容器之间的局域网攻击
主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗、端口扫描、广播风暴等攻击方式便可以用上。所以,在一个主机上部署多个容器需要合理的配置网络安全,比如设置 iptables 规则
4、 DDoS 攻击耗尽资源
DDOS 攻击,中文名叫分布式拒绝服务攻击,指借助服务器技术将多个计算机联合起来作为攻击平台,来对一个或多个目标发动 DDOS 攻击。通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的。
Cgroups 安全机制就是要防止此类攻击的,不要为单一的容器分配过多的资源即可避免此类问题
5、有漏洞的系统调用
Docker 与虚拟机的一个重要的区别就是 Docker 与宿主机共用一个操作系统内核。
一旦宿主内核存在可以越权或者提权漏洞,尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞跳到宿主机做更多的事情。
6、共享root用户权限
如果以 root 用户权限运行容器(docker run --privileged),容器内的 root 用户也就拥有了宿主机的root权限
二、docker容器使用安全注意点
使用最少资源和最低权限运行容器,此为 Docker 容器安全的核心思想。
尽量别做的事:
尽量不用 --privileged 运行容器(授权容器root用户拥有宿主机的root权限)
尽量不用 --network host 运行容器(使用host网络模式共享宿主机的网络命名空间)
尽量不在容器中运行 ssh 服务
尽量不把宿主机系统的关键敏感目录挂载到容器中
尽量要做的事:
尽量使用较小体积的镜像
尽量以单一应用进程运行容器
尽量在容器中使用最新稳定版本的应用
尽量安装使用最新稳定版本的docker
尽量以最低权限运行容器
尽量使用官方提供的镜像或自己构建的镜像
尽量给docker目录(默认/var/lib/docker/)分配独立的文件系统
尽量以资源限制的方式运行容器 -m --memory-swap --cpu-quota --cpu-shares --cpuset-cpus --device-write-bps
尽量以只读的方式挂载数据卷,持久化容器数据到宿主机的除外 -v 宿主机目录:容器数据卷目录:ro
尽量设置容器的重启策略和次数 --restart always|on-failure:N
尽量对镜像进行漏洞扫描
三、https协议
https是安全的超文本传输协议,使用tcp协议443端口,采用密文传输,证书加密(ssl/tls加密)的方式
1、https的单向认证流程
0)服务端会事先通过CA签发服务端证书和私钥文件
1)客户端发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端受到服务端发来的证书后,会先用本地的CA证书校验服务端证书的有效性,如果证书有效,则继续,否则告警
4)客户端发送自己可支持的对称加密方案给服务端
5)服务端会选择加密程度最高的方案,并通过明文方式发送给客户端
6)客户端使用选择的加密方案生成随机会话密钥并通过证书中的公钥进行加密,再发送给服务端
7)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也使用这个会话密钥进行解密获取服务端返回的数据,之后双方可继续这个会话密钥进行加密和解密来实现密文通信
2、https的双向认证流程
0)服务端和客户端会事先通过CA签发服务端证书和私钥文件
1)客户端发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端收到服务端发来的证书后,会先用本地的CA证书校验服务端证书的有效性,如果证书有效,再将包含公钥的客户端证书发送给服务端
4)服务端收到客户端证书后也会校验证书的有效性,客户端还会发送自己可支持的对称加密方案给服务端
5)服务端会选择加密程度最高的方案,并通过客户端证书里的公钥加密后发送给客户端
6)客户端使用私钥解密获取选择的加密方案,并使用此加密方案生成随机会话密钥,再通过服务端证书中的公钥进行加密,再发送给服务端
7)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也是这个会话密钥进行解密获取服务端返回的数据,之后双方可继续这个会话密钥进行加密和解密来实现密文通信
3、如何获取证书
①在阿里云、华为云、腾讯云等云服务商那里申请一年有效期的免费证书或者购买证书
②在本地使用 openssl、mkcert、cfssl、certbot(Let's Encrypt)等工具生成本地私钥证书
4、mkcert工具获取证书
5、openssl工具获取证书
①先使用yum安装openssl
②创建ca私钥
③创建ca证书
req:执行证书签发命令
-new:新证书签发请求
-x509:生成x509格式证书,专用于创建私有CA时使用
-days:证书的有效时长,单位是天
-key:指定私钥路径
-out:输出文件的路径和名称
④创建服务器私钥
⑤生成证书签名请求文件(csr文件)
x509:生成x509格式证书
-req:输入csr文件
-in:要输入的csr文件
-CA:指定ca证书的路径
-CAkey:指定ca证书的私钥路径
-CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl