以root身份运行容器不是很安全,root拥有全部的权限,因此很危险,如果以非root身份运行容器那么将处处受,所以需要一种技术,能选择容器运行所需的root用户权限。
在底层,Linux root由许多能力组成,包括以下几点:
CAP_CHOWN - 允许用户修改文件所有权
CAP_NET_BIND_SERVICE - 允许用户将socket绑定到系统端口号
CAP_SETUID - 允许用户提升进程优先级
CAP_SYS_BOOT - 允许用户重启系统
Docker采用Capability机制来实现用户在以root身份运行容器的同时,还能移除非必须的root能力。
Seccomp
Docker使用过滤模式下的Seccomp来限制容器对宿主机内核发起的系统调用。
每个新容器都会设置默认的Seccomp配置。
整个容器环境的潜在攻击面和攻击对象,由四类威胁:
但实际最为重点的是,容器逃逸和针对Docker守护进程的攻击。
要判断目标环境是不是容器,才谈得上容器逃逸,为后续渗透做更多准备。
容器环境许多常用命令不存在,例如ping、ipconfig、netstat等都没有;
成熟的业务不会直接通过容器进行部署,而是采用Kubernetes编排统一编排和调度,其中K8s每个Pod是一台逻辑主机,目标容器所在的Pod可能存在其它的容器。
容器依赖了什么镜像,镜像是否包含有漏洞?
Docker的API端口是否有未授权和暴露在外面?
目标是k8s等集群系统,是否会有更多的宿主机节点存在相同安全问题?如何在这样环境中横向移动?
为了限制容器的资源,Docker为每个容器创建了一个控制组以及一个名为docker的父控制组,如果某个进程在Docker容器中启动,则该进程将必须在该容器控制中,所以通过查看初始进程的cgroup来验证是否为容器。
检查/proc/1/cgroup内是否包含docker等字符串
cat /proc/1/cgroup |grep "docker"
当前环境内进程是否少于5个?
ps aux
在系统进程中有一个根进行,ID为1,而且在容器中不会看到关于init或者systemd进程,而容器仅运行一个进程而不是完整的操作系统进程,所以可以通过系统进程数来判断是否为容器。
Docker的镜像会尽可能的小,只保留一些必要的库,而一些像常用的命令、gcc库都会被去除保证最小化,那么可以通过最基本的ping命令都不存在,可能是在Docker环境中。
当前环境是否常用的命令都不存在?
ping、sudo、ifconfig、ssh、vi、gcc
mount命令查看
Docker容器环境检测方法【代码】