欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Seccomp 限制容器进程系统调用

程序员文章站 2022-06-17 08:00:36
...
Seccomp(Secure computing mode) 是一个 Linux 内核安全模块,可用于应用进程允许使用的系统调用。
容器实际上是宿主机上运行的一个进程,共享宿主机内核,如果所有容器都具有任何系统调用的能力,那么容器如果被入侵,就很轻松绕过容器隔离更改宿主机系统权限或者进入宿主机。
这就可以使用Seccomp机制限制容器系统调用,有效减少攻击面。
Linux发行版内置:CentOS、Ubuntu

在Kubernetes中使用Seccomp:Seccomp在K8s1.3版本引入,在1.19版本成为GA版本,因此可以通过两种方式设置:
1.19版本之前
annotations:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/<profile>"

• 1.19版本+

apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: <profile> # Pod所在宿主机上策略文件名,默认目录:/var/lib/kubelet/seccomp
  containers:
...

这些都是宿主机上面的功能,使用的时候也是读取宿主机上面的配置文件,去应用到这个容器当中的。

示例:禁止容器使用chmod


默认情况下是可以修改任何目录权限的 

[[email protected] ~]# kubectl exec -it web-server -c sidecar -- sh
/ # chmod 777 /etc/hosts
[[email protected] ~]# mkdir /var/lib/kubelet/seccomp
[[email protected] ~]# vim  /var/lib/kubelet/seccomp/chmod.json
[[email protected] ~]# cat /var/lib/kubelet/seccomp/chmod.json
{
  "defaultAction": "SCMP_ACT_ALLOW",
  "syscalls": [
     {
    "names": [
      "chmod"
  ],
    "action": "SCMP_ACT_ERRNO"
   }
  ]
}

在容器里面做任何事情都是系统调用,做系统调用需要对其进行限制。先允许所有的系统调用,然后再加黑名单哪些系统调用是不行的。

或者先设置全部系统调用不允许,再去加白名单。

该pod所在节点必须存在这个文件

seccomp基本配置文件包括三个元素:
• defaultAction:在syscalls部分未定义的任何系统调用默认动作为允许 syscalls
• names 系统调用名称,可以换行写多个
• SCMP_ACT_ERRNO 阻止系统调用
[[email protected] ~]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: hello-seccomp
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json
  containers:
  - image: busybox
    name: hello
    command:
      - sleep
      - 24h 

[[email protected] ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
hello-seccomp            1/1     Running   0          42s

[[email protected] ~]# kubectl exec -it hello-seccomp -- sh
/ # chmod 777 /etc/hosts
chmod: /etc/hosts: Operation not permitted

如果设置为如下:

{
  "defaultAction": "SCMP_ACT_ALLOW",
  "syscalls": [
     {
    "names": [
      "chmod",
      "mkdir",
      "rmdir"
  ],
    "action": "SCMP_ACT_ERRNO"
   }
  ]
}
[[email protected] ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
hello-seccomp            1/1     Running   0          2m12s   10.244.36.86     k8s-node1   <none>           <none>

[[email protected] ~]# kubectl exec -it hello-seccomp --  sh
/ # mkdir test
mkdir: can't create directory 'test': Operation not permitted
/ # rm -rf /home/
rm: can't remove '/home': Operation not permitted

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

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

 不需要知道profile了,可以将这个去掉localhostProfile: chmod.json。

系统调用决定了操作的命令,比如限制某个命令是否可以使用,能不能去执行,你可以使用seccomp去做限制,只要找到那些命令禁用掉,那么就执行不了了。比如黑客入侵你系统可能会使用各种各样的工具,比如curl,wget了,如果限制这些的使用那么提权到宿主机就比较难。

难点就在于写的这些策略。

相关标签: Kubernetes 安全