在线文档教程

Secer的Seccomp安全配置文件 | Seccomp security profiles for Docker (Engine)

Seccomp Docker的安全配置文件

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

只有在Docker已经构建seccomp并且内核配置为CONFIG_SECCOMP启用的情况下,此功能才可用。检查你的内核是否支持seccomp

$ cat /boot/config-`uname -r` | grep CONFIG_SECCOMP= CONFIG_SECCOMP=y

注意seccomp配置文件需要seccomp 2.2.1,并且只能从Debian 9“Stretch”,Ubuntu 16.04“Xenial”,Fedora 22,CentOS 7和Oracle Linux 7开始提供。要在Ubuntu 14.04,Debian Wheezy或Debian Jessie上使用此功能,您必须下载最新的静态Docker Linux二进制文件。此功能目前在其他发行版上不可用。

传递容器的配置文件

默认seccomp配置文件为使用seccomp运行容器提供了一个理智的默认设置,并禁用了大约44个超过300+的系统调用。它具有适度的保护性,同时提供广泛的应用兼容性 默认的Docker配置文件可以在这里找到)。

实际上,该配置文件是白名单,默认情况下拒绝访问系统调用,然后将特定的系统调用列入白名单。配置文件的工作方式定义defaultActionSCMP_ACT_ERRNO,只覆盖这一行动特定系统调用。效果SCMP_ACT_ERRNO是导致Permission Denied错误。接下来,配置文件定义了完全允许的系统调用的特定列表,因为它们action被覆盖SCMP_ACT_ALLOW。最后,一些具体的规则是单独的系统调用,例如personalitysocketsocketcall,和其他,允许这些系统的变异与特定的参数来调用。

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防止容器使用未命名空间的内核密钥环。
adjtimex与clock_settime和settimeofday类似,时间/日期不是命名空间。也由CAP_SYS_TIME进行门控。
BPF拒绝将可能持久的bpf程序加载到内核中,并已由CAP_SYS_ADMIN进行门控。
clock_adjtime时间/日期不是命名空间。也由CAP_SYS_TIME进行门控。
clock_settime时间/日期不是命名空间。也由CAP_SYS_TIME进行门控。
clone拒绝克隆新的命名空间。除CLONE_USERNS外,还由CAP_SYS_ADMIN对CLONE_ *标志进行门控。
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_PTRACE而被阻止。
kexec_file_loadkexec_load的sister系统调用可以做同样的事情,但参数略有不同。还由CAP_SYS_BOOT进行门控。
kexec_load拒绝加载新内核以供稍后执行。还由CAP_SYS_BOOT进行门控。
KEYCTL防止容器使用未命名空间的内核密钥环。
lookup_dcookie跟踪/分析系统调用,这可能会泄漏主机上的大量信息。也由CAP_SYS_ADMIN门控。
mbind修改内核内存和NUMA设置的Syscall。已由CAP_SYS_NICE进行门控。
安装拒绝安装,已由CAP_SYS_ADMIN门控。
move_pages修改内核内存和NUMA设置的Syscall。
name_to_handle_at姐姐系统调用open_by_handle_at。已由CAP_SYS_NICE进行门控。
nfsservctl拒绝与内核nfs守护进程进行交互。自Linux 3.1以来已过时。
open_by_handle_at旧集装箱突破的原因。还由CAP_DAC_READ_SEARCH选通。
perf_event_open跟踪/分析系统调用,这可能会泄漏主机上的大量信息。
个性防止容器启用BSD仿真。没有内在的危险,但测试不足,可能发生大量内核威胁。
pivot_root拒绝pivot_root,应该是特权操作。
process_vm_readv限制进程检查功能,已通过删除CAP_PTRACE而被阻止。
process_vm_writev限制进程检查功能,已通过删除CAP_PTRACE而被阻止。
ptrace的跟踪/分析系统调用,这可能会泄漏主机上的大量信息。已被CAP_PTRACE下降封锁。
query_module拒绝内核模块的操作和功能。已过时。
quotactl配额系统调用可以让容器禁用自己的资源限制或进程记帐。也由CAP_SYS_ADMIN门控。
重启不要让容器重新启动主机。还由CAP_SYS_BOOT进行门控。
request_key防止容器使用未命名空间的内核密钥环。
set_mempolicy修改内核内存和NUMA设置的Syscall。已由CAP_SYS_NICE进行门控。
setns拒绝将线程与名称空间关联。也由CAP_SYS_ADMIN门控。
settimeofday时间/日期不是命名空间。也由CAP_SYS_TIME进行门控。
套接字,套接字用于发送或接收数据包以及其他套接字操作。除通信域AF_UNIX,AF_INET,AF_INET6,AF_NETLINK和AF_PACKET之外,所有套接字调用和套接字调用都被阻止。
估计时间/日期不是命名空间。也由CAP_SYS_TIME进行门控。
swapon命令拒绝启动/停止交换文件/设备。也由CAP_SYS_ADMIN门控。
使用swapoff拒绝启动/停止交换文件/设备。也由CAP_SYS_ADMIN门控。
sysfs的已过时的系统调用。
_sysctl已过时,由/ proc / sys取代。
卸除应该是一个特权操作。也由CAP_SYS_ADMIN门控。
umount2应该是一个特权操作。也由CAP_SYS_ADMIN门控。
取消共享拒绝克隆进程的新名称空间。还由CAP_SYS_ADMIN进行门控,但不共享--user。
相信较旧的系统调用与共享库相关,很长一段时间未使用。
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安全码头文档