本文来自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,确保PodSecurityPolicyenable-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。

实操教程丨使用Pod安全策略强化K8S安全的更多相关文章

  1. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  2. 入门级实操教程!从概念到部署,全方位了解K8S Ingress!

    Kubernetes Ingress用于添加规则,以将流量从外部路由到Kubernetes集群的服务中.在本文中你将了解ingress 的概念,以及用于路由外部流量到Kubernetes deploy ...

  3. 手把手实操教程!使用k3s运行轻量级VM

    前 言 k3s作为轻量级的Kubernetes发行版,运行容器是基本功能.VM的管理原本是IaaS平台的基本能力,随着Kubernetes的不断发展,VM也可以纳入其管理体系.结合Container和 ...

  4. 织梦默认编辑器换成kindEditor实操教程

    织梦默认编辑是CKeditor,要想换成kindEditor编辑器,按如下步骤操作. 先看效果图: 首先下载打包好的 kindEditor_for_dedeCMS.ZIP,下载地址:https://d ...

  5. 超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!

    在2018年年初,Jenkins X首次发布,它由Apache Groovy语言的创建者Jame Strachan创建.Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins ...

  6. 虚拟机安装Ubuntu 16.04系统实操教程 详尽步骤 vmware ESXi亲测通过

    1 Ubuntu 16.04系统安装要求 Ubuntu 16.04 LTS下载最新版本的Ubuntu,适用于台式机和笔记本电脑. LTS代表长期支持,这意味着有五年免费安全和维护更新的保证. Ubun ...

  7. 前端实操案例丨如何实现JS向Vue传值

    摘要:项目开发过程中,组件通过render()函数渲染生成,并在组件内部定义了自定义拖拽指令.自定义拖拽指令规定了根据用户可以进行元素拖拽.缩放等一系列逻辑处理的动作. 本文分享自华为云社区<[ ...

  8. 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】

    2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...

  9. 【强烈推荐,超详细,实操零失误】node.js安装 + npm安装教程 + Vue开发环境搭建

    node.js安装 + npm安装教程 + Vue开发环境搭建 [强烈推荐,超详细,实操零失误] 原博客园地址:https://www.cnblogs.com/goldlong/p/8027997.h ...

随机推荐

  1. webStrom 运行React-Native项目

    1.点击“Edit Configurations...” 2.点击“+”选择“npm” 3.“Name”随便输入一个名称,“Command”改为“help”,然后在点击“+”号. 4.选择“Run E ...

  2. TCP/IP 协议栈初识

    原文:深入浅出 TCP/IP 协议栈 0. 简介 TCP/IP 协议栈是网络通信中一系列网络协议的综合,是核心骨架.它定义了电子设备接入因特网.以及数据在它们之间的传输方式,是一份标准.TCP/IP ...

  3. Python爬虫-selenium的使用(2)

    使用selenium打开chrome浏览器百度进行搜索 12345678910111213141516171819202122232425 from selenium import webdriver ...

  4. 重启aliyun esc 需要重新启动redis

    /export/sorftware ./redis-server ../redis.conf redis-server  配置路径 如redis-server  /etc/redis.conf 不是后 ...

  5. selenium之浏览器、元素、鼠标等操作总结

    1    控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1  控制浏览器窗口大小 在不同的浏览 ...

  6. 初窥Android AudioFlinger

    Android  AudioFlinger 是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于 ...

  7. 一起了解 .Net Foundation 项目 No.8

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. IdentityModel ...

  8. USB小白学习之路(11) Cy7c68013A驱动电路设计注意事项(转)

    Cy7c68013A驱动电路设计注意事项 转自:http://group.chinaaet.com/116/79029#0-tsina-1-71467-397232819ff9a47a7b7e80a4 ...

  9. Java入门教程九(封装继承多态)

    封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...

  10. Harbor镜像漏洞扫描

    Harbor镜像漏洞扫描 闲聊:我们知道 镜像安全也是容器化建设中一个很重要的环节,像一些商业软件如:Aqua就很专业但是收费也是很昂贵的,今天我们介绍下Harbor自带的镜像扫描器. 一.安装最新版 ...