需对容器系统性安全加固:一、用非root用户运行;二、启用seccomp过滤系统调用;三、配置apparmor/selinux策略;四、禁用不必要capabilities;五、挂载只读根文件系统;六、扫描并精简基础镜像;七、限制资源使用并启用oom防护。

如果您在Linux环境中运行容器应用,但面临潜在的安全风险,如容器逃逸、权限滥用或镜像漏洞,则需要对容器进行系统性安全加固。以下是实施容器安全加固的具体操作步骤:
一、使用非root用户运行容器
默认情况下,容器内进程常以root身份运行,一旦被攻破易导致宿主机提权。通过指定非特权用户,可显著限制攻击面,降低横向渗透风险。
1、在Dockerfile中添加USER指令,指定UID为1001的普通用户。
2、构建镜像前,确保基础镜像中已创建该用户,例如执行adduser -u 1001 -D appuser。
3、运行容器时,显式覆盖用户设置:docker run --user 1001:1001 image-name。
二、启用Seccomp系统调用过滤
Seccomp机制可限制容器内进程能执行的系统调用种类,阻止恶意程序调用危险接口(如execveat、clone等),从而遏制利用内核漏洞的行为。
1、下载官方推荐的seccomp默认配置文件:curl -o seccomp.json https://raw.githubusercontent.com/moby/moby/master/profiles/seccomp/default.json。
2、编辑该JSON文件,将"execve"和"openat"等高风险调用的"action"字段设为"SCMP_ACT_ERRNO"。
3、启动容器时挂载该策略:docker run --security-opt seccomp=seccomp.json image-name。
三、配置AppArmor或SELinux策略
强制访问控制(MAC)框架可在进程级实施细粒度权限约束,防止容器突破命名空间边界访问宿主机资源或其它容器数据。
1、确认宿主机已启用AppArmor:aa-status命令返回active状态。
2、编写profile文件,声明容器仅允许读取/app/config、写入/tmp、禁止网络绑定到特权端口。
3、加载策略:sudo apparmor_parser -r /etc/apparmor.d/docker-container-profile。
4、运行容器时指定策略名:docker run --security-opt apparmor=docker-container-profile image-name。
四、禁用不必要能力(Capabilities)
Docker默认赋予容器部分Linux Capabilities(如CAP_NET_RAW、CAP_SYS_ADMIN),这些能力可能被用于构造ARP欺骗或挂载文件系统。移除未使用的Capability可缩小攻击面。
1、列出容器当前启用的能力:docker inspect container-id | jq '.[0].HostConfig.CapAdd'。
2、启动容器时显式丢弃全部默认能力:docker run --cap-drop=ALL image-name。
3、按需仅添加必需能力,例如仅开放网络诊断:docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE image-name。
五、挂载只读根文件系统
将容器根目录设为只读,可防止恶意代码在运行时篡改二进制文件、注入动态库或修改配置,提升运行时完整性保障。
1、检查容器内关键路径是否依赖写入权限,如/tmp、/run、/var/log。
2、对必须写入的路径单独挂载可写卷:docker run --read-only -v /tmp:/tmp:rw image-name。
3、验证根文件系统状态:进入容器后执行mount | grep " / " | grep ro,输出应包含ro标识。
六、扫描并精简基础镜像
臃肿的基础镜像常包含大量未使用软件包与调试工具(如vim、curl、gcc),不仅增大攻击面,还提高漏洞暴露概率。使用最小化镜像并定期扫描可消除已知CVE风险。
1、将FROM指令从ubuntu:22.04替换为FROM registry.access.redhat.com/ubi8/ubi-minimal:latest或FROM alpine:3.19。
2、构建后执行镜像扫描:trivy image --severity CRITICAL,MEDIUM,HIGH your-image-name。
3、删除扫描报告中所有CVE-XXXX-XXXX编号对应的问题包,例如移除openssl旧版本并升级至openssl-3.0.12及以上。
七、限制容器资源使用并启用OOM Killer防护
未加限制的内存与CPU使用可能导致拒绝服务(DoS)或触发内核OOM Killer误杀关键进程。通过cgroup约束可保障宿主机稳定性,并防止容器间资源争抢。
1、设定内存上限为512MB且启用软限制:docker run -m 512m --memory-reservation 256m image-name。
2、限制CPU使用率不超过两个核心的75%:docker run --cpus 1.5 image-name。
3、启用内存溢出时自动终止容器而非触发全局OOM:docker run -m 512m --oom-kill-disable=false image-name。










