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