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

Seccomp(Secure computing mode) 是一个 Linux 内核安全模块,可用于应用进程允许使用的系统调用。
容器实际上是宿主机上运行的一个进程,共享宿主机内核,如果所有容器都具有任何系统调用的能力,那么容器如果被入侵,就很轻松绕过容器隔离更改宿主机系统权限或者进入宿主机。 这就可以使用Seccomp机制限制容器系统调用,有效减少攻击面。
Linux发行版内置:CentOS、Ubuntu
3.3.1 Seccomp在K8S配置
Seccomp在Kubernetes 1.3版本引入,在1.19版本成为GA版本,因此K8s中使用Seccomp可以通过以下两种方式:
• 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
mkdir /var/lib/kubelet/seccomp
vi /var/lib/kubelet/seccomp/chmod.json
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": [
"chmod"
],
"action": "SCMP_ACT_ERRNO"
}
]
}
seccomp基本配置文件包括三个元素:
• defaultAction:在syscalls部分未定义的任何 系统调用默认动作为允许
• syscalls
• names 系统调用名称,可以换行写多个
• SCMP_ACT_ERRNO 阻止系统调用
3.3.2 docker默认容器进程系统调用限制
大多数容器运行时都提供一组允许或不允许的默认系统调用。通过使用 runtime/default 注释 或将
Pod 或容器的安全上下文中的 seccomp 类型设置为 RuntimeDefault,可以轻松地在 Kubernetes
中应用默认值。
Docker默认配置说明:https://docs.docker.com/engine/security/seccomp/
3.3.3 实例
在k8s21-worker01创建目录,并创立chmod.json文件:
[root@k8s21-worker01 ~]# mkdir /var/lib/kubelet/seccomp
[root@k8s21-worker01 ~]# vi /var/lib/kubelet/seccomp/chmod.json
[root@k8s21-worker01 ~]# cat /var/lib/kubelet/seccomp/chmod.json
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": [
"chmod"
],
"action": "SCMP_ACT_ERRNO"
}
]
}
生成一个创建pod的yaml文件
kubectl run busybox0708 --image=busybox:1.28.4 --dry-run="client" -o yaml -- sleep 3600 > seccomp.yaml
修改配置seccomp.yaml ,强制调度到k8s21-worker01,并配置Seccomp相关配置
[root@k8s21-master01 ~]# cat seccomp.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: busybox0708
name: busybox0708
spec:
securityContext:
seccompProfile:
type: Localhost
localhostProfile: chmod.json
nodeName: k8s21-worker01
containers:
- args:
- sleep
- "3600"
image: busybox:1.28.4
name: busybox0708
restartPolicy: Always
[root@k8s21-master01 ~]# kubectl apply -f seccomp.yaml
进入pod执行chmod, 发现没有权限
[root@k8s21-master01 ~]# kubectl exec -it busybox0708 -- sh
/ #
/ #
/ # touch /root/wangjinxiong.txt
/ # chmod 777 /root/wangjinxiong.txt
chmod: /root/wangjinxiong.txt: Operation not permitted
/ #
本文介绍了Seccomp在Linux内核中的作用,它用于限制容器内的系统调用,增强安全性。在Kubernetes中,从1.3版本开始引入Seccomp,1.19版本成为GA特性,可以通过配置限制容器的系统调用行为。例如,通过创建一个禁止`chmod`系统调用的策略文件,可以阻止容器内的权限修改操作。Docker也有默认的系统调用限制配置。文中给出了在Kubernetes中配置Seccomp的实例,展示了如何创建和应用策略文件,最终当尝试在受限的容器中执行`chmod`时,会收到Operation not permitted的错误,证明了Seccomp的有效性。
3225

被折叠的 条评论
为什么被折叠?



