那些用来审计 Kubernetes RBAC 战略的办法你都见过吗?

刚刚阅读1回复0
zaibaike
zaibaike
  • 管理员
  • 注册排名1
  • 经验值174315
  • 级别管理员
  • 主题34863
  • 回复0
楼主

书名镜像:那些用以审计工做 Kubernetes RBAC 思绪的体例你都见过吗?

证书与答应对任何平安可靠控造系统来说都十分重要,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:

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]

关于 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 存取。

apiVersion: v1 kind: ServiceAccount metadata: name: helm namespace: helm-world --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: tiller-user namespace: tiller-world rules: - apiGroups: - "" resources: - pods/portforward verbs: - create - apiGroups: - "" resources: - pods verbs: - list --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: tiller-user-binding namespace: tiller-world roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: tiller-user subjects: - kind: ServiceAccount name: helm namespace: helm-world

假设你想晓得新成立的答应第一类与否仅被授与需要性的出访权柄,就必要审核那些第一类及其在软件财产中的亲密关系。有时还必要包管里韦县对某一的天然资本示例具备出访权柄,不容许出访大部分的天然资本示例。好比,假设你不应让下面的 ServiceAccount 出访大部分的 Secret,只容许它出访某一的 Secret,能接纳 resourceNames 表头选定:

rules: - apiGroups: [""] resources: ["secrets"] resourceNames: ["my-pod-secrets"] verbs: ["get", "watch", "list"]

那个体例的问题在于无法过滤软件财产中不存在的天然资本,那意味着假设天然资本的名称是动态变革的,那么就无法成立恰当的 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 中保有的大部分权柄:

$ kubectl auth can-i --list --namespace=secure Resources Non-Resource URLs Resource Names Verbs *.* [] [] [*] [*] [] [*] selfsubjectaccessreviews.authorization.k8s.io [] [] [create] selfsubjectrulesreviews.authorization.k8s.io [] [] [create] [/api/*] [] [get] [/api] [] [get] [/apis/*] [] [get] [/apis] [] [get] [/healthz] [] [get] [/healthz] [] [get] [/openapi/*] [] [get] [/openapi] [] [get] [/version/] [] [get] [/version/] [] [get] [/version] [] [get] [/version] [] [get]

来点更有趣的,他们还能通过 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: 。想晓得某一 Service Account 的 username 能通过它的 yaml 文件来推算:

$ kubectl get serviceaccount unprivileged-service-account -o yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: "2019-07-23T17:44:31Z" name: unprivileged-service-account namespace: default resourceVersion: "98089" selfLink: /api/v1/namespaces/default/serviceaccounts/unprivileged-service-account secrets: - name: unprivileged-service-account-token-9cggz

通过将 verbs 表头的值选定为 impersonate,能让某一利用者保有其他利用者的权柄,即能演示其他利用者。好比,藏书楼员能接纳此功用通过暂时演示其他利用者并查看恳求与否被回绝来调试答应思绪。

好比,假设你想让非 Cluster Admin 账户可以演示其他利用者,能成立如下表所示的 ClusterRole:

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: impersonator rules: - apiGroups: [""] resources: ["users", "groups", "serviceaccounts"] verbs: ["impersonate"] 5. Kubectl Who Can

下面介绍的那款东西是 kubectl 的插件,插件名为 who-can,望文生义,用以显示哪些账户保有出访某一天然资本的权柄。安拆体例很简单,能通过 kubectl 的插件办理框架 Krew 来安拆:

安拆 krew。参照 https://github.com/kubernetes-sigs/krew/ 安拆 who-can: $ kubectl krew install who-can

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

$ kubectl who-can get secret cluster-admin-creds -n secure ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE unpriv_sa_binding secure unprivileged-service-account ServiceAccount secure CLUSTERROLEBINDING 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 > rback.dot

或者保留为 png:

$ kubectl get sa,roles,rolebindings \ -n monitoring -o json \ | rback | dot -Tpng > 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,看看能否施行一些不成描述的操做。步调如下表所示:

成立一个 Service Account。 $ kubectl create serviceaccount ncc-sa成立恰当的副角。 将 Role 与 Service Account 存取。 成立一个试验 Pod,serviceAccountName 选定为 ncc-sa。 进入该 Pod 验证与否具备 get pod 的权柄。 $ kubectl get pod 11. 总结

跟着软件财产情况愈来愈复杂,RBAC Role 与其相关天然资本第一类之间亲密关系的复杂性也会呈指数级增长。假设 Role 太多,那么运维人员可能很难选择准确的 Role,容易犯错;假设 Role 太少,运维人员可能会被迫选择默认的 Role,那会招致某些 Pod 权柄过大。所以他们必要找到一个平衡点,凡是的做法是通过 ansible 或 terraform 将某些摆设思绪笼统出来酿成模板,将 RBAC 思绪写到模板中,如许能大大减轻开发人员的压力。

微信公家号

扫一扫下面的二维码存眷微信公家号,在公家号中回复◉加群◉即可参加他们的云原生交换群,群里高手如云,张馆长、阳明大佬、kubesphere 核心奉献者都在哦

0
回帖 返回网络科技

那些用来审计 Kubernetes RBAC 战略的办法你都见过吗? 期待您的回复!

取消