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了,如果限制这些的使用那么提权到宿主机就比较难。
难点就在于写的这些策略。
上一篇: Qt的容器类——QMap
推荐阅读