首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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

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

代码语言:javascript
复制
$ 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选项覆盖容器,否则它将使用默认配置文件。例如,以下显式指定了一个策略:

代码语言:javascript
复制
$ 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门控。

运行时不使用默认的seccomp配置文件

你可以通过unconfined若要运行没有默认Seccomp配置文件的容器,请执行以下操作。

代码语言:javascript
复制
$ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
    unshare --map-root-user --user sh -c whoami

扫码关注腾讯云开发者

领取腾讯云代金券