实操教程丨使用Pod安全策略强化K8S安全
本文来自Rancher Labs
什么是Pod安全策略?
Kubernetes Pod安全策略(PSP)是Kubernetes安全版块中极为重要的组件。Pod安全策略是集群级别的资源,用于控制Pod安全相关选项,并且还是一种强化Kubernetes工作负载安全性的机制。Kubernetes平台团队或集群运维人员可以利用它来控制pod的创建以及限制特定的用户、组或应用程序可以使用的功能。
举个简单的例子,使用PSP你可以:
-
防止特权Pod启动并控制特权升级。
-
限制Pod可以访问的主机命名空间、网络和文件系统
-
限制可以运行pod的用户/组。
-
限制Pod可以访问的Volume
-
限制其他参数,如运行时配置文件或只读根文件系统
在本文中,我们将向你展示在Rancher中如何通过启用一个简单的Pod安全策略来强化你的Kubernetes安全。
Pod安全策略真的可以增强K8S的安全性吗?
是的,Pod安全策略确实可以增强Kubernetes的安全性。它提供了Kubernetes原生控制机制,可以防止威胁而不影响性能,这与agent必须拦截主机上的每个动作有所区别。
如果你尚未在集群中启用PSP(或执行访问控制之类的等效方法),则Kubernetes用户可能会生成特权集群。这将会被恶意利用,例如提升特权进而突破容器隔离并访问其他Pod/服务。
如果没有限制Pod spec特权的机制,攻击者可以通过docker命令执行任何操作,例如,运行特权容器、使用节点资源等。
想要快速验证以上说法,你可以执行以下脚本(千万不要在生产集群上操作):
❯ ./kubectl-root-in-host.sh bash-4.4# whoami root bash-4.4# hostname sudo--alvaro-rancher-rancheragent-0-all
你可以获得对Kubernetes节点的即时root访问权限。是不是有点后怕呢?
通过遵循最小特权的概念,你可以安全地在集群中实现PSP,并确保在Kubernetes Pod或工作负载中没有不需要的权限。除了Kubernetes安全的核心理念外,最小特权原则也是一种通用的安全最佳实践,同时还是诸如PCI、SOC2或HIPAA等合规性标准的核心要求。
总结一下:
-
PSP将为Pod授予的安全功能提供默认安全约束,该pod可以是集群上任何用户创建的
-
PSP还能通过满足特定合规性基准的要求帮助你验证合规性
最小特权是一个概念,也是一个实践,可以将用户、账号和计算过程的访问权限限制为仅执行日常合法活动所需要的资源。
在你的集群中启用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:
你可以选择默认应用哪个Pod安全策略。在本例中,我们选择了restricted(受限)。
使用一个Admission controller来启用PSP的好处在于它提供了一个即时预防机制,甚至可以在调度之前停止部署过度特权的Pod。缺点就是你启用一个PSP之后,每个pod都需要经过PSP的批准,使其部署和过渡更加困难。
Rancher中启用基本Pod安全策略demo
在这一部分中,我们将逐步演示如何通过Rancher dashboard在集群中启用Pod安全策略,并在默认情况下使用受限策略,并了解如何防止创建特权Pod。
PSP对象本身是将要应用于pod specs的要求和约束的列表。PSP YAML如下所示:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: example spec: 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/v1 kind: Deployment metadata: labels: app: not-privileged-deploy name: not-privileged-deploy spec: 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/v1beta1 kind: PodSecurityPolicy metadata: 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-91610e3fc079 spec: 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安全策略】并点击受限的选项。
该PSP应该允许任何pod,只要它以标准用户(不是root)身份运行,并且不需要任何特权和特殊功能。
有关PSP和RBAC的其他内容,我们将在以后进行探讨。为了简单起见,加上Rancher已经为你设置了必需的绑定,因此我们现在略过这一部分。让我们尝试部署一个特权pod,例如来自kubectl-root-in-host.sh
脚本的那个pod:
deploy-privileged.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: privileged-deploy name: privileged-deploy spec: 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”。
总结
在本文中我们通过在Rancher环境中启用一个简单的Pod安全策略来增强你的Kubernetes安全。通过使用默认的受限PSP,我们确保pod只能在不需要扩展安全权限的情况下运行。最后,我们尝试部署一个拥有众多权限的pod,并且失败了,因为现有的PSP阻止了它被调度到集群上。
Rancher Kubernetes平台拥有着超过一亿次下载量,我们深知安全问题对于用户而言的重要性。后期我们也将会推出更多与安全相关的内容,帮助Rancher用户安全、稳妥地落地Kubernetes。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云OSS php 自定义域名 绑定bucket
做OSS图片上传时,可以采用阿里云分配的oss域名,也可以使用自定义域名(绑定用户域名),使用阿里云域名太长,不美观,我使用的绑定用户域名。使用阿里云分配域名时图片文件可以正常上传,使用自定义绑定用户域名时发现报错. "\"绑定用户域名\"bucket name is invalid" 错误大概意思是绑定的用户域名没有关联到bucket上,在查看阿里云oss文档时发现还需要使用CNAME,使用CNAME绑定到域名域名OSS文档地址:https://help.aliyun.com/document_detail/32100.html?spm=a2c4g.11186623.6.1055.181165d3LkhGyqPHP上传代码处理逻辑 public function upload() { // 获取上传文件表单字段名 $fileKey = array_keys(request()->file()); //获取表单上传文件 $file = request()->file($fileKey['0']); $resResult = Image::open($file); try {...
- 下一篇
企业级 React 组件库 tinper-bee 发布 2.3.5 版本
? 时间控件 输入框格式校验修改,支持moment所有合法格式 ? Tooltip 解决宽度设置无效问题 ? Modal confirm类型新增第二种形式 ? 优化 组件库 默认英文 ? 修复 Table 组件 模态框中表格滚动条计算错误问题 查看详细升级内容:https://github.com/iuap-design/tinper-bee/releases/tag/2.3.5 iuap design 官网:点击查看 相关链接 tinper-bee 的详细介绍:点击查看 tinper-bee 的下载地址:点击下载
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19