写点什么

玩转 Kubernetes 权限控制 AuthN/Z

  • 2020-03-04
  • 本文字数:2961 字

    阅读完需:约 10 分钟

玩转 Kubernetes 权限控制 AuthN/Z

摘要

AuthN/Z 是系统设计中相当重要的一环,它在很大程度上决定了 Kubernetes 能否成为一个企业级的解决方案。然而,严格的权限管理也给 Kubernetes 的使用带来了一定的麻烦,大大提高了 Kubernetes 的入门门槛。


本文旨在帮助大家系统地认识 Kubernetes 的 AuthN/Z 的功能和实现。希望大家在部署和使用 Kubernetes 的过程中不会掉入权限的泥沼。

Kubernetes AuthZ/N 系统简介

首先简单介绍一下 AuthN/Z 的异同及在 Kubernetes 内的实现。AuthN 系统主要用于认证 (Authentication),决定谁访问了系统。AuthZ 系统主要用于授权 (Authorization),决定访问者具有什么样的权限。


在 Kubernetes 系统中,AuthN 完成了用户的认证并且获取了用户的相关信息(如 Username,Groups 等)。而 AuthZ 则根据这些信息匹配预定义的权限规则,然后决定某个 API 请求是否被允许。

AuthN 系统

Kubernetes 的 AuthN 系统主要完成了以下工作:


  • 根据配置验证用户凭证,通常是 Bearer Token 或者 Basic Auth Password。

  • 解析用户信息,包括 Username,Groups,Uid 等。这些信息将用于之后的 Authz 系统授权。


X509 Client Certs —— Client Certs 模式


通过传入 --client-ca-file 到 Apiserver 开启。其中证书的 /CN (common name)表示用户名,/O (organization)表示 Groups。


Client Cert 模式通常用于某些受信任的组件访问 Apiserver,如 Kubernetes 各个组件访问 Apiserver。


Static Token File —— 静态 Token 文件模式


通过传入 --token-auth-file 到 Apiserver 开启。以下是其中一条记录的模版。HTTP 请求在 Header 中传入 Authorization: Bearer Token 来认证。



Static Password File —— 静态 Password 文件模式


通过传入 --basic-auth-file 到 Apiserver 开启。以下是其中一条记录的模版。HTTP 请求在 Header 中传入 Authorization:Basicbase64(user:password)来认证。



Service Account Tokens


Service Account Token 主要是用来给 Pod 提供访问 Apiserver 的权限。当 Pod 通过 Service Account 访问 Apiserver 时,用户名为 system:serviceaccount: (NAMESPACE):(SERVICEACCOUNT),并且属于 system: serviceaccounts 和 system: serviceaccounts:(NAMESPACE) 这两个 Group。当一个 Pod 使用 InClusterConfig 创建 Client 访问 Apiserver 时,Client 会自动载入 Service Account 的 Token。


OIDC Token


OIDC 是除了 WebHook 外 Kubernetes 提供的唯一一个动态的 AuthN 方案。相比较于上面几种方案的小打小闹,OIDC 提供了标准的 AuthN 流程,真正能够作为 Kubernetes 系统用户认证的企业级解决方案。


OpenID Connect 协议是基于 Oauth2.0 协议之上的一个认证协议。OIDC 的认证流程跟 Oauth2.0 类似,不过除了返回 access_token 以外还返回了 id_token。Kubernetes 使用 id_token 来认证用户。OIDC 协议中的 id_token 根据 JWT (Json Web Token) 协议标准实现。Kubernetes 通过 id_token 的 Claim 获取用户信息。比如 Groups, Username 等。


以下是 OIDC 认证的流程:



图片来自https://kubernetes.io/docs/admin/authentication


Apiserver 需要配置以下参数:




为了防止不同的 Issuer 导致的用户名冲突,当 --oidc-username-claim 取值不是 Email 时,AuthZ 所使用的真正的用户名会加上 Issuer 前缀,如下所示:


不过 1.8 后添加了 Claim Prefix 的参数 --oidc-username-prefix 和 --oidc-groups-prefix,显然上面这种丑陋的格式总是会让人很不高兴。


Webhook


当你需要外接一个用户系统的时候,你总是需要一个 Webhook。


通过传入 --authentication-token-webhook-config-file 开启,另外还要添加


–runtime-config=authentication.k8s.io/v1beta1=true。


Webhook 的配置文件如下:



Webhook Service 需要实现 TokenReview 的接口:


AuthZ 系统

Kubernetes 的 AuthZ 系统主要完成了以下几件事情:


  • 解析 HTTP 请求,获取请求的各种属性

  • 根据属性和 AuthN 获取的用户信息,依次匹配 AuthZ 规则,如果成功则通过,如果全部失败则返回禁止访问。


不同于 AuthN 方案,AuthZ 方案在 Kubernetes 中和其 API 风格有相当大的关联。由于严格遵循 RESTful 标准定义 API,Kubernetes 在提取 HTTP 请求属性和定义 AuthZ 规则等方面有了极大的便利。


AuthZ 系统的核心接口如下:


(/apiserver/pkg/authorization/authorizer/interfaces.go)



每一个 http 请求都会创建一个 Attributes,从该接口的定义可以发现,Kubernetes 将 http 请求的 Path 参数解析并分解成 APIGroup, APIVersion 等属性。然后 Authorizer 根据这些属性匹配对应的规则完成 Authz。


下面是 Kubernetes 提供的两种 AuthZ 方案 —— ABAC 和 RBAC。


ABAC


ABAC 全称 Attribute Based Access Control(基于属性的访问控制)。通过 --authorization-mode=ABAC 开启,并且通过 --authorization-policy-file 指定策略文件。


以下是 ABAC 的一条记录的例子:



可以发现 ABAC 定义的字段基本上就是来自于上述的 Attributes 接口能够获取的信息。另外值得一提的是 Kubernetes 中的 ABAC 没有动态方案,修改策略文件后必须重启 Apiserver。


RBAC


RBAC 全称 Role Based Access Control(基于角色的访问控制), 通过 --authorization-mode=RBAC 开启。


目前和 RBAC 相关的 Resource 有以下 4 种:


  • Role

  • RoleBinding

  • ClusterRole

  • ClusterRoleBinding



Role 和 RoleBinding 是 NameSpace 下的资源,而 ClusterRole 和 ClusterRoleBinding 是系统级的资源。1.8 后 RBAC 所属的资源已经从 v1beta1 升级到 v1。


Role


Role 的例子如下:



ClusterRole


ClusterRole 的例子如下:



ClusterRole 可以用来定义全局的 Resource。当使用 ClusterRoleBinding 绑定时,表示能访问所有 NameSpace 下的资源(如上述的 secrets),当使用 RoleBinding 绑定时,表示只能访问 RoleBinding 所属的 NameSpace 下的资源。


RoleBinding


RoleBinding 的例子如下:



RoleBinding 负责绑定 Subjects 和某一个 Role 或者 ClusterRole。


ClusterRoleBinding


ClusterRoleBinding 的例子如下:



ClusterRoleBinding 能够绑定 Subjects 和 ClusterRole。


Subjects


Subjects 分为以下 3 种类型,Subjects 来自于 AuthN 的结果。


  • User

  • Group

  • ServiceAccount


Webhook


AuthZ 系统也可以通过 Webhook 实现。不过比起 AuthN,AuthZ 系统通常没有必要使用 Webhook。


通过传入 --authorization-webhook-config-file 开启,另外还要添加


–runtime-config=authorization.k8s.io/v1beta1=true。


Webhook 的配置文件如下:



Webhook Service 需要实现 SubjectAccessReview 的接口

总结

Kubernetes 的 AuthN 系统主要是认证用户并获取用户对应的 Subject。比如 User,Group,ServiceAccount。而 AuthZ 系统主要是根据用户的 Subject 和 http 请求获取的属性依次匹配定义的规则(ABAC 或 RBAC)。


目前而言 Kubernetes 的 RBAC 系统能够较好的处理大部分的授权问题,不过也有一定的缺点,比如只能定义用户是否有 LIST 资源的权限,而无法定义用户 LIST 一部分资源的权限。在真正使用 Kubernetes 的 AuthZ 系统的时候建议以 NameSpace 为粒度做权限控制。


作者介绍:刘搏,才云科技平台软件工程师,毕业于浙江大学,加入才云后先后从事 Kubernetes 监控和权限相关的工作。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/QQut02_NdrkKYOYP5-mKsw


2020-03-04 21:401286

评论

发布
暂无评论
发现更多内容

如何实现千万级优惠文章的优惠信息同步

京东科技开发者

redis 企业号 1 月 PK 榜 信息同步 伸缩任务 任务检测

视频发布失败原因不好找?火山引擎数智平台这款产品能帮忙

字节跳动数据平台

大数据 增长 用户分析

「Go框架」路由中间件:为什么能够在目标函数前后运行?

Go学堂

golang 开源 程序员 个人成长 框架学习

除了Navicat破解版、DBeaver,免费还好用的数据库管理工具/SQL工具还有推荐吗?

雨果

sql navicat 数据库管理工具 Dbeaver SQL开发工具

镜像拉取节省 90% 以上,快手基于 Dragonfly 的超大规模分发实践

OpenAnolis小助手

开源 架构 快手 龙蜥技术 容器云平台

RCC目前最近技术与今后发展

华秋PCB

PCB PCB设计 HDI 生产工艺 RCC

iMazing2023免费版iOS设备管理软件

茶色酒

iOS设备管理软件

委派模式——从SLF4J说起

vivo互联网技术

Java slf4j 委派模式

Java高手速成 | JSP MVC模式项目案例

TiAmo

mvc java; jsp

基于Spring Cache实现Caffeine、jimDB多级缓存实战

京东科技开发者

spring 缓存 接口 系统 企业号 1 月 PK 榜

如果在冬夜,你是一位新能源旅人

脑极体

新能源 领克 混动

预测本年度 10 大薪酬最高的 IT 技术工种!

风铃架构日知录

程序员 互联网 后端 IT

名单揭晓!OpenMLDB 获评 2022 年度中国开源社区健康案例

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

架构训练营模块五作业

张Dave

C++实现惰性求值

SkyFire

c++ 函数式编程 模板元编程

使用启科QuPot+Runtime+QuSaaS进行量子应用开发及部署-调用AWS Braket计算后端

启科量子开发者官方号

量子计算 Amazon Braket

企业用好WMS(仓库管理系统),需要注意的几个要点

SAP虾客

WMS系统 ERP系统 RFID

NFTScan 与 MAY 达成战略伙伴关系,双方在元宇宙 NFT 数据方面进行深度合作!

NFT Research

NFT 元宇宙

编程技术面试的7个英文网站,你知道几个?

风铃架构日知录

Java 技术 面试 后端 技能提升

CleanMyMac X4.12.4macO设备管理器

茶色酒

CleanMyMac CleanMyMac X

架构实战营模块四作业

西山薄凉

「架构实战营」

5 个 JavaScript 代码优化技巧

devpoint

JavaScript 前端开发 JS代码优化 扩展运算符

OpenStack的“神秘组件” 裸金属(Ironic)管理使用

统信软件

OpenStack 服务管理 裸金属

《“鼎新杯”数字化转型应用案例汇编》正式发布(含107个案例)

信通院IOMM数字化转型团队

数字化转型 ICT深度观察

Go语言DDD实战初级篇

百度Geek说

Go 数据库 微服务 企业号 1 月 PK 榜

电商秒杀系统架构设计

π

架构实战营

真相了!TCP连接原来是这么被墙干掉的!

程序员小毕

程序员 后端 网络协议 架构师 tcpip

CRC工业精密电器清洁剂,硬核技术护航清洁产业发展

科技热闻

秒杀场景下的业务梳理——Redis分布式锁的优化

小小怪下士

Java redis 分布式

OpenYurt v1.2 新版本深度解读(一): 聚焦边云网络优化

阿里巴巴云原生

阿里云 开源 云原生 openyurt

Verilog HDL行为级建模

timerring

FPGA

玩转 Kubernetes 权限控制 AuthN/Z_行业深度_才云科技_InfoQ精选文章