Docker 的 Seccomp 安全配置文件

安全计算模式 (seccomp) 是 Linux 内核功能。您可以使用它来 限制容器中可用的作。这seccomp()系统 call 对调用进程的 seccomp 状态进行作。您可以使用这个 功能来限制应用程序的访问。

仅当 Docker 是使用seccomp和 kernel 配置了CONFIG_SECCOMP启用。检查您的内核 支持seccomp:

$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y

传递容器的配置文件

默认的seccompprofile 为运行容器提供了一个合理的默认值,其中 seccomp 并禁用了 300+ 中的大约 44 个系统调用。它是中等的 保护性,同时提供广泛的应用程序兼容性。默认的 Docker 个人资料可以在这里找到。

实际上,配置文件是一个允许列表,它拒绝通过以下方式访问系统调用 default,然后将特定系统调用列入许可名单。配置文件的工作原理是定义defaultActionSCMP_ACT_ERRNO并仅针对特定 system 调用。的效果SCMP_ACT_ERRNO是导致Permission Denied错误。接下来,配置文件定义一个特定的系统调用列表,这些调用完全 允许,因为他们的action被覆盖为SCMP_ACT_ALLOW.最后 一些特定规则适用于单个系统调用,例如personality等 以允许具有特定参数的这些系统调用的变体。

seccomp有助于以最低权限运行 Docker 容器。它 不建议更改默认值seccomp轮廓。

当您运行容器时,除非您覆盖它,否则它将使用默认配置文件 使用--security-opt选择。例如,以下显式 指定策略:

$ docker run --rm \
             -it \
             --security-opt seccomp=/path/to/seccomp/profile.json \
             hello-world

默认配置文件阻止的重要 syscall

Docker 的默认 seccomp 配置文件是一个允许列表,它指定了 都是允许的。下表列出了 被有效地阻止,因为它们不在允许列表中。该表包括 每个 syscall 被阻止而不是列入白名单的原因。

系统调用描述
acctAccounting sys调用,该调用可以让容器禁用自己的资源限制或进程记帐。也由CAP_SYS_PACCT.
add_key阻止容器使用未命名的内核密钥环。
bpf拒绝将可能持久的 bpf 程序加载到内核中,该程序已被CAP_SYS_ADMIN.
clock_adjtimeTime/date 没有命名空间。也由CAP_SYS_TIME.
clock_settimeTime/date 没有命名空间。也由CAP_SYS_TIME.
clone拒绝克隆新命名空间。也由CAP_SYS_ADMIN对于 CLONE_* 标志,则CLONE_NEWUSER.
create_module拒绝内核模块上的作和函数。过时。也由CAP_SYS_MODULE.
delete_module拒绝内核模块上的作和函数。也由CAP_SYS_MODULE.
finit_module拒绝内核模块上的作和函数。也由CAP_SYS_MODULE.
get_kernel_syms拒绝检索导出的内核和模块符号。过时。
get_mempolicy修改内核内存和 NUMA 设置的 Syscall。已由CAP_SYS_NICE.
init_module拒绝内核模块上的作和函数。也由CAP_SYS_MODULE.
ioperm阻止容器修改内核 I/O 权限级别。已由CAP_SYS_RAWIO.
iopl阻止容器修改内核 I/O 权限级别。已由CAP_SYS_RAWIO.
kcmp限制已因丢弃而阻止的流程检查功能CAP_SYS_PTRACE.
kexec_file_load的姐妹 syscallkexec_load这做了同样的事情,但论点略有不同。也由CAP_SYS_BOOT.
kexec_load拒绝加载新内核以供以后执行。也由CAP_SYS_BOOT.
keyctl阻止容器使用未命名的内核密钥环。
lookup_dcookie跟踪/分析 syscall,这可能会泄露主机上的大量信息。也由CAP_SYS_ADMIN.
mbind修改内核内存和 NUMA 设置的 Syscall。已由CAP_SYS_NICE.
mount拒绝挂载,已由CAP_SYS_ADMIN.
move_pages修改内核内存和 NUMA 设置的 Syscall。
nfsservctl拒绝与内核 nfs 守护程序的交互。自 Linux 3.1 起已过时。
open_by_handle_at旧容器破裂的原因。也由CAP_DAC_READ_SEARCH.
perf_event_open跟踪/分析 syscall,这可能会泄露主机上的大量信息。
personality阻止容器启用 BSD 仿真。它本身并不危险,但测试不佳,可能存在大量内核漏洞。
pivot_root否认pivot_root,应为 privileged作。
process_vm_readv限制已因丢弃而阻止的流程检查功能CAP_SYS_PTRACE.
process_vm_writev限制已因丢弃而阻止的流程检查功能CAP_SYS_PTRACE.
ptrace跟踪 / 分析 syscall。在 4.8 之前的 Linux 内核版本中被阻止,以避免 seccomp 绕过。通过删除已阻止跟踪/分析任意进程CAP_SYS_PTRACE,因为它可能会泄露主机上的大量信息。
query_module拒绝内核模块上的作和函数。过时。
quotactlQuota sys调用,该调用可以让容器禁用自己的资源限制或进程核算。也由CAP_SYS_ADMIN.
reboot不要让容器重启主机。也由CAP_SYS_BOOT.
request_key阻止容器使用未命名的内核密钥环。
set_mempolicy修改内核内存和 NUMA 设置的 Syscall。已由CAP_SYS_NICE.
setns拒绝将线程与命名空间关联。也由CAP_SYS_ADMIN.
settimeofdayTime/date 没有命名空间。也由CAP_SYS_TIME.
stimeTime/date 没有命名空间。也由CAP_SYS_TIME.
swapon拒绝开始/停止交换到文件/设备。也由CAP_SYS_ADMIN.
swapoff拒绝开始/停止交换到文件/设备。也由CAP_SYS_ADMIN.
sysfs过时的 syscall.
_sysctl已过时,替换为 /proc/sys。
umount应为特权作。也由CAP_SYS_ADMIN.
umount2应为特权作。也由CAP_SYS_ADMIN.
unshare拒绝为进程克隆新命名空间。也由CAP_SYS_ADMIN,但unshare --user.
uselib与共享库相关的旧 syscall,长时间未使用。
userfaultfd用户空间页面错误处理,主要是进程迁移所必需的。
ustat过时的 syscall.
vm86在内核 x86 实模式虚拟机中。也由CAP_SYS_ADMIN.
vm86old在内核 x86 实模式虚拟机中。也由CAP_SYS_ADMIN.

在没有默认 seccomp 配置文件的情况下运行

您可以将unconfined在没有默认 seccomp 的情况下运行容器 轮廓。

$ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
    unshare --map-root-user --user sh -c whoami