首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kubernetes-Pod安全策略psp实践

kubernetes-Pod安全策略psp实践

作者头像
公众号: 云原生生态圈
发布于 2021-02-26 03:04:50
发布于 2021-02-26 03:04:50
1.2K00
代码可运行
举报
文章被收录于专栏:云原生生态圈云原生生态圈
运行总次数:0
代码可运行
K8s Pod Security Policy实践

这是关于如何加固kubernetes集群安全的文章[1]。在测试环境下使用默认的users和service accounts的默认授权创建pods并没有问题,但是在生产环境下,这可能会导致不可预料的灾难。Kubernetes提供pod security policy用来限制users和service account的权限。

概览

在minikube创建的集群中实践pod security policy前,在这里我将做一些理论基础的介绍。

实验条件

读者在实践pod security policy之前必须先要对下面这些名词的概念有充分的理解:

  • Minikube
  • Namespace
  • Pod
  • Replica Set
  • Service Account
  • Cluster Role
  • Cluster Role Binding

Pod Securities Policy

Pod Security Policies(Adminssion Controller)授予users和service accounts创建或更新pods使用资源的权限。这是一种集群级别的资源类型,用来限制pod对敏感资源的使用。

Adminssion Controller

Addmission controller会拦截发往Kubernetes API Server调用资源的请求,验证请求调用的users和service accout是否已经授权和认证使用被调用的资源对象。例如:Admission controller会验证请求者是否拥有使用hostNetwork等kubernetes资源的权限。

Policy

对授权资源使用权限的规则定义在YAML文件中。

Policy Definition Guidelines

规则有两种:一种是限制(restrictive)使用资源的规则,另一种是允许(permission)使用资源的规则。

Pod Security Policy应该遵循以下的规范:

  • 如果要限制user和service account使用集群中的资源,需要对相应的用户绑定限制策略
  • 如果要允许user和service account使用集群中的资源,需要对相应的用户绑定允许策略

例子

在这部分中我们将开始在集群中实践pod security policy

Enabling Pod Security Policy

PSP(Pod Security Policy) 在默认情况下并不会开启。通过将PodSecurityPolicy关键词添加到 --enbale-admission-plugins 配置数组后,可以开启PSP权限认证功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Example
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodSecurityPolicy

注意:开启PodSecurityPolicy功能后,即使没有使用任何安全策略,都会使得创建pods(包括调度任务重新创建pods)失败

Testing

通过下面的deployment yaml文件测试在没有PSP策略的情况下是否可以创建pod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4

使用下面的命令创建deployment资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo kubectl apply -f nginx-deployment.yaml

使用下面的命令检查pod是否创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get pods,replicasets,deployments

资源查看

通过上图可见deployments和relicaset正在运行,由于缺少PSP policy,集群并没有创建相应的pods。

Defining Policies

下面将创建两个policies,

  1. Restrictive Policy

下面是典型的限制资源使用的restrictive policy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restrictive
spec:
  privileged: false
  hostNetwork: false
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  hostPID: false
  hostIPC: false
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  volumes:
  - 'configMap'
  - 'downwardAPI'
  - 'emptyDir'
  - 'persistentVolumeClaim'
  - 'secret'
  - 'projected'
  allowedCapabilities:
  - '*'
  1. Permissive Policy

下面是允许使用资源的permissive policy,多条permissive policy规则被用来设置相应user或者sevice account使用相关类型的资源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: permissive
spec:
  privileged: true
  hostNetwork: true
  hostIPC: true
  hostPID: true
  seLinux:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  hostPorts:
  - min: 0
    max: 65535
  volumes:
  - '*'

上面两种poicies可以使用下面的命令创建对应的PSP资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f default-restrict-psp.yaml

kubectl apply -f permissive-psp.yaml

核对psp是否创建成功与否:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo kubectl get psp

查看psp

下面将通过cluster role和cluster role binding在集群中使用刚才定义的安全策略(Pod Security Policy)。

Cluster Role

  • 关于restrictive policy的restrictive cluster role
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: psp-restrictive
rules:
- apiGroups:
  - extensions
  resources:
  - podsecuritypolicies
  resourceNames:
  - restrictive
  verbs:
  - use
  • 关于permissive policy的permissive cluster role
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: psp-permissive
rules:
- apiGroups:
  - extensions
  resources:
  - podsecuritypolicies
  resourceNames:
  - permissive
  verbs:
  - use

通过下面命令创建相应的cluster role资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f psp-restrictive-cluster-roleyaml

kubectl apply -f psp-permissive-cluster-roleyaml

Cluster Role Bindings

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: psp-default
subjects:
- kind: Group
  name: system:serviceaccounts
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: psp-restrictive
  apiGroup: rbac.authorization.k8s.io

上面的role binding会将restrictive cluster role绑定到所有的system service account。

使用下面的命令生成role binding资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f psp-restrictive-cluster-role-binding.yaml

Testing

已经定义了restrictive policy并且将对应的psp绑定到对应的service account,我将通过重新生成开篇的deployment资源来验证pods是否可以创建。

首先,删除已经存在的deployment资源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl delete deploy nginx-deployment

kubectl get po,rs,deploy

资源查看

重新创建deployment:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f nginx-deployment.yaml

kubectl get po,rs,deploy

资源查看

注意:通过图可见在policies创建后,可以创建pod资源。

  1. Breaking Policy Rules

在这部分,我将在deployment中使用已经在restrictive policy中禁止的“hostNetwork”。

首先,清楚前面创建的deployment资源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl delete deploy ninx-deployment

kubectl get po.rs,deploy

img

使用下面的命令和yaml文件重新创建相应资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hostnetwork-deployment
  namespace: kube-system
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
      hostNetwork: true
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f   nginx-host-network-deployment.yaml

kubectl get po,rs,deploy

可见replica set controller并没有创建相对应的pod,原因如下:

Warning FailedCreate 2m38s (x17 over 8m5s) replicaset-controller Error creating: pods "nginx-hostnetwork-deployment-fd75d78b-" is forbidden: unable to validate against any pod security policy: [spec.securityContext.hostNetwork: Invalid value: true: Host network is not allowed to be used]

注意:

上面的错误显示在创建deployment时试图获取已经被限制的资源,k8s集群不允许这样的行为。

  1. Creating deployment with privileged access

在这部分,我将通过对一些controllers(deamon-set-controller,replicaset-controller,job-controller)的调用user和service account授予一些特殊权限。

首先,我先创建role binding。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: psp-permissive
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: psp-permissive
subjects:
- kind: ServiceAccount
  name: daemon-set-controller
  namespace: kube-system
- kind: ServiceAccount
  name: replicaset-controller
  namespace: kube-system
- kind: ServiceAccount
  name: job-controller
  namespace: kube-system

使用以下命令创建role binding:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f psp-permissive-cluster-role-binding.yaml

接下来我将重新创建deployment并在pod中使用被restrictive policy限制使用的资源。当前deployment与前面deployment的区别在于现在在kube-system命名空间中创建deployment,以前则是在default命名空间中,这主要是由于刚刚对kube-system授予permissive policy权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hostnetwork-deployment
  namespace: kube-system
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
      hostNetwork: true

使用下面命令,重新创建deployment资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f nginx-host-network-deployment-kube-system.yaml

使用下面命令,验证pod是否正常运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get po,rs,deploy -n kube-system | grep hostnetwork

注意:由于已经对kube-system命名空间的user和service account授权使用hostNetwork,可见nginx-hostnetwork-deployment pod已经部署在kube-system命名空间。

总结

上面的内容演示了如何通过使用PSP授权使用特殊资源,在k8s集群中实现Pod Security Policy安全策略。

参考资料

[1]

参考掘金: https://juejin.cn/post/6844903910344228878

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Fiddler 实现手机抓包详解
Fiddler 是一款强大的抓包工具,原理是以 web 代理服务器的形式进行工作的:
全栈程序员站长
2022/09/07
7.9K0
手机APP如何抓包[通俗易懂]
1为工具栏;2为数据报文展示面板;3为命令行;4为功能页签 当然如果觉得英文看起来累的可以导入中文补丁,下载链接如下 链接:https://pan.baidu.com/s/10-YBzdH3QdLtVHWxV73_9A 提取码:yyh6
全栈程序员站长
2022/09/02
4.5K0
手机APP如何抓包[通俗易懂]
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???
Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。
北京-宏哥
2022/08/19
2.9K0
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???
IoT设备网络数据包抓包改包环境搭建分享
这部分主要还是比较底层的抓包。这里就不过多的介绍了,毕竟好多大神的文章都写的很详细,主要内容还是以第三为主。
FB客服
2020/06/29
3.1K0
IoT设备网络数据包抓包改包环境搭建分享
Python爬虫之fiddler手机抓包
通过Fiddler抓包工具,可以抓取手机的网络通信,但前提是手机和电脑处于同一局域网内(WI-FI或热点),然后进行以下设置:
yuanshuai
2022/08/22
1.3K0
Python爬虫之fiddler手机抓包
由HTTPS抓包引发的一系列思考
在渗透测试过程中,必不可少的操作就是使用BurpSuite、Fildder等抓包工具对应用程序的数据包进行拦截、观察和篡改。那么问题来了——对于使用HTTPS协议的站点,在BurpSuite中拦截到的数据包为何也是“明文传输”?如下图所示。
FB客服
2019/12/30
1.9K0
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(11)-Fiddler设置安卓手机抓包,不会可是万万不行的!
Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。
北京-宏哥
2022/08/19
9.1K0
《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(11)-Fiddler设置安卓手机抓包,不会可是万万不行的!
Fiddler 抓包 Android
设置系统代理后,依然抓不到包 ( 没有相关请求的包 ),但是 app 却依旧正常返回数据,没有断网。
yiyun
2022/04/01
2.8K0
Fiddler 抓包 Android
几种常见网络抓包方式介绍
无论作为网络运维人员,还是安全渗透工程师,在工作中都会无可避免地碰到网络抓包的需求。
天存信息
2021/05/27
3.4K0
几种常见网络抓包方式介绍
fiddler配置手机代理
在出现的提示中, 点击FiddlerRoot certificate安装证书, 安装完成后即可在电脑通过fiddler对手机进行抓包
coffee1
2024/03/16
2750
fiddler4手机抓包教程(安卓抓包教程)
下载的软件安装包为“fiddler_4.6.20171.26113_setup.exe”格式,双击安装。安装成功,在“开始”-“所有程序”,就会看见这样的图标,若是常用的话,也可以在桌面建一个快捷方式,如下图:
全栈程序员站长
2022/07/26
3.5K0
fiddler4手机抓包教程(安卓抓包教程)
安卓抓包,为何总是 Tunnel to?
最近两周我学了下安卓逆向,还要学下学校的课程,感觉再不学就要没了,而且个人也有点事,所以文章更新给耽误了。学了点安卓逆向之后,就需要应用,要不学了也是浪费时间。
sergiojune
2019/05/14
3.7K0
安卓抓包,为何总是 Tunnel to?
抓包工具Charles基本用法
我们在进行B/S架构的Web项目开发时,在前端页面与后台交互的调试的时候,通常使用在JSP中加入“debugger;”断点,然后使用浏览器的F12开发者工具来查看可能出错的地方的数据。或者使用HttpWatch来抓包分析。
全栈程序员站长
2022/08/14
8350
抓包工具Charles基本用法
Fiddler抓包实战,这些小窍门你都会了吗?
调试来自PC,Mac或Linux系统以及移动(iOS和Android)设备的流量。确保在客户端和服务器之间传输正确的cookie,标头和缓存指令。支持任何框架,包括.NET,Java,Ruby等。并且可以进行HTTP/HTTPS流量记录,安全测试、性能测试等,可以说是一个不错的软件,但是唯一遗憾的就是没有MAC版本,如果你的电脑是mac,那么可以考虑使用CrossOver进行安装和练习。
Bug开发工程师
2020/04/15
3K0
使用fiddler对手机APP进行抓包
在做手机或移动端APP的接口测试时,需要从开发人员那里获取接口文档,接口文档应该包括完整的功能接口、接口请求方式、接口请求URL、接口请求参数、接口返回参数。如果当前项目没有接口文档,则可以使用fiddler对APP进行抓包确认。在手机上对APP进行操作,然后在Fiddler中可以抓取对应的网络交互信息(一个功能中可能设计多个接口的交互)。在抓取的信息中可以看到接口请求方式、接口请求URL、接口请求参数、接口返回参数。
全栈程序员站长
2022/08/29
2K0
使用fiddler对手机APP进行抓包
Fiddler
那我们怎样抓包呢?如果直接抓取浏览器上的内容,可以直接使用开发者工具进行抓包,但有个局限,只能抓浏览器的,功能也没有多少。还可以使用别的工具,比如 mitmproxy、charles,当然还有今天所说的 Fiddler 。今天要分享的就是如何使用fiddler进行抓包以及它的功能讲解。
我被狗咬了
2019/09/23
2.1K0
Fiddler
Fiddler的安装与使用
Fiddler是位于客户端和服务器端之间的代理,也是目前最常用的抓包工具之一 。它能够记录客户端和服务器之间的所有 请求,可以针对特定的请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器。
py3study
2020/11/13
2K0
Fiddler的安装与使用
Fiddler+雷电模拟器里的APP抓包( Fiddler模拟器抓包)
常用的抓包工具有fiddler、wireshark、httpwatch、 firebug、F12/等。抓包抓的是协议,fiddler抓的是HTTP、HTTPS协议,wireshark抓的是其他协议。fiddler、wireshark可以修改接口的参数和返回值,常用的F12调试工具只可以查看接口的参数和响应值。
超级小可爱
2023/02/20
10K1
太干了,Android 抓包姿势总结!
App 服务端测试基本就是 Web 安全那一套,但如果抓不到服务器的包?哎~就很难受,空报告?
信安之路
2021/09/17
5K0
接口测试|Fiddler设置手机抓包
1、手机和fiddler位于同一个局域网内;首先从fiddler处获取到ip地址和端口号
霍格沃兹测试开发Muller老师
2023/02/01
1.4K0
推荐阅读
相关推荐
Fiddler 实现手机抓包详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档