©
本文档使用php.cn手册发布
安全计算模式(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配置文件可以在这里找到)。
实际上,该配置文件是白名单,默认情况下拒绝访问系统调用,然后将特定的系统调用列入白名单。配置文件的工作方式定义defaultAction
的SCMP_ACT_ERRNO
,只覆盖这一行动特定系统调用。效果SCMP_ACT_ERRNO
是导致Permission Denied
错误。接下来,配置文件定义了完全允许的系统调用的特定列表,因为它们action
被覆盖SCMP_ACT_ALLOW
。最后,一些具体的规则是单独的系统调用,例如personality
,socket
,socketcall
,和其他,允许这些系统的变异与特定的参数来调用。
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_load |
kexec_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门控。 |
你可以通过unconfined
若要运行没有默认Seccomp配置文件的容器,请执行以下操作。
$ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \ unshare --map-root-user --user sh -c whoami