kubernetes API 访问控制在阿里云容器服务(ACK)上的实践
提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供便捷的访问控制管理
访问控制简要说明
控制流程如上图所示,我们今天关注点在前两步,也就是图中的Authentication
和Authorization
Authentication
做的是身份校验,Authentication
支持的方法包括X509 Client Certs、Password、Plain Tokens、Bootstrap Tokens 和 JWT Tokens,今天我们要实践的就是X509 Client Certs校验方式
API server启动时传入--client-ca-file=SOMEFILE
即可启用证书校验,参数指定的文件中必须包含至少一个CA证书用于校验传入的客户端证书。
验证通过后,证书中的common name
(CN)字段会作为请求的username,organization
(O)字段作为请求的group
Authorization
做的是授权鉴定,一个请求通过Authentication
后,会带着一个user和group,Authorization
做的就是判断请求的方法(verb)和对象(object)是否在user和group的权限范围内;从1.8版本之后,RBAC模式进入stable状态,也是ACK默认启用的鉴权方式,RBAC模块会通过role/clusterrole和rolebinding/clusterrolebinding来鉴定请求所关联的user和group是否有操作的权限
下面我们通过操作来看下ACK上是如何做这些事的
环境准备
kubernetes
可以通过容器服务管理控制台非常方便地快速创建 Kubernetes 集群。具体过程可以参考这里
一个授予集群权限的子账号
子账号绑定的操作请参考这里
验证
我们按照上面的步骤操作,给子账号绑定default空间下的开发人员
角色
登录子账号,在集群
的详情页找到kubeconfig的信息,复制其中的user.client-certificate-data
字段,执行下面的命令
echo $CERTIFICATE | base64 -D > test.crt
openssl x509 -in test.crt -noout -text
会看到类似下面的输出
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 980377 (0xef599)
Signature Algorithm: sha256WithRSAEncryption
Issuer: O=cb4541f68933d4927b445b1eec47ce8b6, OU=default, CN=cb4541f68933d4927b445b1eec47ce8b6
Validity
Not Before: Apr 24 08:19:00 2019 GMT
Not After : Apr 23 08:24:49 2022 GMT
Subject: O=system:users, OU=, CN=232157355171679750
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
...
看证书的subject字段,O=system:users CN=232157355171679750
,表示使用这个证书作为身份校验的请求,在服务端看来,user是232157355171679750,group是system:users
接下来我们继续看这个user和group在集群中被赋予的权限
~ kubectl get rolebinding
NAME AGE
232157355171679750-default-rolebinding 10s
~ kubectl get rolebinding 232157355171679750-default-rolebinding -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
...
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cs:ns:dev
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: "232157355171679750"
可以看到user 232157355171679750被绑定了cs:ns:dev
这个集群角色,可以操作许多资源,但是都被限制在default这个namespace下(不能查看node,因为node是跨namespace的资源),因为给这个user绑定是通过rolebinding来做的,是受namespace的约束的(kubectl describe clusterrole cs:ns:dev即可看到这个子账号被授予的所有权限)
我们再给账号扩大一些权限,这次给他绑定整个集群的管理员
角色
然后我们就会发现刚才的rolebinding已经被删除了
~ kubectl get rolebinding
No resources found.
因为这次绑定是整个集群范围内的,所以产生的是clusterrolebinding
~ kubectl get clusterrolebinding
NAME AGE
232157355171679750-clusterrolebinding 3s
可以用上面的方法继续查看集群管理员
角色下的所有权限
但是集群管理员并不是权限最高的角色,权限最高的角色是自定义列表中的cluster-admin
,这是kubernetes集群启动后内置的角色,也是主账号创建集群后生成的config文件中绑定的角色
角色和权限的选择
既然kubernetes中内置了许多的role和clusterrole,那我们该如何选择呢?又如何判断当前的角色是否满足了需求呢?
还好kubectl已经提供了对应的命令来帮助我们快速判断权限是否充分
kubectl auth can-i <verb> <resource> [<resourceName>]
我们还是以一个被绑定了集群管理员
的角色为例,下面的kubectl命令均是使用了对应的config文件
~ kubectl auth can-i delete no
yes
~ kubectl auth can-i drain no
no - no RBAC policy matched
~ kubectl auth can-i taint no
no - no RBAC policy matched
~ kubectl auth can-i cordon no
no - no RBAC policy matched
~ kubectl auth can-i label no
no - no RBAC policy matched
~ kubectl auth can-i delete pv
yes
~ kubectl auth can-i delete pvc
yes
我们看到这个角色的可以删除node
、pv
和pvc
,但是不能对node
做drain
,taint
,cordon
,label
,可以利用这个工具快速定位操作失败是否和权限有关
总结
ACK将阿里云上的子账号系统和kubernetes本身的访问控制非常平滑的连接在一起,对用户非常友好,不需要花太多的精力在RBAC的细节上,极大的降低了使用门槛
本文作者:布帆
本文为云栖社区原创内容,未经允许不得转载。
kubernetes API 访问控制在阿里云容器服务(ACK)上的实践的更多相关文章
- 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署
部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...
- 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...
- 阿里云容器服务中国最佳,进入 Forrester 报告强劲表现者象限
近日,全球知名市场调研机构 Forrester 发布首个企业级公共云容器平台报告. 报告显示:阿里云容器服务创造了中国企业最好成绩,与谷歌云位于同一水平线,进入强劲表现者象限. 究其原因,分析师认为: ...
- 阿里云容器服务通过LoadBalancer暴露IPv6服务
背景: IPv4地址已接近枯竭,被誉为下一代互联网技术的IPv6成为新的“全球互联网门牌号”,它可以让地球上的每一粒沙子都拥有地址.当下,各国都在加速推进下一代互联网的部署,工信部也互联网服务商提出了 ...
- 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序
小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...
- 阿里云容器服务--配置自定义路由服务应对DDOS攻击
阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...
- 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json
这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json ...
- 品尝阿里云容器服务:用nginx镜像创建容器,体验基于域名的路由机制
在前一篇博文中我们了解了阿里云容器服务的路由机制: 请求 -> 负载均衡80端口 -> 容器主机9080端口 -> acsrouting路由容器80端口 --基于域名--> W ...
随机推荐
- python禁止函数修改列表的实现方法
python禁止函数修改列表的实现方法 有时候,需要禁止函数修改列表.例如要对裂变进行修改操作,也要保留原来的未打印的设计列表,以供备案.为解决这个问题,可向函数传递列表的副本而不是原件:这样函数所做 ...
- Python执行时间的计算方法小结
Python执行时间的计算方法小结 首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计的程序执行时间. 监控p ...
- ORACLE时间常用函数(字段取年、月、日、季度)
TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal tw ...
- gin入门-1
Gin框架介绍 1. 简介Gin框架介绍A. 基于httprouter开发的web框架.http://github.com/julienschmidt/httprouterB. 提供Martini风格 ...
- beego应用做纯API后端如何使用jwt实现无状态权限验证
jwt是什么,可以百度下其它文章,我原来看到一个讲的详细的,现在找不到了.先简单介绍下我个人的理解,就是一个token,只不过通过加密解密的手段,能让这一串字符带有一些简单的信息.这样解密jwt后不用 ...
- java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)V
昨天用的好好的,今天就不行了 也懒得搞 具体原因就是引用的问题 找了个能用的pom 直接贴过去完事儿
- pstree进程管理
功能:pstree命令列出当前的进程,以及它们的树状结构. 格式:pstree [选项] [pid|user] 主要选项如下: -a:显示执行程序的命令与完整参数. -c:取消同名程序,合并显示. - ...
- golang学习资料必备
核心资料库 https://github.com/yangwenmai/learning-golang
- 微信小程序--轮播图,标题,盒子,tab栏的合成例子
小程序是什么? 微信小程序,是一种不需要下载安装即可使用的应用,用户扫一扫或搜一下即可打开应用,在微信-发现-小程序可打开应用. 一.小程序的样式编写: 目录结构: app.json { " ...
- Python3 中 configparser 使用注意事项
在使用configparser时候应注意: ①配置文件(ini文件)的存放位置:配置文件和调用文件放在同一个文件包下面. 使用read()函数读取并解析配置文件时,直接写配置文件(ini文件)的文件名 ...