kubernetes---Seccomp限制容器进程系统调用

Seccomp介绍

Seccomp 代表安全计算(Secure Computing)模式,自 2.6.12 版本以来,一直是 Linux 内核的一个特性。 它可以用来沙箱化进程的权限,限制进程从用户态到内核态的调用。 Kubernetes 能使你自动将加载到 节点上的 seccomp 配置文件应用到你的 Pod 和容器。

识别你的工作负载所需要的权限是很困难的。在本篇教程中, 你将了解如何将 seccomp 配置文件加载到本地的 Kubernetes 集群中, 如何将它们应用到 Pod,以及如何开始制作只为容器进程提供必要的权限的配置文件。

大多数容器运行时都提供一组允许或不允许的默认系统调用。通过使用runtime/default 注释 或将 Pod 或容器的安全上下文中的 seccomp 类型设置为 RuntimeDefault,可以轻松地在 Kubernetes 中应用默认值。

Seccomp(Secure computingmode):师一个linux内核安全模块,可用于应用进程允许使用的系统调用。容器实际上是宿主机上的一个进程,共享主机内核,如果所有容器都具有任何系统调用的能力,那么容器如果被入侵,就很轻松绕过容器隔离更改宿主机权限或者进入宿主机。(就是容器里的进程可以管理主机)seccomp就是限制容器进程操作系统调用从而达到限制操作内核的能力,限制进程从用户态到内核态的调用。

这就可以使用Seccomp机制限制容器系统调用,有效减少攻击面

linux发行版内置:centos ubuntu

Docker默认配置说明:https://docs.docker.com/engine/security/seccomp/

kubernetes---Seccomp限制容器进程系统调用_第1张图片

调用关系

linux系统调用:https://arcticfox1919.gitee.io/linux-manual/man-pages/dir_section_2.html

对于linux来说,用户层一切资源相关操作都需要通过系统调用来完成;系统调用实现技术层解耦,内核只关心系统调用API的实现,而不必关心谁调用的

kubernetes---Seccomp限制容器进程系统调用_第2张图片

一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。CPU硬件决定了这些(这就是为什么它被称作"保护模式")。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充寄存器,然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在Intel CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。

yaml示例

#Seccomp在Kubernetes 1.3版本引入,在1.19版本成为GA版本,因此K8s中使用Seccomp可以通过以下两种方式:
#1.19版本版本之前
annotaions:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/"

#1.19版本之后
apiVersion: v1
kind: Pod
metadata:
  name: audit-pod
  labels:
    app: audit-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
#     type: RuntimeDefault
      localhostProfile: profiles/audit.json  #pod所在宿主机上策略文件名,默认目录为/var/lib/kubelet/seccomp
  containers:
  - name: test-container
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=just made some syscalls!"
    securityContext:
      allowPrivilegeEscalation: false

案例1:限制容器进行chmod系统调用

kubernetes---Seccomp限制容器进程系统调用_第3张图片

1、进入一个没有限制的容器,进入后可以chmod改变文件权限等

2、创建seccomp配置文件

【】mkdir /var/lib/kubelet/seccomp

【】vi /var/lib/kubelet/seccomp/chmod.json

{
    "defaultAction": "SCMP_ACT_ALLOW",
    "syscalls": [
        {
            "names": [
                "chmod",
                 "mkdir"
            ],
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}

seccomp基本配置文件包括三个元素:

defaultAction:在syscalls部分未定义的任何系统默认动作为允许,也可设置为ERRNO意味默认拒绝

syscalls

names:系统嗲用名称,可以换号写多个

SCMP_ACT_ERRNO:阻止系统调用,也可设为允许

3、创建pod使用seccomp

apiVersion: v1
kind: Pod
metadata:
  name: hello
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json  #pod所在宿主机上策略文件名,默认目录为/var/lib/kubelet/seccomp
  containers:
  - name: web
    image: nginx

4、验证进入pod使用seccomp

apiVersion: v1
kind: Pod
metadata:
  name: hello
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json  #pod所在宿主机上策略文件名,默认目录为/var/lib/kubelet/seccomp
  containers:
  - name: web
    image: nginx

5、验证进入pod

nginxpod已经被限制无法创建目录,所以pod起不来

kubernetes---Seccomp限制容器进程系统调用_第4张图片

你可能感兴趣的:(kubenetes,kubernetes,docker,容器,云原生,运维)