Docker的Seccomp安全配置文件

预计阅读时间:7分钟

安全计算模式(seccomp)是Linux内核功能。您可以使用它来限制容器内可用的操作。该seccomp()系统调用在调用进程的状态的Seccomp工作。您可以使用此功能来限制应用程序的访问。

仅当使用Docker构建seccomp且内核配置为CONFIG_SECCOMP启用时,此功能才可用。要检查您的内核是否支持seccomp

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

注意seccomp配置文件需要seccomp 2.2.1,该文件在Ubuntu 14.04,Debian Wheezy或Debian Jessie上不可用。要seccomp在这些发行版上使用,必须下载最新的静态Linux二进制文件 (而不是软件包)。

传递容器的配置文件

默认seccomp配置文件为运行带有seccomp的容器提供了默认的默认设置,并禁用了300多个系统调用中的大约44个系统调用。它具有适度的保护性,同时提供广泛的应用程序兼容性。可以在此处找到默认的Docker配置文件 。

实际上,配置文件是白名单,默认情况下拒绝访问系统调用,然后将特定的系统调用列入白名单。配置文件的工作方式定义 defaultActionSCMP_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

默认配置文件阻止了重要的系统调用

Docker的默认seccomp配置文件是白名单,该白名单指定了允许的调用。下表列出了重要的(但不是全部)系统调用,这些调用由于未被列入白名单而被有效阻止。该表包括阻止每个系统调用的原因,而不是将其列入白名单。

系统调用 描述
acct 计费系统调用,可以使容器禁用其自身的资源限制或处理计费。也门CAP_SYS_PACCT
add_key 防止容器使用未命名空间的内核密钥环。
bpf 拒绝将可能持久的bpf程序加载到已经由设置的内核中CAP_SYS_ADMIN
clock_adjtime 时间/日期未命名空间。也门CAP_SYS_TIME
clock_settime 时间/日期未命名空间。也门CAP_SYS_TIME
clone 拒绝克隆新的名称空间。CAP_SYS_ADMIN除以外,还用于CLONE_ *标志CLONE_USERNS
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 跟踪/分析系统调用,这可能会泄漏主机上的许多信息。也门CAP_SYS_ADMIN
mbind 修改内核内存和NUMA设置的Syscall。已经由CAP_SYS_NICE
mount 拒绝安装,已由门控制CAP_SYS_ADMIN
move_pages 修改内核内存和NUMA设置的Syscall。
name_to_handle_at 姐妹syscall到open_by_handle_at。已经由CAP_DAC_READ_SEARCH
nfsservctl 拒绝与内核nfs守护程序进行交互。自Linux 3.1起已过时。
open_by_handle_at 发生旧容器突破的原因。也门CAP_DAC_READ_SEARCH
perf_event_open 跟踪/分析系统调用,这可能会泄漏主机上的许多信息。
personality 阻止容器启用BSD仿真。并非天生就有危险,但经过了不良测试,有可能导致许多内核伤痕。
pivot_root 拒绝pivot_root,应该是特权操作。
process_vm_readv 限制流程检查功能,该功能已被删除阻止CAP_SYS_PTRACE
process_vm_writev 限制流程检查功能,该功能已被删除阻止CAP_SYS_PTRACE
ptrace 跟踪/分析系统调用。在4.8之前的Linux内核版本中被阻止,以避免seccomp旁路。跟踪/分析任意进程已被drop阻止CAP_SYS_PTRACE,因为它可能会泄漏主机上的许多信息。
query_module 拒绝内核模块上的操作和功能。过时的。
quotactl 配额syscall,可以使容器禁用其自身的资源限制或处理记帐。也门CAP_SYS_ADMIN
reboot 不要让容器重启主机。也门CAP_SYS_BOOT
request_key 防止容器使用未命名空间的内核密钥环。
set_mempolicy 修改内核内存和NUMA设置的Syscall。已经由CAP_SYS_NICE
setns 拒绝将线程与名称空间相关联。也门CAP_SYS_ADMIN
settimeofday 时间/日期未命名空间。也门CAP_SYS_TIME
stime 时间/日期未命名空间。也门CAP_SYS_TIME
swapon 拒绝开始/停止交换到文件/设备。也门CAP_SYS_ADMIN
swapoff 拒绝开始/停止交换到文件/设备。也门CAP_SYS_ADMIN
sysfs 过时的系统调用。
_sysctl 已过时,由/ proc / sys代替。
umount 应该是特权操作。也门CAP_SYS_ADMIN
umount2 应该是特权操作。也门CAP_SYS_ADMIN
unshare 拒绝克隆进程的新名称空间。CAP_SYS_ADMIN除之外,还由门控制unshare --user
uselib 与共享库有关的较旧的syscall,已长期使用。
userfaultfd 用户空间页面错误处理,这是进程迁移所必需的。
ustat 过时的系统调用。
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
的Seccomp保安搬运工文档