1

本系列文章主要讲述业务容器化最佳实践,上一章 业务容器化最佳实践--优雅退出 我们主要讲了优雅退出,本文主要讲Pod安全相关,这也是大多数企业在落地Kubernetes过程中容易忽视的地方。

PodSecurityPolicy.jpg

Pod安全策略

Pod安全策略 是集群级别的资源,它能够控制 Pod 运行的行为,以及它具有访问什么的能力。

简而言之,Pod安全策略是定义Kubernetes Pod必须满足哪些与安全相关的条件才能被接受到集群的配置。它们调节Pod如何与网络和存储等资源进行交互。它们还可以用于配置基于角色的访问控制。

a-01.jpg

考虑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的安全也应该受到重视。


iyacontrol
1.4k 声望2.7k 粉丝

专注kubernetes,devops,aiops,service mesh。