首页 > 科技 > Kubernetes Pod安全策略最佳实践

Kubernetes Pod安全策略最佳实践

在Kubernetes架构中,安全是基础之一。安全策略是K8S安全架构中的强大的工具,用来降低K8S机器的安全风险、并实现K8S的安全配置和落地实施。本文中,虫虫带领大家一起学习K8S安全策略中的pod安全策略实施,我们以K8S官方的K8S Pod安全建议为基础,介绍其安全策略的最佳实践。

Kubernetes pod安全策略介绍

简而言之,pod安全策略是Kubernetes pod的配置,该配置定义了Kubernetes pod必须满足的安全相关的条件。只有满足这些条件的pod,才能别加入到集群。这些条件规定了pod如何和网络、存储等资源进行交互,并定义对这些资源基于角色的访问控制。

Kubernetes pod安全策略,也可以看作是Kubernetes集群上运行的自动化一致性测试方法。我们知道一致性测试作为一种策略,用于确保环境或应用程序在运行之前必须满足的安全标准。Kubernetes pod安全策略确保pod加入集群之前必须满足策略中定义的安全要求。和一致性测试不同的是,Kubernetes pod安全策略无需专门运行,配置的策略会被Kubernetes自动执行。

Kubernetes pod安全策略实例级、集群级的资源

Kubernetes pod安全策略的作用范围是整个Kubernetes实例,是集群级的资源。通过PodSecurityPolicy对象来控制并应用到各个pod和容器SecurityContext上,并非对单个Pod而言。

pod安全策略配置

和其他资源一样Pod安全策略也通过YAML文件中指定。pod安全策略可以指定的参数和控制范围包括:

privileged:已授权容器的运行

主机命名空间,包括 hostPID和hostIPC

主机网络和端口,包括hostNetwork和hostPorts

volumes:控制卷类型

allowedHostPaths:主机文件系统

allowedFlexVolumes:FlexVolume驱动白名单列表

fsGroup:分配拥有 Pod 数据卷的 FSGroup

runAsUser, runAsGroup, supplementalGroups:容器的用户和组

allowPrivilegeEscalation, defaultAllowPrivilegeEscalation:root提权限制

defaultAddCapabilities, requiredDropCapabilities, allowedCapabilities:Linux能力

seLinux:容器的SELinux

allowedProcMountTypes:容器允许的Proc Mount类型

annotations:容器使用的AppArmor或seccomp安全角色

forbiddenSysctls,allowedUnsafeSysctls:容器使用的sysctl角色

配置实例

下面是一个pod安全策略配置的实例:

激活安全策略

配置好pod安全策略后,需要使用kubectl激活:

kubectl create -f example.yaml

获取实例策略

为了获取已存在策略列表,可以用 kubectl get:

kubectl get example

NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES

permissive false [] RunAsAny RunAsAny RunAsAny RunAsAny false [*]

privileged true [] RunAsAny RunAsAny RunAsAny RunAsAny false [*]

restricted false [] RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false [emptyDir secret downwardAPI configMap persistentVolumeClaim projected]

修改安全策略

通过交互方式修改策略,使用 kubectl edit。

kubectl edit example permissive

该命令将打开默认文本编辑器,并通过它修改策略。

删除安全策略

删除安全策略也非常简单,通过 kubectl 命令删除它:

kubectl delete example permissive

podsecuritypolicy "permissive" deleted

Kubernetes pod安全策略实践

为了充分Kubernetes pod安全策略,大家需要更具各自的K8S和pod环境以及需求具体问题具体配置,下面是建议的最佳pod安全策略实践方法。

启用pod安全策略

首先,确保启用Kubernetes pod安全策略。有些Kubernetes发行版默认情况下不会启用pod安全策略,这会有严重的安全隐患。

禁用特权容器

Kubernetes pod中,容器可以以"特权"模式运行,这样容器内的进程可以不受限制地访问主机系统的资源。虽然某些用例需要这种访问级别,但这会带来严重的安全风险。

在Kubernetes pod安全策略禁止特权容器的运行,配置如下:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: prevent-privileged-containers

spec:

privileged: false

只读文件系统

另一个很有用的安全实践是让容器以只读文件系统运行。该策略有助于实施不可变的基础架构策略,可以极大的减轻恶意进程在容器内存储或操纵数据的风险。

该策略的配置如下:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: read-only-fs

spec:

readOnlyRootFilesystem: true

可以肯定的是,只读文件系统并非适用任何情况,如果你没有充足的理由必须修改容器内部数据,可以使用该策略。

防止提权

对于大多数管理员来说,权限提升代表安全隐患。默认情况下Kubernetes并下会阻止容器提权,为了禁止群集上的提权,必须配置下面的策略:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: no-privilege-escalation

spec:

allowPrivilegeEscalation: false

防止容器以root身份运行

以root用户身份运行容器,是常见但是非常错误的方法。如果没有充分的理由,重要事情说三遍:请不要以root身份运行容器。请不要以root身份运行容器。请不要以root身份运行容器!

禁止root运行容器的策略如下:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: no-privilege-escalation

spec:

MustRunAsNonRoot: true

打包以上策略

Kubernetes pod安全策略是配置在一个文件中,我们可以把以上策略打包在一起:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: example

spec:

privileged: false

spec:

readOnlyRootFilesystem: true

spec:

allowPrivilegeEscalation: false

spec:

MustRunAsNonRoot: true

更多安全策略实例:

下面是K8S官方限制性策略的示例,要求用户以非特权用户身份运行,阻止可能的root提权,并启用多种安全机制:

apiVersion: policy/v1beta1

kind: PodSecurityPolicy

metadata:

name: restricted

annotations:

seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'

apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'

seccomp.security.alpha.kubernetes.io/defaultProfileName: 'runtime/default'

apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default'

spec:

privileged: false

# Required to prevent escalations to root.

allowPrivilegeEscalation: false

# This is redundant with non-root + disallow privilege escalation,

# but we can provide it for defense in depth.

requiredDropCapabilities:

- ALL

# Allow core volume types.

volumes:

- 'configMap'

- 'emptyDir'

- 'projected'

- 'secret'

- 'downwardAPI'

# Assume that persistentVolumes set up by the cluster admin are safe to use.

- 'persistentVolumeClaim'

hostNetwork: false

hostIPC: false

hostPID: false

runAsUser:

# Require the container to run without root privileges.

rule: 'MustRunAsNonRoot'

seLinux:

# This policy assumes the nodes are using AppArmor rather than SELinux.

rule: 'RunAsAny'

supplementalGroups:

rule: 'MustRunAs'

ranges:

# Forbid adding the root group.

- min: 1

max: 65535

fsGroup:

rule: 'MustRunAs'

ranges:

# Forbid adding the root group.

- min: 1

max: 65535

readOnlyRootFilesystem: false

结论

Kubernetes pod安全策略提供提供了便捷、强大、自动化集群安全配置的方法。通过它可以极大的提高Kubernetes安全性,减少不必要的风险。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/218100.html