宿主机仅负责调度与隔离,业务全在容器内:禁用非必需服务,最小化内核编译,强制用户命名空间映射,只读根文件系统,限制能力与特权,加固文件系统权限,启用auditd与journald审计。

精简宿主机内核与系统服务
容器化环境的核心原则是“宿主机只负责调度和隔离,业务逻辑全在容器内”。因此宿主机无需运行数据库、Web服务器、消息队列等应用级服务。应禁用并卸载所有非必需服务(如apache2、mysql-server、postfix、bluetooth、cups),仅保留sshd(若需远程管理)、systemd-journald(日志)、containerd或dockerd及其依赖。
内核层面启用最小化编译选项:关闭未使用的子系统(如InfiniBand、FireWire、ACPI S4/S5休眠)、禁用模块自动加载(kernel.modules_disabled=1)、限制可加载模块路径(/lib/modules/$(uname -r)/kernel/),并通过modprobe.d黑名单禁止高危模块(如usb-storage、firewire-core)。
强化容器运行时与命名空间隔离
避免以 root 用户直接运行容器,强制使用userns-remap(Docker)或rootless mode(Podman)。配置/etc/subuid和/etc/subgid为容器用户分配独立 UID/GID 范围,使容器内 root 映射为宿主机上的非特权用户。
启动容器时显式指定安全选项:
- 添加--read-only挂载根文件系统,仅对必要路径用--tmpfs或-v以rw,noexec,nosuid,nodev方式挂载
- 禁用特权模式:--privileged=false(默认),不挂载/dev、/sys等敏感路径
- 限制能力集:--cap-drop=ALL --cap-add=CAP_NET_BIND_SERVICE(按需添加)
- 启用 Seccomp 和 AppArmor 配置文件,拦截危险系统调用(如ptrace、mount、bpf)
收紧宿主机文件系统与权限控制
将/var/lib/docker(或/var/lib/containerd)所在分区单独划分,并启用noexec、nosuid、nodev挂载选项。对关键目录设置严格权限:
- /etc/docker/daemon.json → 600,属主root:root
- /var/run/docker.sock → 660,属组设为专用管理组(如dockeradm),禁止普通用户加入
- /root/.docker/ → 700,禁用 shell 历史记录写入(set +o history)
启用fs.protected_regular=2和fs.protected_fifos=1内核参数,防止符号链接竞争类攻击(TOCTOU)。
实施轻量但有效的运行时监控与审计
不部署重型 agent,改用内核原生机制:
- 启用auditd,聚焦监控/var/run/docker.sock、/usr/bin/docker、/usr/bin/containerd等关键路径的 exec、open、chmod 操作
- 配置sysctl net.netfilter.nf_conntrack_max合理值,防连接跟踪表溢出导致网络异常
- 通过systemd-coredump捕获容器运行时崩溃信息,但禁用 core dump 写入磁盘(kernel.core_pattern=|/bin/false)
- 定期用runc list --quiet | xargs -r runc state校验容器状态一致性,发现异常进程及时告警
所有日志统一输出到journald,通过journalctl -u docker --since "2 hours ago"快速排查问题,不落地明文日志文件。











