点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

>> 「开学季」当当大促!4-5折优惠不了解一下? <<

认证与授权对任何安全系统来说都至关重要,Kubernetes 也不例外。即使我们不是安全工作人员,也需要了解我们的 Kubernetes 集群是否具有足够的访问控制权限。Kubernetes 社区也越来越关注容器的安全评估(包括渗透测试,配置审计,模拟攻击),如果你是应用安全工程师,或者是安全感知的 DevOps 工程师,最好了解一下 Kubernetes 的授权模型。

Kubernetes 的授权控制原则与大多数系统一样:在授予访问权限时采用最小授权原则。例如,如果某个 Pod 使用了特定的 serviceAccount,那么该 Pod 被限定为只能拥有指定的权限,只能访问特定的资源。

Kubernetes 从 1.6 开始支持基于角色的访问控制机制(Role-Based Access,RBAC),集群管理员可以对用户或服务账号的角色进行更精确的资源访问控制。先简单回顾一下 RBAC 的原理。

1.

RBAC 基础概念

RBAC 授权策略会创建一系列的 Role 和 ClusterRole 来绑定相应的资源实体(serviceAccount 或 group),以此来限制其对集群的操作。每一个 Role 都基于 Create, Read, Update, Delete(CRUD)模型来构建,并使用“动词”来应用相应的权限。例如,动词 get 表示能够获取特定资源的详细信息。如果你想获取对 Secrets 的访问权限,可以创建如下的 ClusterRole:


关于 RBAC 的更多详细文档请参考 Kubernetes 官方文档或 CNCF 的博客。

2.

RBAC 实践

RBAC 授权模型为我们提供了一种精确的访问控制机制,但随着环境越来越复杂,这些 RBAC 配置也越来越难维护。RBAC 配置可能包含了 Roles, RoleBindings, ClusterRoles, ClusterRoleBindings, ServiceAccounts 和 Groups 等,想要跟踪它们之间的关系非常困难。

举个栗子,先创建一个名叫 helm 的 ServiceAccount,然后创建相应的 Role 绑定 “tiller-world” namespace,该 Role 只拥有 list pods 的权限,最后通过创建 RoleBinding 将该 Role 与之前创建的 ServiceAccount 绑定。


如果你想知道新创建的授权对象是否仅被授予必要的访问权限,就需要审查这些对象及其在集群中的关系。有时候还需要确保其仅对特定的资源实例具有访问权限,不允许访问所有的资源实例。例如,如果你不想让上面的 ServiceAccount 访问所有的 Secret,只允许它访问特定的 Secret,可以使用 resourceNames 字段指定:


这个方法的问题在于无法过滤集群中不存在的资源,这意味着如果资源的名称是动态变化的,那么就无法创建相应的 Role,除非在创建 Role 的同时创建资源。

3.

审计很重要

为了查看每个 Role 的作用以及每个资源对象应该能做哪些事情,我们不得不进行一些审计工作。最简单的审计就是确认某个 Service Account 是否拥有 Cluster Admin 的权限,再复杂一点,确认某个 CI/CD Service Account 在指定的 namespace 内是否拥有 Update Pod 的权限。

基于审计的目标,大致可以分为两种审计模式:

  • 资源审计:识别风险最高的资源对象,并查看谁可以访问它们。

  • 账户审计:查看账户的有效权限并确保它们的合理性。

账户审计比较彻底,但很耗时;资源审计可以更快发现问题,但可能会有所遗漏。举例:

  • 资源审计:查看谁能访问某个 Secret 资源,并确保其是否遵循最小授权原则。

  • 账户审计:遍历所有的 user,group,Service Account 和 RoleBinding,确保它们是否被授予正确的访问权限,并只限定在特定的 namespace 内。

下面提供几种命令行工具来帮助大家更方便地审计 RBAC。

4.

Kubectl Can-I

某些生产环境不允许安装额外的服务,只能使用 kubectl,我们可以使用 kubectl 的内置命令 kubectl auth can-i来查看 RBAC 权限。

例如,查看你是否拥有 get pod 的权限:

$ kubectl auth can-i get pods
yes

查看你是否拥有 cluster-admin 的权限:

$ kubectl auth can-i "*" "*"
yes

列出你在某个 namesapce 中拥有的所有权限:


来点更有趣的,我们还可以通过 Kubernetes 的 Impersonation API 来查看其他账户是否拥有访问特定资源的权限。例如,查看名为 unprivileged-service-account 的 Service Account 是否拥有 get pod 的权限:

$ kubectl auth can-i get pod \--as system:serviceaccount:secure:unprivileged-service-account
yes

--as 参数用来指定账户名称,类似的参数还有 --as-group,背后的原理实际上是一组传递给 API Server 的请求头。

Kubernetes 中除了有 Service Account 之外还会有 User,每创建一个 Service Account,都会自动创建一个对应的 User,名称格式为:system:serviceaccount:<namespace><serviceaccount>。想知道某个 Service Account 的 username 可以通过它的 yaml 文件来推算:


通过将 verbs 字段的值指定为 impersonate,可以让某个用户拥有其他用户的权限,即可以模拟其他用户。例如,管理员可以使用此功能通过暂时模拟其他用户并查看请求是否被拒绝来调试授权策略。

例如,如果你想让非 Cluster Admin 账户能够模拟其他用户,可以创建如下的 ClusterRole:


5.

Kubectl Who Can

下面介绍的这款工具是 kubectl 的插件,插件名叫 who-can,顾名思义,用来显示哪些账户拥有访问特定资源的权限。安装方法很简单,可以通过 kubectl 的插件管理框架 Krew 来安装:

  1. 安装 krew。参考 https://github.com/kubernetes-sigs/krew/

  2. 安装 who-can

$ kubectl krew install who-can

假设 secure namespace 中有一个 Secret 名为 cluster-admin-creds,你想查看谁拥有访问它的权限:

$ kubectl who-can get secret cluster-admin-creds -n secureROLEBINDING            NAMESPACE       SUBJECT                               TYPE            SA-NAMESPACE
unpriv_sa_binding      secure          unprivileged-service-account          ServiceAccount  secureCLUSTERROLEBINDING     SUBJECT             TYPE            SA-NAMESPACE
cluster-admin          system:masters      Group

输出信息也很一目了然,没什么可说的。提醒一下,该工具只支持查看 create、update 和 delete 这几个访问权限,不支持 use。use 用来将 Pod Security Policy 绑定到相应的 Role。

6.

Rakkess

rakkess 与 who-can 类似,可以列出某个账户对所有资源的访问权限,可以通过 krew 来安装。

使用方法也很简单,如果想查看当前用户对所有资源的访问权限,可使用如下命令:


如果想查看某个特定的 Service Account 对所有资源的访问权限,可以使用如下命令:

$ kubectl access-matrix --as system:serviceaccount:kube-ovn:ovn -n kube-ovn

更多用例可以参考官方文档。

7.

RBack

rback 用来对 kubectl 的输出结果进行可视化展示,可以输出为 .dot 格式,也可以输出为 .png 或任何格式。

例如:

$ kubectl get sa,roles,rolebindings \-n monitoring -o json | rback &gt; rback.dot

或者保存为 png:

$ kubectl get sa,roles,rolebindings \-n monitoring -o json \| rback | dot -Tpng &gt; rback.png

8.

RBAC-View

rbac-view 也可以用来可视化账户与权限之间的关系,但与 rback 不同,它是一个 web 应用,安装方法参考官方文档。

使用方式:

$ kubectl rbac-view
serving RBAC View and http://localhost:8800

在浏览器中打开链接 http://localhost:8800


9.

终极测试

上面提到的所有方法都可以帮助我们快速收集信息,但有时难免会出现误报的情况。想要确认某账户到底有没有相应的权限,可以使用下面提到的终极方法。例如,要想确认 secure namespace 中的 unprivileged-service-account 是否具有 get secret 的权限,可以使用如下的命令:

$ kubectl get secrets \--as system:serviceaccount:secure:unprivileged-service-account \-o yaml

10.

模拟攻击

预防攻击最好的方法是模拟攻击,我们可以模拟一个黑客进入其中的某个 Pod,看看能否执行一些不可描述的操作。步骤如下:

  1. 创建一个 Service Account。

$ kubectl create serviceaccount ncc-sa
  1. 创建相应的角色。


  1. 将 Role 与 Service Account 绑定。


  1. 创建一个测试 Pod,serviceAccountName 指定为 ncc-sa


  1. 进入该 Pod。


  1. 验证是否具有 get pod 的权限。

    $ kubectl get pod
    

11.

总结

随着集群环境越来越复杂,RBAC Role 与其相关资源对象之间关系的复杂性也会呈指数级增长。如果 Role 太多,那么运维人员可能很难选择正确的 Role,容易犯错;如果 Role 太少,运维人员可能会被迫选择默认的 Role,这会导致某些 Pod 权限过大。所以我们需要找到一个平衡点,通常的做法是通过 ansible 或 terraform 将某些部署策略抽象出来变成模板,将 RBAC 策略写到模板中,这样可以大大减轻开发人员的压力。

留言交流不过瘾?添加微信:zyc_enjoy

根据指引加入各种主题讨论群

每日一问

今日问题

竹筒有20根签,10根白色,10根红色。抽取10根颜色一致可获得100元奖励,抽取9根颜色一致可获得50元奖励,但是抽取红色5根白色5根就损失50元,问这游戏是否值得参与?原因?

(留言说说你的答案和解析吧,关注公众号,发送口令:Q20190826,核对正确答案)

昨日问答:点击>>查看<<

推荐阅读

  • 这几款好用超赞的 Google Chrome插件送给你!

  • IntelliJ IDEA 2019.2最新解读

  • Spring Cloud与Dubbo的完美融合之手

  • 狡猾的 AI 工程师,编个故事骗走 2 亿人民币...

  • 日均7亿交易量,如何设计高可用的MySQL架构?

签到计划

活动介绍:自律到极致-人生才精致:第13期

活动奖励:《Spring Cloud微服务:入门、实战与进阶》 x 10

扫描下方二维码,签到参与

推荐关注:云原生实验室

点一点“阅读原文”小惊喜在等你

这些用来审计 Kubernetes RBAC 策略的方法你都见过吗?相关推荐

  1. Kubernetes RBAC 详解

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 Kubernetes API 动态 ...

  2. 支持纳管Redis数据库,支持查看、连接和会话审计Kubernetes Pod,JumpServer堡垒机v2.18.0发布

    2022年1月24日,JumpServer开源堡垒机正式发布v2.18.0版本.在这一版本中,JumpServer新增支持纳管Redis数据库,支持查看.连接.操作和会话审计Kubernetes Po ...

  3. Kubernetes网络策略,这一篇就够了

    目前许多组织都在采用Kubernetes来运行他们的应用程序.以至于有些人将Kubernetes称为新的数据中心操作系统.因此,组织开始将Kubernetes(通常缩写为k8s)视为关键任务平台,它需 ...

  4. Kubernetes RBAC 实战应用

    Kubernetes RBAC 实战应用 文章目录 Kubernetes RBAC 实战应用 1. 介绍 2. Practice - Role and Rolebinding 3. Practice ...

  5. Kubernetes 部署策略

    文章目录 Kubernetes 部署策略 重建(Recreate) - 最好在开发环境 滚动更新(rolling-update) 蓝/绿(blue/green) - 最好用来验证 API 版本问题 金 ...

  6. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例

    策略梯度方法 引言 9.1 策略近似和其优势 9.2 策略梯度定理 9.2.1 梯度上升和黑箱优化 9.2.2 策略梯度定理的证明 9.3 REINFORCE:蒙特卡洛策略梯度 9.3.1 轨迹上的R ...

  7. Windows10 家庭版没有本地组策略解决方法

    Windows10 家庭版没有本地组策略解决方法 参考文章: (1)Windows10 家庭版没有本地组策略解决方法 (2)https://www.cnblogs.com/belic/p/989838 ...

  8. 计算机 学术论文写作,计算机辅助学术论文写作系统的研制策略与方法.pdf

    :::立:璺=至鎏重量盐兰!!主兰兰兰釜 计算机辅助学术论文写作系统的研制策略和方法+ 滕弘飞冯林徐循钱志勤 (大连理工大学机械工程系,创新教育实践中心,大连,116024) 摘要本文介绍了计算机辅助 ...

  9. 《强化学习》中的第13章:策略梯度方法

    前言: 本次笔记对<强化学习(第二版)>第十三章进行概括性描述. 以下概括都是基于我个人的理解,可能有误,欢迎交流:piperliu@qq.com. 让时间回到最开始:第二章多臂赌博机.在 ...

最新文章

  1. servlet配置web.xml问题
  2. 【USACO 3.1】Contact(01子串按出现次数排序)
  3. 烂泥:CentOS6.5挂载windows共享文件夹
  4. 纪念一下我画的第一个印刷电路板!
  5. mysql 高可用工具_MySQL Utilities 高可用工具体验
  6. 一个看似是系统问题的应用问题的解决过程
  7. 天池 在线编程 区间统计(队列)
  8. python爬虫网络出错怎么办_python爬虫之headers处理、网络超时问题处理
  9. 付费圈子来了,去还是不去?
  10. bzoj 5281: [Usaco2018 Open]Talent Show【dp】
  11. 新农合研究的文献外文回顾
  12. PDF文件找回打开密码
  13. 一文教你用squid将闲置的服务器搭建成爬虫使用的高匿代理服务器
  14. 青龙-聚看点(稳定的毛)
  15. python培训价格-python培训价格
  16. 使用nano编辑器进行查找和替换
  17. php中左移和右移,c语言左移和右移的示例详解
  18. UOJ#310-[UNR #2]黎明前的巧克力【FWT】
  19. STM32OLED显示-学习笔记
  20. 集音频和视频播放功能于一身的简易播放器

热门文章

  1. python3 uvloop 简介
  2. python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop
  3. linux bash shell 常用快捷键
  4. putty 保存密码 自动登陆 四种方法
  5. python3 set 集合 简介
  6. docker 部署 redis
  7. python3 list 列表 方法说明
  8. gdb汇编调试c程序
  9. unicode环境下用CFile读取txt的若干疑惑,该如何处理
  10. Java Garbage Collection