《基于Kubernetes的容器云平台实战》——3.5 容器镜像安全加固
3.5 容器镜像安全加固
Docker容器通过namespace进行进程间的隔离,通过CGroup限制资源的使用,这只能做到进程及文件的安全隔离,同虚拟机操作系统级别的安全隔离尚有差距,正是因为这方面的原因,容器轻量快速的特性才能发挥出来。
研发应用软件时,开发人员编写代码并提交到配置库,触发持续集成流程,经测试人员进行测试,测试通过后由运维人员部署到生产环境,因此容器安全加固涉及容器的全生命周期,包括开发阶段及生产阶段。容器安全加固就是在开发测试环境中保证容器镜像构建、存储安全可信,在生产环境中保证容器启动、运行、停止正确即可。
3.5.1 容器安全加固规范
Docker主机安全加固
具有一定规模的企业会建立自己的主机安全加固规范及checklist,按照这个规范进行即可,如关闭swap、防火墙、文件句柄修改等,必要时使用安全工具对主机进行安全扫描。对安全要求极高的企业可以考虑使用自主研发的操作系统,在操作系统中启用SELinux。
更改运行容器的用户权限
为了防止容器“逃逸”并获得宿主机的权限,因此要用非root用户执行容器;如果用户已经在镜像中定义,那么可以通过Dockerfile在此镜像基础上生产新的镜像,在Dockerfile中添加用户:RUN useradd -d/home/<用户名> -m -s/bin/bash <用户名> USER <用户名>。如果制作镜像文件时需要使用root权限同后端daemon进程进行交互,则可以使用kaniko开源工具进行处理。
镜像中的setuid及setgid
setuid和setgid指令可用于提权,如果这两个指令使用高权限就可能引入了风险,因此在镜像中要进行权限控制,一般在Dockerfile末尾添加命令:RUN find/-perm 6000 -type f -exec chmod a-s {}\;||true进行权限控制。
对镜像进行安全扫描,使用安全可信的容器镜像
使用clair或其他工具对镜像文件进行安全漏洞扫描,根据扫描结果打补丁或更新软件,消除安全隐患后再重新制作镜像。
镜像文件使用数字签名
对从Docker仓库发送和接收的数据使用数字签名能力,允许客户端验证特定镜像标签的完整性。
启用HTTPS
Docker对所有请求启用TLS验证,启用HTTPS需要对Docker启动文件进行配置,可使用命令:
dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem \ -H=10.47.40.110:2376
容器网络流量限制
默认情况下容器能访问容器网络上的所有流量,因此可能会导致信息泄露,Dockerd采用守护进程模式启动时增加参数-icc = false可以对容器流量进行限制,只访问自己的流量。
内存配额限制
默认情况下容器可以使用主机所有内存,容器启动时通过-m或-memory参数限定容器的内存,如使用命令docker run -it --rm -m 128m限制内存配额。
CPU优先级限制
默认情况下CPU是没有设置优先级的,用户可以通过CPU共享设定优先级。如使用下面的命令设置优先级:
docker run -it --rm --cpuset=0,1 -c 2
存储空间配额限制
采用docker -d --storage-opt dm.basesize=5G命令可限制存储空间配额,但目前还不能有效控制磁盘I/O。
日志和审核
收集并归档与Docker相关的日志以便后期进行审核监控或做统计分析,记录容器日志的命令如下:
docker run -v /dev/log:/dev/log <container_name> /bin/sh
- 点赞
- 收藏
- 关注作者
评论(0)