老菜_misa
作者老菜_misa·2023-11-22 09:40
123·123

Azure AKS权限管理

字数 9590阅读 546评论 0赞 4

在Azure AKS集群运维和应用运维场景中,通常会有多个角色,并需要对不同的角色进行授权,后文针对几种常用的角色进行授权示例。

AKS使用Azure AD作为身份认证有两种模式,Azure AD Authentication with Kubernetes RBAC 和Azure AD Authentication with Azure RBAC。将在这两种模式下,对几种角色进行授权测试验证。

在进行授权时,所使用的管理员账号需要是Azure 订阅的Owner或者 并具备AKS的Cluster admin 权限。此处使用我个人账户,已具备此权限。

后续步骤将在AD域中创建个测试账号,也可以创建组,把对应用户加到组里就行。
集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。
应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。
项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。
项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。
以上权限,角色不光要在命令行中可以执行对应权限,也要在portal上能查看对应资源。

注意:
两种认证模式切换前,对所有的自定义role,clusterrole及rolebinding,clusterrolebinding进行备份。

### 1. 创建AD域账户

 AAD_PW = Laocai@2023
 az  ad  user  create  --display-name  "clusteradmin1"  --user-principal-name  clusteradmin1@3162003qq.onmicrosoft.com  --password  $AAD_PW
 az  ad  user  create  --display-name  "appadmin1"  --user-principal-name  appadmin1@3162003qq.onmicrosoft.com  --password  $AAD_PW
 az  ad  user  create  --display-name  "projectadmin1"  --user-principal-name  projectadmin1@3162003qq.onmicrosoft.com  --password  $AAD_PW
 az  ad  user  create  --display-name  "projectreader1"  --user-principal-name  projectreader1@3162003qq.onmicrosoft.com  --password  $AAD_PW

如果需要创建组,并把用户添加到组里,按照这个方法

 az  ad  group  create  --display-name  grp-appadm  --mail-nickname  grp-appadm
 GRP_APPADM_ID = $( az ad group list --display-name grp-appadm --query [].id -o tsv)
 # 查询appadmin1的id
 APPADM_ID = $( az ad user list --display-name "appadmin1" --query [].id -o tsv)
 # 把user appadmin1 添加到组 grp-appadm
 az  ad  group  member  add  --group  grp-appadm  --member-id  $APPADM_ID

 # 记下组的id,后续如果要对组授权,使用id作为对象
[root@ffffcentos ~]# echo $GRP_APPADM_ID
 1caa8c26-fbce-4c55-9a19-0adb0a82f79c

在az role assignment 或者Kubernetes RBAC 对组进行授权时,使用的组的id,比如1caa8c26-fbce-4c55-9a19-0adb0a82f79c。
对用户授权时候,使用的 userPrincipalName ,就是创建用户时候的参数--user-principal-name 的值 appadmin1@3162003qq.onmicrosoft.com

### 2. AKS环境准备

创建一个AKS, Authentication and Authorization 设定为 Azure AD Authentication with Kubernetes RBAC。
配置可以选低一点,节点size B2ms,数量1。其他默认即可。

记录下AKS ID

 AKS_ID = $( az aks show --resource-group RG-cf-demo --name aks-test --query id -o tsv)

### 3. 应用环境准备

管理员创建namespace和nginx deployment

 kubectl  create  namespace  mobile
 kubectl  -n  mobile  create  deploy  front  --image=nginx  --replicas=2  --port=80
 kubectl  -n  mobile  expose  deploy  front

查看资源已创建

[root@ffffcentos ~]# kubectl -n mobile get all
 NAME  READY  STATUS  RESTARTS  AGE
 pod/front-c95584cb9-9nl9g  1 /1  Running  0  36 s
 pod/front-c95584cb9-h54z5  1 /1  Running  0  36 s

 NAME  TYPE  CLUSTER-IP  EXTERNAL-IP  PORT ( S ) AGE
 service/front  ClusterIP  10.0 .171.168 < non e> 80 /TCP  4 s

 NAME  READY  UP-TO-DATE  AVAILABLE  AGE
 deployment.apps/front  2 /2  2  2  37 s

 NAME  DESIRED  CURRENT  READY  AGE
 replicaset.apps/front-c95584cb9  2  2  2  37 s

### 4. 基于Kubernetes RBAC授权

授权集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。

授予AKS的 Contributor 权限

授予AKS 二级资源组Contributor 权限,在Properties — Infrastructure resource group 查看,默认名是MC_RG开头,如MC_RG-cf-demo_aks-test_westus2。此资源组下是AKS的虚拟机规模集,路由表,负载均衡等信息。

 az  role  assignment  create  --assignee  clusteradmin1@3162003qq.onmicrosoft.com  --role  "Contributor"  --scope  $AKS_ID

 az  role  assignment  create  --assignee  clusteradmin1@3162003qq.onmicrosoft.com  --role  "Contributor"  --scope  /subscriptions/3c398848-b31e-427a-aa4e-3b87b2ae6064/resourceGroups/MC_RG-cf-demo_aks-test_westus2

授权集群管理能力

 kubectl  create  clusterrolebinding  rb-clusteradmin1  --clusterrole=cluster-admin  --user=clusteradmin1@3162003qq.onmicrosoft.com

以上,clusteradmin1 已经具备了集群管理的能力,可以修改集群配置,扩容节点。重建pod,或者是删除应用。

授权应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  appadmin1@3162003qq.onmicrosoft.com  --role  "Reader"  --scope  $AKS_ID

授权应用管理能力


 kubectl  create  clusterrolebinding  rb-appadmin1  --clusterrole=admin  --user=appadmin1@3162003qq.onmicrosoft.com

可以变更应用,比如删除pod。但是不能变更集群配置,比如扩容节点。

授权项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  projectadmin1@3162003qq.onmicrosoft.com  --role  "Reader"  --scope  $AKS_ID

授权项目应用管理能力

 kubectl  -n  mobile  create  rolebinding  rb-projectadmin1  --clusterrole=admin  --user=projectadmin1@3162003qq.onmicrosoft.com

 # 正常情况下,如果 projectadmin1 通过命令行访问aks,上面的步骤已经足够了。
 # 如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
 # 不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
 kubectl  create  clusterrole  ns-reader  --verb=get,list,watch  --resource=namespaces
 kubectl  create  clusterrolebinding  rb-projectadmin1-2  --clusterrole=ns-reader  --user=projectadmin1@3162003qq.onmicrosoft.com

授权ns-reader前

授权ns-reader后,能看到所有namespace,但是mobile namespace 之外的deployment,pod是无法查看的

可以查看、编辑mobile namespace下资源

授权项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。

和上面项管理员类似,clusterrole ns-reader 已存在,就不用再次创建了。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  projectreader1@3162003qq.onmicrosoft.com  --role  "Reader"  --scope  $AKS_ID

授权项目应用查看能力,使用现成的role为view

 kubectl  -n  mobile  create  rolebinding  rb-projectreader1  --clusterrole=view  --user=projectreader1@3162003qq.onmicrosoft.com

 # 正常情况下,如果 projectadmin1 通过命令行访问aks,上面的步骤已经足够了。
 # 如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
 # 不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
 # clusterrole ns-reader 之前已经创建过了
 kubectl  create  clusterrolebinding  rb-projectreader1-2  --clusterrole=ns-reader  --user=projectreader1@3162003qq.onmicrosoft.com

登录portal,确认只具备mobile namespace权限,且为只读

### 5. 基于Azure RBAC授权

Azure RBAC和Kubernetes RBAC之间切换,先把role,rolebinding,clusterrole,clusterrolebinding做备份,切换可能丢失。

直接在portal上AKS—Cluster configuration 中修改成 Azure AD authentication with Azure RBAC

删除之前的授权,重新进行测试,或者重建一个AKS集群。

授权集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。

直接使用Azure自带的role,这两个操作也可以在portal上面操作

 # 授权AKS管理权限
 az  role  assignment  create  --assignee  clusteradmin1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service Cluster Admin Role"  --scope  $AKS_ID
 # 授权应用管理权限
 az  role  assignment  create  --assignee  clusteradmin1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service RBAC Cluster Admin"  --scope  $AKS_ID

授权应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  appadmin1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service Cluster User Role"  --scope  $AKS_ID

授权应用管理能力,此角色不能删除或修改quota及namespace

 az  role  assignment  create  --assignee  appadmin1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service RBAC Admin"  --scope  $AKS_ID

授权项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  projectadmin1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service Cluster User Role"  --scope  $AKS_ID

授权项目应用管理能力

 # 授权单个namespace权限,这一步只能通过命令,无法在portal上操作。在AKS_ID后面接namespace,示例如下
 az  role  assignment  create  --role  "Azure Kubernetes Service RBAC Admin"  --assignee  projectadmin1@3162003qq.onmicrosoft.com  --scope  $AKS_ID /namespaces/mobile

linux 使用一个新用户, az login 登录projectadmin1@3162003qq.onmicrosoft.com ,并连接到aks,测试权限

[caifeng@ffffcentos ~]$ kubectl get po -n mobile
 NAME  READY  STATUS  RESTARTS  AGE
 front-c95584cb9-pb529  1 /1  Running  0  12 h
 front-c95584cb9-tkgd8  1 /1  Running  0  12 h
[caifeng@ffffcentos ~]$ kubectl -n mobile delete po front-c95584cb9-pb529
 pod  "front-c95584cb9-pb529"  deleted

[caifeng@ffffcentos ~]$ kubectl get ns
 Error  from  server (Forbidden): namespaces is forbidden: User "projectadmin1@3162003qq.onmicrosoft.com" cannot list resource "namespaces"  in API group "" at the cluster scope: User does not have access to the resource in Azure. Update role assignment to allow access.

和之前Kubernetes RBAC时一样,只具备单一namespace的权限,无法get namespace,但在命令行通过操作mobile namespace下资源是没问题的。
如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
需要创建一个新的Aure role并授权

 # 这步用管理员权限做
 # 创建一个新的role, namespace-reader.json
 # role 生效的范围是订阅,本订阅内其他aks也可以使用这个role

{
 "Name" :  "AKS Namespace Reader",
 "Description" :  "Lets you view all namespace in cluster.",
 "Actions" : [],
 "NotActions" : [],
 "DataActions" : [
 "Microsoft.ContainerService/managedClusters/namespaces/read"
],
 "NotDataActions" : [],
 "assignableScopes" : [
 "/subscriptions/3c398848-b31e-427a-aa4e-3b87b2ae6064"
]
}

 # 把这个role 授权给用户,范围是AKS,不要带namespace
 az  role  assignment  create  --role  "AKS Namespace Reader"  --assignee  projectadmin1@3162003qq.onmicrosoft.com  --scope  $AKS_ID

使用projectadmin1@3162003qq.onmicrosoft.com 登录portal 测试mobile namespace权限。

授权项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。

和上面项管理员类似,AKS Namespace Reader 已存在,就不用再次创建了。

授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用

 az  role  assignment  create  --assignee  projectreader1@3162003qq.onmicrosoft.com  --role  "Azure Kubernetes Service Cluster User Role"  --scope  $AKS_ID

授权项目应用管理能力

 # 授权单个namespace权限,这一步只能通过命令,无法在portal上操作。在AKS_ID后面接namespace,示例如下
 az  role  assignment  create  --role  "Azure Kubernetes Service RBAC Reader"  --assignee  projectreader1@3162003qq.onmicrosoft.com  --scope  $AKS_ID /namespaces/mobile

 # 授权namespace read 权限,范围是AKS,不要带namespace
 az  role  assignment  create  --role  "AKS Namespace Reader"  --assignee  projectreader1@3162003qq.onmicrosoft.com  --scope  $AKS_ID

以上k8s role都采用了系统自带的,也可以自己定义role的范围。

如果是Azure Role,可以在portal上选择一个已有role,点击后面的clone复制出来一个进行修改。或者见上面自己创建一个role-definition的文件导入进去,role的定义方法可以参照portal上现有的role json。

### 参考文档

https://learn.microsoft.com/en-us/azure/aks/manage-azure-rbac

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论0 条评论

Ctrl+Enter 发表

相关资料

X社区推广