千家信息网

审计Kubernetes RBAC策略的方法是什么

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,本篇内容介绍了"审计Kubernetes RBAC策略的方法是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2024年11月30日审计Kubernetes RBAC策略的方法是什么

本篇内容介绍了"审计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/v1kind: ClusterRolemetadata:  name: secret-readerrules:- 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: v1kind: ServiceAccountmetadata:  name: helm  namespace: helm-world---apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:  name: tiller-user  namespace: tiller-worldrules:- apiGroups:  - ""  resources:  - pods/portforward  verbs:  - create- apiGroups:  - ""  resources:  - pods  verbs:  - list---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  name: tiller-user-binding  namespace: tiller-worldroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: tiller-usersubjects:- 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 podsyes

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

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

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

$ kubectl auth can-i --list --namespace=secureResources                                       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-accountyes

--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 yamlapiVersion: v1kind: ServiceAccountmetadata:  creationTimestamp: "2019-07-23T17:44:31Z"  name: unprivileged-service-account  namespace: default  resourceVersion: "98089"  selfLink: /api/v1/namespaces/default/serviceaccounts/unprivileged-service-accountsecrets:- name: unprivileged-service-account-token-9cggz

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

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

apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:  name: impersonatorrules:- apiGroups: [""]  resources: ["users", "groups", "serviceaccounts"]  verbs: ["impersonate"]

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-NAMESPACEunpriv_sa_binding      secure          unprivileged-service-account          ServiceAccount  secureCLUSTERROLEBINDING     SUBJECT             TYPE            SA-NAMESPACEcluster-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-viewserving 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

"审计Kubernetes RBAC策略的方法是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

权限 资源 审计 账户 方法 用户 安全 命令 集群 控制 输出 策略 可以通过 对象 文档 更多 参考 攻击 信息 原则 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 亚信安全代理服务器 地址 oa 备份数据库怎么导入 宁夏态势推演系统软件开发 网络安全员培训补贴政策 一些关于网络安全的例子 网络安全保障工作会 典型发言 周村计划软件开发公司 怎么用电脑做虚拟服务器 网络安全工程师岗位技能要求 滨海新区媒体网络技术售后服务 简单商城数据库设计 员工合同软件开发 同望软件开发商 服务器远程管理配置java 中国对网络安全有什么措施 服务器ssd硬盘能插几个 吉林市汇商网络技术有限公司 服务器的mac地址是由 服务器手机管理工具软件 软件开发工作能力考核 普陀区无线网络技术常见问题 北京大玩家网络技术有限公司 为什么电脑上不了网络服务器 软通动力新员工网络安全 http代理服务器过滤设置 数学软件开发概述 安徽速速花网络技术有限公司 国际版mc基岩版服务器 财务数据库如何恢复 山东gps同步子母钟服务器
0