使用RBAC在Kubernetes中配置权限

确保控制谁有权访问您的信息系统以及哪些用户有权访问是身份和访问管理系统的目标。它是安全管理中的基本过程之一,应予以彻底照顾。

在Kubernetes中,身份和用户管理未集成在平台中,应由外部IAM平台(如Keycloak,Active Directory,Google的IAM等)进行管理。但是,身份验证和授权由Kubernetes处理。

在本文中,我们将重点介绍Kubernetes中IAM的授权方面,更具体地说,是如何使用基于角色的访问控制模型来确保用户对正确的资源具有正确的权限。
先决条件

RBAC是Kubernetes 1.8的一项稳定功能。在本文中,我们将假定您正在使用Kubernetes 1.9+。我们还将假设通过--authorization-mode=RBACKubernetes API服务器中的选项在集群中启用了RBAC 。您可以通过执行命令进行检查kubectl api-versions;如果启用了RBAC,则应该看到API版本.http://rbac.authorization.k8s.io/v1。

Kubernetes中的RBAC概念概述

Kubernetes中的RBAC模型基于三个要素: 角色:定义每种Kubernetes资源类型的权限 主题:用户(人员或机器用户)或用户组 RoleBindings:定义哪些主体具有哪些角色 让我们探索这些元素如何工作。 在下面的示例中,您可以看到一个角色,该角色允许在名称空间“ mynamespace”中获取,列出和监视Pod:

kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: mynamespace  name: example-rolerules:- apiGroups: [""]  resources: ["pods"]  verbs: ["get", "watch", "list"]

为了给用户上一角色中描述的权限,必须创建一个RoleBinding。在下面的示例中,RoleBinding“ example-rolebinding”将角色“ example-role”绑定到用户“ example-user”:

kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: example-rolebinding  namespace: mynamespacesubjects:- kind: User  name: example-user  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: Role  name: example-role  apiGroup: rbac.authorization.k8s.io

应该注意的是,Roles和RoleBindings是命名空间的,这意味着只能为与Role和RoleBinding位于相同命名空间中的Kubernetes资源赋予权限。另外,不用说RoleBinding只能引用其命名空间中存在的Role。
角色,ClusterRoles,RoleBindings和ClusterRoleBindings

在前面的示例中,我们使用了Roles和RoleBindings。但是,也可以使用在以下情况下有用的ClusterRoles和ClusterRoleBindings:

授予非命名空间资源(如节点)的权限 为群集的所有命名空间中的资源授予权限 为非资源终结点(如/ healthz)授予权限 角色和角色绑定的群集范围版本的定义与非群集范围的版本非常相似。如果我们采用前面的示例并将其改编,我们将具有以下定义。ClusterRole:

kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: example-clusterrolerules:- apiGroups: [""]  resources: ["pods"]  verbs: ["get", "watch", "list"]

ClusterRoleBinding:

kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: example-clusterrolebindingsubjects:- kind: User  name: example-user  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: ClusterRole  name: example-clusterrole  apiGroup: rbac.authorization.k8s.io

如何在Roles和ClusterRoles中启用权限

在第一个示例中,我们向用户授予了获取,监视和列出Pod的基本权限。让我们探索不同资源和权限的其他可能性。 在下面的示例中,角色允许对部署资源执行任何操作:

kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: mynamespace  name: example-role-2rules:- apiGroups: ["extensions", "apps"]  resources: ["deployments"]  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

请注意,在这种情况下,apiGroups字段已用Deployment的API组填充。根据Kubernetes版本的不同,可以在API apps / v1或extensions / v1beta2中找到Deployment资源;API组是斜线之前的部分。 我们可以在一个Role中定义多个规则,如下面的示例所示:

rules:- apiGroups: [""]  resources: ["pods"]  verbs: ["get", "list", "watch"]- apiGroups: ["batch", "extensions"]  resources: ["jobs"]  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

在这种情况下,我们根据目标资源是Pod还是Job来授予不同的权限。 我们还可以通过其名称来定位资源,如以下示例所示:

rules:- apiGroups: [""]  resources: ["configmaps"]  resourceNames: ["my-config"]  verbs: ["get"]

如何将主题绑定到角色或ClusterRole

在第一个示例中,我们已经看到了如何将人类用户绑定到角色。但是,也有可能绑定服务帐户(非人类用户)或一组人类用户和/或服务帐户。 在下面的示例中,RoleBindingexample-rolebinding将ServiceAccount绑定example-s到Role example-role:

kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: example-rolebinding  namespace: mynamespacesubjects:- kind: ServiceAccount  name: example-sa  namespace: mynamespaceroleRef:  kind: Role  name: example-role  apiGroup: rbac.authorization.k8s.io

您可以使用以下命令创建ServiceAccount:

kubectl create serviceaccount example-sa --namespace mynamespace

在前面的RoleBinding定义中,我们还可以替换主题以绑定组。在下面的示例中,我们绑定frontend-admins组:

subjects:- kind: Group  name: "frontend-admins"  apiGroup: rbac.authorization.k8s.io

另一种可能性是绑定服务帐户组。在这里,我们将所有服务帐户绑定到mynamespace名称空间中:

subjects:- kind: Group  name: system:serviceaccounts:mynamespace  apiGroup: rbac.authorization.k8s.io

或群集中的所有服务帐户:

subjects:- kind: Group  name: system:serviceaccounts  apiGroup: rbac.authorization.k8s.io

关于Kubernetes中的RBAC的最后一件事

我们已经看到了如何使用基于角色的访问控制模型向用户或服务帐户授予权限。这是在Kubernetes中实现授权的一种有效方法,它可能是最受欢迎的一种,但它不是唯一可用的模型:您还可以使用其他模型,例如ABAC(基于属性的访问控制),Node Authorization模型和Webhook模式。我们将在更多文章中介绍这些内容,以及Kubernetes中的另一个IAM功能:身份验证。

很快见,保护您的群集并保持安全!

OK,到这里就结束了,感谢你的订阅云原生CTO,这里会分享更多高效干货云原生技能,欢迎继续关注

封面图及配图源自| 网络

©著作权归作者所有:来自51CTO博客作者wx5c1cfd6e22842的原创作品,如需转载,请注明出处,否则将追究法律责任

如果文章对你有帮助,请赞赏

赞赏

0人进行了赞赏支持

更多相关文章

  1. Jenkins Tips 001: 忽略 Shell 步骤中的故障
  2. 细粒度授权在安全领域的重要性
  3. SQL中的ALL、ANY和SOME的用法介绍
  4. Excel重大更新,VLOOKUP退役,新的搜索函数上线
  5. C语言字符串相关函数使用示例 strtok_r strstr strtok atoi
  6. 第10章 0222-重载,引用与命名空间,学心心得,笔记(属性、方法重载,命名
  7. grid项目对齐示例并用grid模拟bootstrap/layui的12列栅格布局组
  8. 2.32 Windows Server 2012 R2 iSCSI 角色安装
  9. 第3章 0127-常用运算与流程控制,学心得、笔记(表达式、三元运算与n

随机推荐

  1. Android中HTTP请求出现“Received authen
  2. 微信支付接口 For Android(安卓)上手指南
  3. android 注解简介三: 自定义注解实现视图
  4. Android ProgressDialog 最佳处理方式
  5. Android(安卓)dumpsys命令的使用
  6. Android App 开发经验总结
  7. Android 中Service生命周期
  8. android 学习 之 布局(下)LinearLayout,Rela
  9. 新安装Android(安卓)Studio遇到问题集合+
  10. android studio2.0解决办法 Plugin is to