Docker 的 Seccomp 安全配置文件
安全计算模式 () 是 Linux 内核的一项功能。您可以使用它来
限制容器中可用的操作。系统
call 对调用进程的 seccomp 状态进行操作。您可以使用这个
功能来限制应用程序的访问。seccomp
seccomp()
仅当 Docker 是使用 Docker 构建的,并且
kernel 配置为 enabled。检查您的内核
支持:seccomp
CONFIG_SECCOMP
seccomp
$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y
传递容器的配置文件
默认配置文件为运行具有
seccomp 并禁用了 300+ 中的大约 44 个系统调用。它是中等的
保护性,同时提供广泛的应用程序兼容性。默认的 Docker
个人资料可以在这里找到。seccomp
实际上,配置文件是一个允许列表,它拒绝通过以下方式访问系统调用
default,然后将特定系统调用列入许可名单。配置文件的工作原理是定义 of 并仅针对特定
system 调用。的效果是导致错误。接下来,配置文件定义一个特定的系统调用列表,这些调用完全
允许,因为 被 覆盖为 。最后
一些特定规则适用于单个系统调用,例如 ,以及其他
以允许具有特定参数的这些系统调用的变体。defaultAction
SCMP_ACT_ERRNO
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 被阻止而不是列入白名单的原因。
系统调用 | 描述 |
---|---|
acct | Accounting sys调用,该调用可以让容器禁用自己的资源限制或进程记帐。也被 门控。CAP_SYS_PACCT |
add_key | 阻止容器使用未命名的内核密钥环。 |
bpf | 拒绝将可能持久的 bpf 程序加载到内核中,该程序已被 控制。CAP_SYS_ADMIN |
clock_adjtime | Time/date 没有命名空间。也被 门控。CAP_SYS_TIME |
clock_settime | Time/date 没有命名空间。也被 门控。CAP_SYS_TIME |
clone | 拒绝克隆新命名空间。此外,由 CLONE_* 标志门限,但 .CAP_SYS_ADMIN 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 | 它的 sister syscall 做同样的事情,参数略有不同。也被 门控。kexec_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 | Deny 应为特权操作。pivot_root |
process_vm_readv | 限制进程检查功能,已因删除而被阻止。CAP_SYS_PTRACE |
process_vm_writev | 限制进程检查功能,已因删除而被阻止。CAP_SYS_PTRACE |
ptrace | 跟踪 / 分析 syscall。在 4.8 之前的 Linux 内核版本中被阻止,以避免 seccomp 绕过。跟踪/分析任意进程已被 drop 阻止,因为它可能会泄露主机上的大量信息。CAP_SYS_PTRACE |
query_module | 拒绝内核模块上的操作和函数。过时。 |
quotactl | Quota sys调用,该调用可以让容器禁用自己的资源限制或进程核算。也被 门控。CAP_SYS_ADMIN |
reboot | 不要让容器重启主机。也被 门控。CAP_SYS_BOOT |
request_key | 阻止容器使用未命名的内核密钥环。 |
set_mempolicy | 修改内核内存和 NUMA 设置的 Syscall。已由 门控 。CAP_SYS_NICE |
setns | 拒绝将线程与命名空间关联。也被 门控。CAP_SYS_ADMIN |
settimeofday | Time/date 没有命名空间。也被 门控。CAP_SYS_TIME |
stime | Time/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 配置文件的情况下运行
你可以传递以运行没有默认 seccomp 的容器
轮廓。unconfined
$ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
unshare --map-root-user --user sh -c whoami