本系列文章主要讲述业务容器化最佳实践,上一章 业务容器化最佳实践--优雅退出 我们主要讲了优雅退出,本文主要讲Pod安全相关,这也是大多数企业在落地Kubernetes过程中容易忽视的地方。
Pod安全策略
Pod安全策略 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么的能力。
简而言之,Pod安全策略是定义Kubernetes Pod必须满足哪些与安全相关的条件才能被接受到集群的配置。它们调节Pod如何与网络和存储等资源进行交互。它们还可以用于配置基于角色的访问控制。
考虑Kubernetes Pod安全策略的另一种方法是将其描述为在Kubernetes集群上运行自动一致性测试的一种方法。在安全领域,一致性测试是一种策略,用于确保环境或应用程序在允许运行之前符合预定义的安全标准。 Kubernetes Pod安全策略通过阻止Pod运行(除非它们满足策略中定义的安全要求)来执行相同的操作。 (要清楚,您不必触发一致性测试来执行Kubernetes pod安全策略。只要启用并配置了这些策略,Kubernetes就会自动执行它们。)
如何启用Pod安全策略?
Pod安全策略控制被实现为可选的(但推荐)准入控制器。通过启用准入控制器来强制执行PodSecurityPolicies,但是在未授权任何策略的情况下这样做将阻止在集群中创建任何Pod。
由于Pod安全策略API(policy/v1beta1/podsecuritypolicy)是独立于准入控制器启用的,因此,对于现有集群,建议在启用准入控制器之前添加和授权策略。
例如:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: example
spec:
privileged: false # Don't allow privileged pods!
# The rest fills in some required fields.
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
接着使用kubectl创建该策略:
kubectl create -f example-psp.yaml
禁用特权容器
在Pod中,容器可以“特权”模式运行,并且对主机系统上的资源的访问几乎不受限制。
尽管在某些特定的用例中,必须具有这种级别的访问权限,但通常来说,让您的容器执行此操作存在安全风险。
特权Pod的有效使用案例包括在节点上使用硬件,例如GPU。
通过在Kubernetes pod安全策略中包含以下内容,可以轻松阻止特权容器运行:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: prevent-privileged-containers
spec:
privileged: false
只读文件系统
Kubernetes的另一种最佳安全性最佳做法是要求容器与只读文件系统一起运行。这很有用,因为它有助于实施不变的基础架构策略,因为必须更改其文件系统无法更改的容器才能进行更改。这样可以减轻恶意进程在容器内部存储或操作数据的某些风险。
您可以使用以下Kubernetes Pod安全配置来强制执行只读文件系统策略:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: read-only-fs
spec:
readOnlyRootFilesystem: true
不要root用户运行容器
在容器中运行的进程与主机上的任何其他进程没有什么不同,只不过它有一小部分元数据声明它在容器中。
因此,容器中的根与主机上的根(uid 0)相同。
如果用户设法脱离了以root用户身份在容器中运行的应用程序,则他们可以使用同一root用户获得对主机的访问权限。
配置容器以使用非特权用户是防止特权升级攻击的最佳方法。
Kubernetes Pod安全策略提供了一种防止容器以root身份运行的简单方法:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: no-privilege-escalation
spec:
MustRunAsNonRoot: true
阻止特权升级
对于大多数管理员来说,特权升级是个坏词。在极少数情况下,您希望允许某个应用程序或进程获得比首次启动时更多的权限。
因此,您可能会认为Kubernetes默认情况下会阻止特权升级,但是您会错的。为了禁止您的集群上的特权升级,您必须使用Kubernetes pod安全策略,如下所示:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: no-privilege-escalation
spec:
allowPrivilegeEscalation: false
限制capabilities
Linux capabilities 使进程能够执行许多特权操作,其中只有root用户默认可以执行。
例如,CAP_CHOWN
允许进程“对文件UID和GID进行任意更改”。
即使您的进程不是以root身份运行,进程也有可能通过提升特权来使用那些类似root的功能。
换句话说,如果您不想受到损害,则应仅启用所需的功能。
在Kubernetes对Pod的定义中,用户可以add/drop Capabilities在Pod.spec.containers.sercurityContext.capabilities中添加要add的Capabilities list和drop的Capabilities list。
比如,我要添加 NET_ADMIN
Capability,删除 KILL
Capability,则对应的Pod定义如下:
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
- name: friendly-container
image: "alpine:3.4"
command: ["/bin/echo", "hello", "world"]
securityContext:
capabilities:
add:
- NET_ADMIN
drop:
- KILL
总结
如我们所见,Kubernetes Pod安全策略提供了一种方便的方法,可以自动在整个集群中实施强大的安全设置。
随着k8s日益流行,越来越多的CVE被发现,Pod的安全也应该受到重视。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。