生产环境docker安全规范准则

一、容器与虚拟机之间的区别

今天向大家讲解在生产环境中是如何提高docker容器的安全,一讲到容器就会想到他的好兄弟虚拟机。虚拟机和容器具有本质上的区别,以kvm为例:
在这里插入图片描述
在原先操作系统的基础上虚拟化平台通过进程模拟出各种硬件设备:CPU、内存、硬盘、网卡等,之后在虚拟硬件的基础上又搭载了其他操作系统,所以每个虚拟机都有属于自己的 系统内核。
反观容器,所有容器都与宿主机的操作系统共享系统内核。也可以这样理解容器的运行不需要再虚拟出各种虚拟化的硬件和搭载操作系统,全部都在与属主系统共享资源和系统内核。
那么问题就来了,虚拟机可以实现资源、系统内核、网络等隔离,而容器由于其共享特性使其如果被黑客攻陷非常容易影响到宿主系统,进而使得整个系统不安全可靠。

二、Docker容器本身存在的缺陷

1.Docker自身存在的漏洞

无论任何一款软件都会存在某些漏洞和缺陷,Docker也是如此,官方记载曾多达20多项漏洞。所以以前也曾有过黑客攻击容器的事件,一般在生产环境中会使用运行最为稳定的Docker版本而非最新版。但是在其他情况下建议使用Docker的最新版本。

2.Docker的源码问题

Docker hub可以使用户上传自己的镜像到共有仓库中去,这样其他用户也可以从共有仓库中下载自己想要的镜像。然而这也存在严重的问题。比如说:有些用户上传的镜像存在漏洞软件,这样其他用户下载下来加载成容器,就会使其系统承受巨大的风险。不仅如此,有些别有用心的黑客也会上传一些带有木马病毒的镜像到共有仓库中,那么这也会使用户遭受到巨大的损失。除此之外,还有中间人攻击,在镜像传输的过程中,篡改镜像的内容。

三、安全使用Docker容器的铁律

我会从系统内核、主机、网络、容器、镜像等一些其他方面阐述如何使Docker容器更加安全的使用。

1.从系统内核的角度考虑

1.从我们熟悉的windows操作系统来说,如果你的系统是正版的win10那么可能会不定期的自动更新你的系统。这种形式就是防止一些最新的网络攻击的手段。同理我们也要定期更新我们的系统内核因为Docker容器是和宿主系统共享系统内核。

2.如果一个容器遭受到了来自网络黑客的攻击,如DDoS攻击,如果没有做任何安全的措施就有可能整个宿主系统的资源就会被这个容器所占用,耗尽了所有的进程。这是我们不希望看到的,所以我们应该为每个容器定制好资源配额(cgroups),如指定CPU核心和限制bps的读写、内存大小。

3.划分好容器的权限,防止越权。并且禁止使用root用户登录到容器内部。即–privileged。

4.使用selinux限制一些文件的访问权限。

2.从宿主机的角度防范问题容器

1.定期对Docker守护进程、相关文件和目录进行审计。防止有些木马病毒或者别有用心之人私自篡改Docker的

2.宿主机最小化安装系统,运行必要的软件和服务。干我们这一行的应该明白打开的软件越多就越容易被攻击瘫痪。多一个服务就有可能多一个漏洞。

3.容器使用的存储空间最好是宿主系统挂载的分布式存储设备,并且禁止将宿主系统的敏感文件目录映射到容器内部,并且映射到容器内部的文件目录最好开启只读公共能。

4.定期清理不必要的容器和审计所需要的的容器的数目和名称。防止有人恶意创建容器。

5.设置适当的默认文件描述符数。(文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件)

3.从网络的角度加固Docker和宿主的安全

1.禁止将一些特权端口映射到容器内部,如22端口。并且每个容器只开放必要的端口共外部访问。

2.禁止将容器的网络空间与宿主系统绑定。我们知道如果一旦容器遭受了网络的攻击,这样非常有可能使宿主受到牵连。

3.通过防火墙规则禁止容器可以访问外部网络,但是外部依旧可以访问到容器内部。

4.将进入到容器的流量绑定到网卡上。

4.如何下载安全可靠的镜像

1.下载镜像最好也是最安全的方法就是,建立私有镜像仓库。有需要的镜像只需要从镜像仓库中拉取下载,无须担心下载的镜像不安全。

2如果一定要使用公有镜像,最好从官方的镜像仓库中下载可信度最高的镜像,并且从安可靠的安全通道下载。

3.定期、及时清理不必要的镜像。

4.对镜像进行签名,加强镜像的安全度。

5.安全使用容器

1.和安装最小化操作系统的原理一致,即开启最小化的容器运行业务。

2.容器以单一的进程进行运行。

3.禁止通过特权的防止运行容器和用ssh远程连接容器。最好使用docker exec的方式进入容器。

4.限制容器的进程数和重启次数,一是防止占用太多系统资源、二是防止容器内部数据的丢失。

5.以只读的方式挂载容器的根目录系统。

6.其他设置让整个系统环境更加安全

1.定期对宿主机系统及容器进行安全审计。

2.避免在同一宿主机上部署大量容器,维持在一个能够管理的数量。

3.定期收集日志,检查容器运行状态。

4.通过监控软件实时监控容器的运行状态和性能指标,一旦有紧急事件发生应及时相应,并处理。

四、Docker的安全通信

1.禁止用ssh远程登录到容器中,应该用使用:docker exec的命令。

在这里插入图片描述

2.设置Docker remote api 访问控制

docker的远程api接口调用存在漏洞,我们需要将其设置成监听指定IP网段的请求。在收到指令后执行相应的docker命令。因为如果不做任何访问控制,就有可能遭受未知的攻击。

1.首先在Docker的docker.service进行修改。
 vi /usr/lib/systemd/system/docker.servoce
 #指定本机的IP地址和端口号: ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://本机IP地址:端口号
 ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.80.106:2375
 #重启进程和docker
 清空防火墙的规则
systemctl daemon-reload
systemctl restart docker
iptables -F

2.其他节点可以通过命令的远程操控本地容器。

#docker -H=tcp://远程容器IP地址 操作命令
docker -H=tcp://192.168.80.106:2375 ps

在这里插入图片描述

3.禁止容器访问外部网络

如果容器的端口对外部网络显示,就会引起许多安全隐患,为此我们需要设置防火墙规则,禁止对外暴露端口。

#设置防火墙富规则禁止内部流量对外部访问。
firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.80.0/24" reject" --permanent
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐