关于k8s:探究K8S-v119-GA的Seccomp

32次阅读

共计 2635 个字符,预计需要花费 7 分钟才能阅读完成。

什么是 Seccomp?

Seccomp(全称:secure computing mode)在 2.6.12 版本 (2005 年 3 月 8 日) 中引入 linux 内核,是一种限度零碎调用的平安机制。在严格模式下,将过程可用的零碎调用限度为四种:readwriteexitsigreturn,其余的零碎调用都会杀死过程。过滤模式下,能够指定容许那些零碎调用,Seccomp 进行过滤的形式是基于应用 SECCOMP_MODE_FILTER 模式的 BPF 过滤器,并且零碎调用过滤的形式与对数据包的过滤形式雷同。例如,您可能心愿为过程提供 CAP_NET_ADMIN 性能,但通过阻塞 accept 和 accept4 零碎调用的形式不容许它承受套接字上的连贯。

从 linux/seccomp.h 的内核源代码中看,seccomp_data 构造的样子如下:

    struct seccomp_data { 
            int nr;
            __u32 arch;
            __u64 instruction_pointer;
            __u64 args[6];
    };

通过该构造能够看出,咱们能够基于 syscall,基于其参数或基于它们的组合进行过滤。

kubernetes 中的 seccomp

Seccomp 在 Kubernetes 1.3 版本中作为 Alpha 性能引入,应用 PodSecurityPolicy 上的正文将 Seccomp 配置文件利用于所需的 Pod。

例如咱们要将一个 seccomp profile 设置到某个 pod 范畴:

annotations:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"

或者咱们设置到容器范畴:

annotations:
  container.security.alpha.kubernetes.io/<container-name>: "localhost/profile.json"

在 1.19 版中,Seccomp 性能 GA,将新的 seccompProfile 字段增加到 pod 和容器的 securityContext 对象中。

apiVersion: v1
kind: Pod
metadata:
  name: audit-pod
  labels:
    app: audit-pod
spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: test-container
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=just made some syscalls!"
    securityContext:
      allowPrivilegeEscalation: false

此处咱们能够看到咱们应用了RuntimeDefault, 该 type 是 k8s 默认的容器运行时 profile。

此处可能的值为:

  • Unconfined – 如果没有其余抉择,Seccomp 不会利用于容器过程(这是 Kubernetes 中的默认设置)。
  • RuntimeDefault – 应用默认的容器运行时配置文件。
  • Localhost – 指定自定有的 profile 文件。当 type 为该值时,此时必须指定 localhostProfile 字段的值。

比方:

apiVersion: v1
kind: Pod
metadata:
  name: violation-pod
  labels:
    app: violation-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: profiles/fine-grained.json
  containers:
  - name: test-container
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=just made some syscalls!"
    securityContext:
      allowPrivilegeEscalation: false
 

咱们看下 fine-grained.json 的值:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "accept4",
                "epoll_wait",
                "pselect6",
                "futex",
                "madvise",
                "epoll_ctl",
                "getsockname",
                "setsockopt",
                "vfork",
                "mmap",
                "read",
                "write",
                "close",
                "arch_prctl",
                "sched_getaffinity",
                "munmap",
                "brk",
                "rt_sigaction",
                "rt_sigprocmask",
                "sigaltstack",
                "gettid",
                "clone",
                "bind",
                "socket",
                "openat",
                "readlinkat",
                "exit_group",
                "epoll_create1",
                "listen",
                "rt_sigreturn",
                "sched_yield",
                "clock_gettime",
                "connect",
                "dup2",
                "epoll_pwait",
                "execve",
                "exit",
                "fcntl",
                "getpid",
                "getuid",
                "ioctl",
                "mprotect",
                "nanosleep",
                "open",
                "poll",
                "recvfrom",
                "sendto",
                "set_tid_address",
                "setitimer",
                "writev"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

请留神,对现有正文的反对已被弃用,并将在 1.22 版中删除。此外,作为确保 Kubelet 向后兼容的一部分,将以以下优先级程序执行 Seccomp 配置文件:

  • 容器 Spec 中通过 seccompProfile 字段指定
  • 容器 正文指定
  • Pod Spec 中通过 seccompProfile 字段指定
  • Pod 正文指定

总结

Seccomp 相似一个沙箱。

咱们通过指定seccompProfile, Kubernetes 容许将加载到节点上的 seccomp 配置文件主动利用于 Pod 和容器。

这样咱们的应用程序就在一个沙箱中执行了,在安全性上有很大的晋升,并且 Seccomp 能够让你更加精细化控制系统调用。

正文完
 0