lsm是linux内核提供的通用安全钩子框架,本质为不自带策略的内核级扩展接口,通过在关键路径埋设hook点、为内核对象提供security blob存储、统一调度selinux/apparmor等模块实现mac。

Linux内核的安全扩展模块(LSM)是加固容器环境最底层、最有效的手段之一。它不依赖用户空间工具,直接在系统调用路径上施加访问控制,能有效拦截越权操作、限制攻击面,并防止容器逃逸。
启用并配置主流LSM框架
SELinux 和 AppArmor 是生产环境中最成熟、默认集成度最高的两个 LSM 实现,适用于绝大多数云服务器和容器平台:
-
SELinux(推荐用于 RHEL/CentOS/AlmaLinux):启用后为每个容器进程分配独立域(如
container_t),强制限制其对文件、网络、IPC 等资源的访问。需确保运行在enforcing模式,并通过semanage fcontext为挂载卷打上正确上下文标签,避免因上下文不匹配导致拒绝访问。 -
AppArmor(推荐用于 Ubuntu/Debian):以路径白名单为核心,更轻量易调试。可为 Docker daemon 或特定容器镜像单独编写 profile,例如限制 Nginx 容器仅能读取
/var/www、禁止执行execve调用任意二进制文件。 - 两者不可同时启用;若系统已加载 SELinux,则 AppArmor 会被禁用,反之亦然。可通过
cat /sys/kernel/security/lsm查看当前激活的模块。
结合 seccomp 进行系统调用级过滤
seccomp 是 Linux 内核内置的 LSM 钩子支持机制,虽非独立 LSM 模块,但深度依赖 LSM 框架实现策略注入。它能精确控制容器内进程可执行的系统调用列表,大幅缩小攻击面:
- Docker 和 Mesos 均原生支持 seccomp 配置。使用默认的
default.json可禁用约 40% 的高风险系统调用(如mount、ptrace、keyctl)。 - 自定义 profile 时应遵循最小权限原则:例如 Web 应用通常无需
capset、setuid、chroot,可显式"action": "SCMP_ACT_ERRNO"拦截。 - Mesos 中需通过
--isolation=linux/seccomp启用,并指定--seccomp_config_dir和--seccomp_profile_name参数。
利用 capabilities 实现细粒度特权管控
Linux Capabilities 将传统 root 权限拆分为独立单元(如 CAP_NET_BIND_SERVICE、CAP_SYS_ADMIN),配合 LSM 可精准授权,避免全权 --privileged 启动:
- 容器默认仅继承有限能力集。可通过
--cap-add/--cap-drop显式增删,例如仅添加NET_BIND_SERVICE允许绑定 1024 以下端口,而不开放SETUID。 - Mesos 使用
linux/capabilities隔离器,支持--effective_capabilities和--bounding_capabilities参数,后者定义能力上限,即使容器内进程尝试提权也无法突破该边界。 - 注意:
CAP_SYS_ADMIN是高危能力,多数场景可用更具体的替代项(如CAP_SYS_CHROOT、CAP_MKNOD)满足需求。
配合 xattr 与安全上下文强化数据隔离
LSM 策略的执行依赖于对象(如文件、socket)上的安全标签,这些标签通常以 security.* 扩展属性(xattr)形式存储在文件系统中:
- 启用
user_xattr和security_inode_getxattr等挂载选项,确保 overlayfs、ext4 等支持 xattr 的文件系统能持久保存 SELinux/AppArmor 上下文。 - 容器镜像构建时,用
chcon或restorecon预设关键路径的安全上下文(如/etc/shadow标记为shadow_t),避免运行时因上下文缺失被拒绝访问。 - Kubernetes 中可通过 PodSecurityContext 的
seLinuxOptions或appArmorProfile字段将安全上下文注入容器,实现策略统一管理。











