使用Pod安全策略强化K8S安全

2020 年 5 月 25 日

使用Pod安全策略强化K8S安全

什么是 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.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还能通过满足特定合规性基准的要求帮助你验证合规性


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


在你的集群中启用 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:



在 Rancher 中启用 PSP


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


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


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 安全策略】并点击 受限 的选项。



在 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”。


总结


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


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


2020 年 5 月 25 日 16:41213

评论

发布
暂无评论
发现更多内容

RabbitMQ-AMQP简介

云淡风轻

读书笔记 RabbitMQ

【万字图文-原创】 | 学会Java中的线程池,这一篇也许就够了!

一枝花算不算浪漫

并发编程 jdk源码 线程池

k8s 上运行我们的 springboot 服务之——我们的springboot能够在k8s上运行

柠檬

k8s istio springboot

使用 webpack 搭建一个简单的 React 脚手架

张张张小烦

react.js

音视频会议系统-Janus的安装与布署

音视频专家-李超

音视频 WebRTC 音视频会议

Spring Security密码登录流程源码分析

读钓

源码分析 spring security springboot

ArrayList 源码分析

读钓

Java 源码分析 jdk源码

ARTS打卡Week 01

teoking

android WebRTC

Tomcat学习分享

墨凡

tomcat

MySQL实战四十五讲基础篇总结(四)

一个有志气的DB

MySQL 索引结构

MySQL实战四十五讲基础篇总结(六)

一个有志气的DB

MySQL 读写锁

数据与广告系列二:计算广告和推荐系统

黄崇远@数据虫巢

数据挖掘 大数据 互联网 广告 推荐系统

ARTS week1

紫枫

ARTS 打卡计划

其实,还是让我挺震惊的,程序员的换行率竟然高达 40%

非著名程序员

程序员 程序人生 自我思考

鄙视链 & 全栈

伯薇

学习 能力提升 全栈

云直播平台的选型与使用

音视频专家-李超

谈谈我的云笔记使用之路

读钓

学习 个人成长 写作

Algorithm week 1: Merge Two Sorted Lists

猫吃小怪兽

算法 链表 ARTS 打卡计划

编程入门整理

紫枫

读书笔记

MySQL实战四十五讲基础篇总结(五)

一个有志气的DB

MySQL 索引

MySQL实战四十五讲基础篇总结(七)

一个有志气的DB

MySQL 性能

谈即时编译优化-以异常堆栈丢失为例

寻筝

青春时期的打油诗

墨凡

随笔

时间管理的本质

史方远

职场 心理 成长

关于工作的一点总结

墨凡

工作思路

谈谈控制感(9):提升控制感排名第一的武器

史方远

职场 心理 成长

leetcode练级-两数之和

幸福三寸日光

算法 LeetCode js

从引用聊一聊 Java 垃圾回收

Rayjun

Java 引用 对象

Java 数据持久化系列之JDBC

程序员历小冰

Java JDBC 持久化

宏在C++中的替代解决方案

老王同学

《陆蓉行为金融学讲义》 - 读后感

石云升

读书笔记 投资 行为金融学 理性 公平

使用Pod安全策略强化K8S安全-InfoQ