6405835d9c013974e7fd8a3d8f5b90eb.png

什么是Pod安全策略?

Kubernetes Pod安全策略(PSP)是Kubernetes安全版块中极为重要的组件。Pod安全策略是集群级别的资源,用于控制Pod安全相关选项,并且还是一种强化Kubernetes工作负载安全性的机制。Kubernetes平台团队或集群运维人员可以利用它来控制pod的创建以及限制特定的用户、组或应用程序可以使用的功能。

举个简单的例子,使用PSP你可以:

  • 防止特权Pod启动并控制特权升级。

  • 限制Pod可以访问的主机命名空间、网络和文件系统

  • 限制可以运行pod的用户/组。

  • 限制Pod可以访问的Volume

  • 限制其他参数,如运行时配置文件或只读根文件系统

在本文中,我们将向你展示在Rancher中如何通过启用一个简单的Pod安全策略来强化你的Kubernetes安全。

6405835d9c013974e7fd8a3d8f5b90eb.png

Pod安全策略真的可以增强K8S的安全性吗?

是的,Pod安全策略确实可以增强Kubernetes的安全性。它提供了Kubernetes原生控制机制,可以防止威胁而不影响性能,这与agent必须拦截主机上的每个动作有所区别。

如果你尚未在集群中启用PSP(或执行访问控制之类的等效方法),则Kubernetes用户可能会生成特权集群。这将会被恶意利用,例如提升特权进而突破容器隔离并访问其他Pod/服务。

如果没有限制Pod spec特权的机制,攻击者可以通过docker命令执行任何操作,例如,运行特权容器、使用节点资源等。

想要快速验证以上说法,你可以执行以下脚本(千万不要在生产集群上操作):

❯ ./kubectl-root-in-host.shbash-4.4# whoamirootbash-4.4# hostnamesudo--alvaro-rancher-rancheragent-0-all

你可以获得对Kubernetes节点的即时root访问权限。是不是有点后怕呢?

通过遵循最小特权的概念,你可以安全地在集群中实现PSP,并确保在Kubernetes Pod或工作负载中没有不需要的权限。除了Kubernetes安全的核心理念外,最小特权原则也是一种通用的安全最佳实践,同时还是诸如PCI、SOC2或HIPAA等合规性标准的核心要求。

总结一下:

  • PSP将为Pod授予的安全功能提供默认安全约束,该pod可以是集群上任何用户创建的

  • PSP还能通过满足特定合规性基准的要求帮助你验证合规性

最小特权是一个概念,也是一个实践,可以将用户、账号和计算过程的访问权限限制为仅执行日常合法活动所需要的资源。

6405835d9c013974e7fd8a3d8f5b90eb.png

在你的集群中启用Pod安全策略

在Kubernetes中Pod安全策略可以实现为Admission Controller。要在你的集群中启用PSP,确保PodSecurityPolicy在enable-admission-plugins列表内,作为参数传递给你的Kubernetes API配置的参数:

--enable-admission-plugins=...,PodSecurityPolicy

提供托管Kubernetes集群(你无法直接访问API配置)的云提供商通常会提供高级设置,用户可以在整个集群范围内启用PSP。在其他情况下,你可能需要编辑/etc/kubernetes/manifests/kube-apiserver.yaml文件,并将其添加到相应的命令参数中。

在Rancher中,你可以在UI上编辑集群来轻松启用PSP:

ea231a876dd0f2fd9dfb6292c31c0f0b.png

在Rancher中启用PSP

你可以选择默认应用哪个Pod安全策略。在本例中,我们选择了restricted(受限)。

使用一个Admission controller来启用PSP的好处在于它提供了一个即时预防机制,甚至可以在调度之前停止部署过度特权的Pod。缺点就是你启用一个PSP之后,每个pod都需要经过PSP的批准,使其部署和过渡更加困难。

6405835d9c013974e7fd8a3d8f5b90eb.png

Rancher中启用基本Pod安全策略demo

在这一部分中,我们将逐步演示如何通过Rancher dashboard在集群中启用Pod安全策略,并在默认情况下使用受限策略,并了解如何防止创建特权Pod。

PSP对象本身是将要应用于pod specs的要求和约束的列表。PSP YAML如下所示:

apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata:  name: examplespec:  allowedCapabilities:    - NET_ADMIN    - IPC_LOCK  allowedHostPaths:    - pathPrefix: /dev    - pathPrefix: /run    - pathPrefix: /  fsGroup:    rule: RunAsAny  hostNetwork: true  seLinux:    rule: RunAsAny  supplementalGroups:    rule: RunAsAny  privileged: true  runAsUser:    rule: RunAsAny  volumes:    - hostPath    - secret

以上PSP有很多允许权限,例如:

  • 它允许pod可以与其他Linux功能(如NET_ADMIN和IPC_LOCK)一起运行

  • 它允许从主机安装敏感路径

  • Pod可以作为特权运行

浏览Kubernetes官方文档可以获取可用的PSP控件及其默认值的完整列表:

https://kubernetes.io/docs/concepts/policy/pod-security-policy/

让我们来看一个示例,说明如何防止特权Pod在集群中运行。

在集群中启用PSP之后,请尝试部署类似的pod:

deploy-not-privileged.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: not-privileged-deploy  name: not-privileged-deployspec:  replicas: 1  selector:    matchLabels:      app: not-privileged-deploy  template:    metadata:      labels:        app: not-privileged-deploy    spec:      containers:        - image: alpine          name: alpine          stdin: true          tty: true          securityContext:            runAsUser: 1000            runAsGroup: 1000

它可以立即使用,因为我们告诉Rancher启用具有受限安全策略的PSP,该策略允许没有特权的pod正常运行,像上面那样。

检查默认PSP中的内容,如下所示:

$ kubectl get psp restricted-psp -o yaml

apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata:  annotations:    serviceaccount.cluster.cattle.io/pod-security: restricted    serviceaccount.cluster.cattle.io/pod-security-version: "1960"  creationTimestamp: "2020-03-04T19:56:10Z"  labels:    cattle.io/creator: norman  name: restricted-psp  resourceVersion: "2686"  selfLink: /apis/policy/v1beta1/podsecuritypolicies/restricted-psp  uid: 40957380-1d44-4e43-9333-91610e3fc079spec:  allowPrivilegeEscalation: false  fsGroup:    ranges:      - max: 65535        min: 1    rule: MustRunAs  requiredDropCapabilities:    - ALL  runAsUser:    rule: RunAsAny  seLinux:    rule: RunAsAny  supplementalGroups:    ranges:      - max: 65535        min: 1    rule: MustRunAs  volumes:    - configMap    - emptyDir    - projected    - secret    - downwardAPI    - persistentVolumeClaim

或者在Rancher的全局视角检查。选择【安全>Pod安全策略】并点击受限的选项。

8017d4c825f8508be68a3d47f9822537.png

在Rancher中检查Pod安全策略

该PSP应该允许任何pod,只要它以标准用户(不是root)身份运行,并且不需要任何特权和特殊功能。

有关PSP和RBAC的其他内容,我们将在以后进行探讨。为了简单起见,加上Rancher已经为你设置了必需的绑定,因此我们现在略过这一部分。让我们尝试部署一个特权pod,例如来自kubectl-root-in-host.sh脚本的那个pod:

deploy-privileged.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: privileged-deploy  name: privileged-deployspec:  replicas: 1  selector:    matchLabels:      app: privileged-deploy  template:    metadata:      labels:        app: privileged-deploy    spec:      containers:        - image: alpine          name: alpine          stdin: true          tty: true          securityContext:            privileged: true      hostPID: true      hostNetwork: true

该pod将不会进入集群

 Warning  FailedCreate  2s (x12 over 13s)  replicaset-controller  Error creating: pods "privileged-deploy-7569b9969d-" is forbidden: unable to validate against any pod security policy: [spec.securityContext.hostNetwork: Invalid value: true: Host network is not allowed to be used spec.securityContext.hostPID: Invalid value: true: Host PID is not allowed to be used spec.containers[0].securityContext.privileged: Invalid value: true: Privileged containers are not allowed]

PodSecurityPolicy admission controller将不允许创建这个pod,因为现有的PSP不允许使用“hostPID”、“hostNetwork” 或 “privileged”。

6405835d9c013974e7fd8a3d8f5b90eb.png

总  结

在本文中我们通过在Rancher环境中启用一个简单的Pod安全策略来增强你的Kubernetes安全。通过使用默认的受限PSP,我们确保pod只能在不需要扩展安全权限的情况下运行。最后,我们尝试部署一个拥有众多权限的pod,并且失败了,因为现有的PSP阻止了它被调度到集群上。

Rancher Kubernetes平台拥有着超过一亿次下载量,我们深知安全问题对于用户而言的重要性。后期我们也将会推出更多与安全相关的内容,帮助Rancher用户安全、稳妥地落地Kubernetes。

098cbac3b51780fc2c92feea2bd9b80b.png

往期精彩

《Docker是什么?》

《Kubernetes是什么?》

《Kubernetes和Docker到底有啥关系?》

《教你如何快捷的查询选择网络仓库镜像tag》

《Docker镜像进阶:了解其背后的技术原理》

《教你如何修改运行中的容器端口映射》

《k8s学习笔记:介绍&上手》

《k8s学习笔记:缩扩容&更新》

《Docker 基础用法和命令帮助》

《在K8S上搭建Redis集群》

《灰度部署、滚动部署、蓝绿部署》

《PM2实践指南》

《Docker垃圾清理》

《Kubernetes(k8s)底层网络原理刨析》

《容器环境下Node.js的内存管理》

《MySQL 快速创建千万级测试数据》

《Linux 与 Unix 到底有什么不同?》

《浅谈几种常见 RAID 的异同》

《Git 笔记-程序员都要掌握的 Git》

《老司机必须懂的MySQL规范》

《Docker中Image、Container与Volume的迁移》

《漫画|如何用Kubernetes搞定CICD》

《写给前端的Docker实战教程》

《Linux 操作系统知识地图2.0,我看行》

《16个概念带你入门 Kubernetes》

《程序员因接外包坐牢456天,长文叙述心酸真实经历》

《IT 行业老鸟,有话对你说》

《HTTPS 为什么是安全的?说一下他的底层实现原理?》


免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!


0e4dca238ae369b7f069b609d77cb5f6.png 9190f81bf0cd07e99b6489c46676e3c5.gif ce4fe75b47c101463fa365f2586b9f4e.png

www.dockerchina.cn

6c650f88b1b4bea2189ff1c3f0eab16a.png

看完文章,点个「在看」奥,谢谢!cd9bb9e0ea55811d85892074acd71feb.gif

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐