实操教程丨使用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。
实操教程丨使用Pod安全策略强化K8S安全的更多相关文章
- 实操教程丨如何在K8S集群中部署Traefik Ingress Controller
注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...
- 入门级实操教程!从概念到部署,全方位了解K8S Ingress!
Kubernetes Ingress用于添加规则,以将流量从外部路由到Kubernetes集群的服务中.在本文中你将了解ingress 的概念,以及用于路由外部流量到Kubernetes deploy ...
- 手把手实操教程!使用k3s运行轻量级VM
前 言 k3s作为轻量级的Kubernetes发行版,运行容器是基本功能.VM的管理原本是IaaS平台的基本能力,随着Kubernetes的不断发展,VM也可以纳入其管理体系.结合Container和 ...
- 织梦默认编辑器换成kindEditor实操教程
织梦默认编辑是CKeditor,要想换成kindEditor编辑器,按如下步骤操作. 先看效果图: 首先下载打包好的 kindEditor_for_dedeCMS.ZIP,下载地址:https://d ...
- 超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
在2018年年初,Jenkins X首次发布,它由Apache Groovy语言的创建者Jame Strachan创建.Jenkins X 是一个高度集成化的 CI/CD 平台,基于 Jenkins ...
- 虚拟机安装Ubuntu 16.04系统实操教程 详尽步骤 vmware ESXi亲测通过
1 Ubuntu 16.04系统安装要求 Ubuntu 16.04 LTS下载最新版本的Ubuntu,适用于台式机和笔记本电脑. LTS代表长期支持,这意味着有五年免费安全和维护更新的保证. Ubun ...
- 前端实操案例丨如何实现JS向Vue传值
摘要:项目开发过程中,组件通过render()函数渲染生成,并在组件内部定义了自定义拖拽指令.自定义拖拽指令规定了根据用户可以进行元素拖拽.缩放等一系列逻辑处理的动作. 本文分享自华为云社区<[ ...
- 百度NLP预训练模型ERNIE2.0最强实操课程来袭!【附教程】
2019年3月,百度正式发布NLP模型ERNIE,其在中文任务中全面超越BERT一度引发业界广泛关注和探讨.经过短短几个月时间,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基 ...
- 【强烈推荐,超详细,实操零失误】node.js安装 + npm安装教程 + Vue开发环境搭建
node.js安装 + npm安装教程 + Vue开发环境搭建 [强烈推荐,超详细,实操零失误] 原博客园地址:https://www.cnblogs.com/goldlong/p/8027997.h ...
随机推荐
- Freeswitch录音Dialplan
<extension name="record"> <condition field="destination_number" express ...
- Sublime Text 2+Zen Coding
自己长期使用editplus做代码编辑,使用过DW,还是习惯前者的使用环境.好友推荐,试试新的编码工具——Sublime Text 2.在代码制作过程中,最主要的是1)快速复制的模式化工作 2)零碎 ...
- 基于Jquery的textarea滚动条插件(原创)
之前项目中自己写的滚动条插件.先前太忙没有好好整理.现在项目间歇期拿出来整理后贴出来 Demo Here css 我是把mCustomScrollbar 的UI 扣下来的. 这里我要介绍下这个插件不错 ...
- caffe之android移植
获取Android手机CPU类型 ARM.ARMV7.NEON:http://blog.csdn.net/mengweiqi33/article/details/22796619 android nd ...
- 关于前端使用JavaScript获取base64图片大小的方法
base64原理 Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充,输出字 ...
- Flash Builder 使用
1. 解决编译慢的问题:用记事本打开安装目录下的 FlashBuilder.ini ,将里面设置的容量都扩大一半,如-Xms256m改为 -Xms512m,另外几项类似修改: 定位到相应版本的sdks ...
- 吴裕雄--天生自然HTML学习笔记:启动TOMCAT服务器时出现乱码解决方法
- SWUST OJ 东6宿舍灵异事件(0322)
东6宿舍灵异事件(0322) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31 Descriptio ...
- jmeter+ant+jenkins 接口自动化测试持续集成(送源码)
9.1 安装和介绍 JMeter 安装文件路径:https://pan.baidu.com/s/1kVJdnuv. JMeter 是轻量级的开源且稳定的自动化测试工具. 思路:在接口说明文档中整理 ...
- const define static extern
const const意味着"只读",欲阻止一个变量被改变,可以使用const关键字 const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) define #define ...