什么是 Seccomp?
Seccomp(全称:secure computing mode)在 2.6.12 版本 (2005 年 3 月 8 日) 中引入 linux 内核,是一种限度零碎调用的平安机制。在严格模式下,将过程可用的零碎调用限度为四种:read
,write
,exit
,sigreturn
,其余的零碎调用都会杀死过程。过滤模式下,能够指定容许那些零碎调用,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 能够让你更加精细化控制系统调用。