©
This document uses PHP Chinese website manual Release
安全计算模式(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