K8S RBAC与Azure AD集成

时间:2023-02-23 16:17:45

Azure Kubernetes 服务 (AKS) 可以配置为使用 Azure Active Directory (Azure AD) 进行用户身份验证。在此配置中,您使用 Azure AD 身份验证令牌登录到 AKS 群集。通过身份验证后,您可以使用内置的 Kubernetes 基于角色的访问控制 (Kubernetes RBAC) 来根据用户的身份或组成员身份管理对命名空间和集群资源的访问。

本文将展示如何:

  • 根据 Azure AD 组成员身份在 AKS 群集中使用 Kubernetes RBAC 控制访问。
  • 在 Azure AD 中创建示例组和用户。
  • 在 AKS 群集中创建角色和角色绑定以授予创建和查看资源的适当权限。

在开始之前需要进行如下准备工作:

  • 一个启用了 Azure AD 集成的现有 AKS 群集。
  • 在 AKS 群集创建期间默认启用 Kubernetes RBAC。要使用 Azure AD 集成和 Kubernetes RBAC 升级集群,请在现有 AKS 集群上启用 Azure AD 集成。
  • 确保安装并配置了 Azure CLI 2.0.61 或更高版本。运行az --version查找版本。
  • 如果使用 Terraform,请安装Terraform版本 2.99.0 或更高版本。

Azure AD准备

创建用户组:

$DevTeam_ID=$(az ad group create --display-name DevTeam --mail-nickname devteam --query ObjectID -o tsv)

K8S RBAC与Azure AD集成

使用 ​​az aks show​​ 命令获取 AKS 群集的资源 ID。 将该资源 ID 分配到名为 AKS_ID 的变量,以便可以在其他命令中引用它

$AKS_ID=$(az aks show -g gavinwu -n labaks --query id -o tsv)

K8S RBAC与Azure AD集成

向用户组内用户授予 Azure Kubernetes 服务群集用户角色,因此可让他们使用 ​​kubectl​​ 来与 AKS 群集交互

az role assignment create --assignee  $DevTeam_ID --role "Azure Kubernetes Service Cluster User Role" --scope $AKS_ID

K8S RBAC与Azure AD集成

创建Azure AD用户,将其加入到Dev Team用户组:

K8S RBAC与Azure AD集成


为开发人员创建AKS群集资源

现在创建 Azure AD 组和用户。 之前已经为组成员创建了 Azure 角色分配,使他们能够以普通用户的身份连接到 AKS 群集。 现在,让我们配置 AKS 群集,以允许这些不同的组访问特定的资源

运行kubectl create ns dev命令,在AKS群内为devteam创建一个命名空间:

K8S RBAC与Azure AD集成

在 Kubernetes 中,角色定义要授予的权限,角色绑定将这些权限应用到所需的用户或组。 这些分配可应用于特定命名空间或整个群集。先为 dev 命名空间创建一个角色。 此角色授予对命名空间的完全权限。 在生产环境中,可为不同的用户或组指定更精细的权限

定义如下YAML文件,用于创建Dev空间内的角色定义:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-user-full-access
namespace: dev
rules:

- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]

运行kubectl命令创建角色: kubectl apply -f .\role-dev-ns.yaml

K8S RBAC与Azure AD集成

现在来创建角色绑定,以使用前面创建的角色来访问命名空间。 创建名为 ​​rolebinding-dev-namespace.yaml​​ 的文件并粘贴以下 YAML 清单。 在最后一行中,请将 groupObjectId 替换为前一命令的组对象 ID 输出

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-user-access
namespace: dev
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: dev-user-full-access
subjects:

- kind: Group
namespace: dev
name: groupObjectId

运行kubectl命令创建角色绑定: kubectl apply -f .\role-dev-ns.yaml

K8S RBAC与Azure AD集成


使用DevTeam组内账号与AKS群集资源进行交互

现在,让我们通过在 AKS 群集中创建和管理资源,来测试权限是否按预期方式工作。 在这些示例中,你将在用户的分配命名空间中计划和查看 pod。 然后,尝试在分配的命名空间外部计划和查看 pod。

首先,使用 az aks Get-Credentials 命令重置 kubeconfig 上下文。因为之前测试一直使用群集管理员凭据设置了上下文。 管理员用户将绕过 Azure AD 登录提示。 如果运行命令过程中没指定 ​​--admin​​ 参数,应用的用户上下文将要求使用 Azure AD 对所有请求进行身份验证。

运行 az aks Get-Credentials -g GavinWu -n LabAKS --overwrite-existing 重新获取配置文件以后,运行kubectl命令,这时系统会提示我们进行登录:

K8S RBAC与Azure AD集成

使用dev用户进行登录,登录成功以后,令牌会被缓存以供kubectl所使用:

K8S RBAC与Azure AD集成

使用如下命令在Dev命名空间部署一个pod,可以看到部署是没问题的:

kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev

K8S RBAC与Azure AD集成

当我们尝试去查看其他命名空间的Pod的时候,系统会提示我们权限不足:

K8S RBAC与Azure AD集成