如何通过Azure RBAC限制AKS dev命名空间内指定2个Secret的访问?
如何通过Azure RBAC限制AKS中指定Secret的访问权限
在已启用Azure RBAC、未使用Kubernetes RBAC的AKS集群中,要限制dev命名空间内2个特定Secret的访问权限,可通过以下两种精准控制方案实现:
方案一:使用Azure RBAC拒绝分配(快速限制)
拒绝分配的权限优先级高于所有允许权限,适合快速阻止特定用户/组访问目标Secret:
获取目标Secret的Azure资源ID
执行Azure CLI命令,替换占位符获取单个Secret的资源ID:az resource list --resource-group <你的AKS资源组名> \ --namespace Microsoft.ContainerService \ --resource-type managedClusters/namespaces/secrets \ --query "[?name=='<受限Secret名称>'].id" -o tsv重复执行获取第二个受限Secret的资源ID。
创建拒绝分配
针对需要限制的用户/组,创建拒绝其读取目标Secret的分配:az role assignment create --assignee <用户/组的主体ID或UPN> \ --role "Kubernetes Secret Reader" \ --scope <第一步获取的Secret资源ID> \ --deny对第二个受限Secret重复此命令。
方案二:自定义Azure角色(细粒度权限管控)
如果需要更灵活的权限划分(比如允许大部分用户访问8个Secret,仅特定用户访问2个受限Secret),可通过自定义角色实现:
步骤1:创建排除受限Secret的自定义角色
创建一个JSON文件(例如dev-secrets-reader-exclude.json),内容如下,替换占位符:
{ "Name": "Dev Secrets Reader (Exclude Restricted)", "IsCustom": true, "Description": "允许读取dev命名空间内除指定2个Secret外的所有Secret", "Actions": [ "Microsoft.ContainerService/managedClusters/namespaces/secrets/read" ], "NotActions": [], "AssignableScopes": [ "/subscriptions/<你的订阅ID>/resourceGroups/<你的AKS资源组名>/providers/Microsoft.ContainerService/managedClusters/<你的AKS集群名>/namespaces/dev" ], "Condition": "!(Microsoft.ContainerService/managedClusters/namespaces/secrets/name in ['<受限Secret1名称>', '<受限Secret2名称>'])" }
执行命令创建自定义角色:
az role definition create --role-definition dev-secrets-reader-exclude.json
步骤2:分配自定义角色给普通用户
将该角色分配给需要访问大部分Secret的用户/组:
az role assignment create --assignee <用户/组的主体ID或UPN> \ --role "Dev Secrets Reader (Exclude Restricted)" \ --scope "/subscriptions/<你的订阅ID>/resourceGroups/<你的AKS资源组名>/providers/Microsoft.ContainerService/managedClusters/<你的AKS集群名>/namespaces/dev"
步骤3:单独授权受限Secret的访问权限
对需要访问2个受限Secret的特定用户,分配内置的Kubernetes Secret Reader角色到单个Secret:
az role assignment create --assignee <授权用户的主体ID或UPN> \ --role "Kubernetes Secret Reader" \ --scope <受限Secret1的资源ID>
对第二个受限Secret重复此命令。
权限验证
使用被限制用户的身份登录后,执行kubectl命令验证权限:
# 尝试访问受限Secret,应返回权限不足错误 kubectl get secret <受限Secret名称> -n dev # 尝试访问普通Secret,应能正常获取 kubectl get secret <普通Secret名称> -n dev
内容的提问来源于stack exchange,提问作者Arockia Daniel
相关产品推荐
相关产品推荐

