kubernetes API 访问控制在阿里云容器服务(ACK)上的实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供便捷的访问控制管理 访问控制简要说明 控制流程如上图所示,我们今天关注点在前两步,也就是图中的Au.

提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供便捷的访问控制管理

访问控制简要说明

访问控制
控制流程如上图所示,我们今天关注点在前两步,也就是图中的AuthenticationAuthorization

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空间下的开发人员角色rbac_1

登录子账号,在集群的详情页找到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即可看到这个子账号被授予的所有权限)

我们再给账号扩大一些权限,这次给他绑定整个集群的管理员角色rbac_2

然后我们就会发现刚才的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

我们看到这个角色的可以删除nodepvpvc,但是不能对nodedraintaintcordonlabel,可以利用这个工具快速定位操作失败是否和权限有关

总结

ACK将阿里云上的子账号系统和kubernetes本身的访问控制非常平滑的连接在一起,对用户非常友好,不需要花太多的精力在RBAC的细节上,极大的降低了使用门槛

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
11天前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
22 10
|
11天前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
|
11天前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
|
11天前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
1月前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
26天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
61 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
6天前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
25天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
93 23
|
26天前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
86 21
|
23天前
|
JSON API 数据格式
eBay商品详情接口(ebay API系列)
eBay 商品详情接口是电商从业者、开发者和数据分析师获取商品详细信息的重要工具,涵盖标题、价格、库存、卖家信息等。使用前需在 eBay 开发者平台注册并获取 API 凭证,通过 HTTP GET 请求调用接口,返回 JSON 格式数据。Python 示例代码展示了如何发送请求并解析响应,确保合法合规使用数据。
57 12

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多