容器加固
加固具有特权的容器
disallow-write-core-pattern
禁止改写 procfs 的 core_pattern。
攻击者可能会在特权容器(Privileged Container)中,通过改写 procfs core_pattern,来实施容器逃逸。或者在特权容器(w/ CAP_SYS_ADMIN)中,卸载特定挂载点后改写 procfs core_pattern,来实施容器逃逸。
禁止修改 procfs 的 core_pattern。
- AppArmor
- BPF
disallow-mount-securityfs
禁止挂载 securityfs。
攻击者可能会在特权容器(w/ CAP_SYS_ADMIN)中,以读写权限挂载新的 securityfs 并对其进行修改。
禁止挂载新的 securityfs。
- AppArmor
- BPF
disallow-mount-procfs
禁止重新挂载 procfs。
攻击者可能会在特权容器(w/ CAP_SYS_ADMIN)中,以读写权限重新挂载 procfs,然后再通过改写 core_pattern 等方式进行容器逃逸、修改系统配置。
- 禁止挂载新的 procfs。
- 禁止使用 bind, rbind, move, remount 选项重新挂载
/proc**。 - 使用 BPF enforcer 时,还将禁止卸载
/proc**。
- AppArmor
- BPF
disallow-write-release-agent
禁止改写 cgroupfs 的 release_agent。
攻击者可能会在特权容器(Privileged Container)中,通过改写 cgroupfs release_agent,来实施容器逃逸。
禁止修改 cgroupfs 的 release_agent。
- AppArmor
- BPF
disallow-mount-cgroupfs
禁止重新挂载 cgroupfs。
攻击者可能会在特权容器(w/ CAP_SYS_ADMIN)中,以读写权限重新挂载 cgroupfs。然后再通过改写 release_agent、设备访问权限等方式进行容器逃逸、修改系统配置。 Attackers may attempt to escape from containers (w/ CAP_SYS_ADMIN) by remounting cgroupfs with read-write permissions. Subsequently, they can modify release_agent and device access permissions, among other things.
- 禁止挂载新的 cgroupfs。
- 禁止使用 bind, rbind, move, remount 选项重新挂载
/sys/fs/cgroup**。 - 禁止使用 rbind 选项重新挂载
/sys**。 - 使用 BPF enforcer 时,还将禁止卸载
/sys**。
- AppArmor
- BPF
disallow-debug-disk-device
禁止调试磁盘设备。
攻击者可能会在特权容器(Privileged Container)中,通过调试宿主机磁盘设备,从而实现宿主机文件的读写。
建议配合 disable-cap-mknod 使用,从而防止攻击者利用 mknod 创建新的设备文件,从而绕过此规则。
动态获取宿主机磁盘设备文件,并禁止在容器内以读写权限访问。
- AppArmor
- BPF
disallow-mount-disk-device
禁止挂载宿主机磁盘设备并访问。
攻击者可能会在特权容器(Privileged Container)中,挂载宿主机磁盘设备,从而实现宿主机文件的读写。
建议配合 disable-cap-mknod 使用,从而防止攻击者利用 mknod 创建新的设备文件,从而绕过此规则。
动态获取宿主机磁盘设备文件,并禁止在容器内挂载。
- AppArmor
- BPF
disallow-mount
禁用 mount 系统调用。
MOUNT(2) 常被用于权限提升、容器逃逸等攻击。而几乎所有的微服务应用都无需 mount 操作,因此建议使用此规则限制容器内进程访问 mount 系统调用。
注:当 spec.policy.privileged 为 false 时,将默认禁用 mount() 系统调用。
禁用 mount 系统调用。
- AppArmor
- BPF
disallow-umount
禁用 umount 系统调用。
UMOUNT(2) 可被用于卸载敏感的挂载点(例如 maskedPaths),从而导致权限提升、信息泄露。而几乎所有的微服务应用都无需 umount 操作,因此建议使用此规则限制容器内进程访问 umount() 系统调用。
禁用 umount 系统调用。
- AppArmor
- BPF
disallow-insmod
禁止加载内核模块。
攻击者可能会在特权容器中(w/ CAP_SYS_MODULE),通过执行内核模块加载命令 insmod,向内核中注入代码。
禁用 CAP_SYS_MODULE。
- AppArmor
- BPF
disallow-load-bpf-prog
禁止加载除 BPF_PROG_TYPE_SOCKET_FILTER 和 BPF_PROG_TYPE_CGROUP_SKB 类型外的 eBPF 程序。
攻击者可能会在特权容器中(w/ CAP_SYS_ADMIN, CAP_BPF),加载 ebpf Program 实现数据窃取和创建 rootkit 后门。
在 Linux 5.8 之前,需要 CAP_SYS_ADMIN 才能加载除 BPF_PROG_TYPE_SOCKET_FILTER 和 BPF_PROG_TYPE_CGROUP_SKB 类型以外的 eBPF 程序。自 Linux 5.8 开始,需要 CAP_SYS_ADMIN 或 CAP_BPF 才能加载这些 eBPF 程序。与此同时,加载某些类型的 eBPF 程序还需要 CAP_NET_ADMIN 或 CAP_PERFMON。
禁用 CAP_SYS_ADMIN 和 CAP_BPF。
推荐您使用内置规则 disallow-load-all-bpf-prog 来禁止容器加载任意类型的 eBPF 程序,从而减少内核攻击面。
- AppArmor
- BPF
disallow-access-procfs-root
禁止访问进程文件系统的根目录。
本策略禁止容器内进程访问进程文件系统的根目录(即 /proc/[PID]/root),防止攻击者利用共享 pid ns 的进程进行攻击。
攻击者可能会在共享了宿主机 pid ns、与其他容器共享 pid ns 的容器环境中,通过读写 /proc/*/root 来访问容器外的进程文件系统,实现信息泄露、权限提升、横向移动等攻击。
禁用 PTRACE_MODE_READ 权限。
- AppArmor
- BPF
disallow-access-kallsyms
禁止读取内核符号文件。
攻击者可能会在特权容器中(w/ CAP_SYSLOG),通过读取内核符号文件来获取内核模块地址。从而绕过 KASLR 防护,降低内核漏洞的难度与成本。
禁止读取 /proc/kallsyms 文件。
- AppArmor
- BPF