配置了 Azure AD RBAC 的 Azure DevOp Pipelines 对 AKS 的身份验证?

Posted

技术标签:

【中文标题】配置了 Azure AD RBAC 的 Azure DevOp Pipelines 对 AKS 的身份验证?【英文标题】:Azure DevOp Pipelines authentication to AKS with Azure AD RBAC configured? 【发布时间】:2019-05-28 23:07:24 【问题描述】:

我们已将 Azure Kubernetes 集群配置为使用 Azure Active Directory RBAC。这意味着在使用 kubectl 时,我们首先需要以 AD 用户身份进行身份验证(通常通过 Web 浏览器手动完成设备代码身份验证来完成)。我们几乎完全按照 MSDN 文章 Integrate Azure Active Directory with Azure Kubernetes Service 进行了配置。

问题是 Azure DevOp Pipelines 中的 Kubernetes 构建/发布任务现在也需要此身份验证,例如当我们运行 kubectl apply 时:

2019-01-02T08:48:21.2070286Z ##[section]Starting: kubectl apply
2019-01-02T08:48:21.2074936Z ==============================================================================
2019-01-02T08:48:21.2075160Z Task         : Deploy to Kubernetes
2019-01-02T08:48:21.2075398Z Description  : Deploy, configure, update your Kubernetes cluster in Azure Container Service by running kubectl commands.
2019-01-02T08:48:21.2075625Z Version      : 1.1.17
2019-01-02T08:48:21.2075792Z Author       : Microsoft Corporation
2019-01-02T08:48:21.2076009Z Help         : [More Information](https://go.microsoft.com/fwlink/?linkid=851275)
2019-01-02T08:48:21.2076245Z ==============================================================================
2019-01-02T08:48:25.7971481Z Found tool in cache: kubectl 1.7.0 x64
2019-01-02T08:48:25.7980222Z Prepending PATH environment variable with directory: C:\agents\HephaestusForge\_work\_tool\kubectl\1.7.0\x64
2019-01-02T08:48:25.8666111Z [command]C:\agents\HephaestusForge\_work\_tool\kubectl\1.7.0\x64\kubectl.exe apply -f C:\agents\HephaestusForge\_work\r8\a\_MyProject\kubernetes\deploy.yaml -o json
2019-01-02T08:48:26.3518703Z To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CUYYYYYVV to authenticate.

对此有什么解决方法?是否可以让 Azure DevOps 作为服务器客户端而不是 AD 客户端进行身份验证?

【问题讨论】:

我认为令牌是缓存的,可以一直使用到过期。登录或执行命令时是否还有其他错误? @CharlesXu 如果我手动使用代码进行身份验证,那么它工作得很好。没有我可以使用的令牌。 我测试的时候,每次拿到凭证时只需要登录即可。然后凭证存储在文件 ~/.kube/config 中。也许您可以从代码中的文件中获取凭据。您也可以在代码中获取凭据时将其设置为变量。 可以使用github.com/Azure/kubelogin插件进行非交互登录 【参考方案1】:

您可以使用不需要交互式登录但遗憾的是绕过您可能设置的任何 RBAC 控件的管理员配置文件。

在这里投票:https://feedback.azure.com/forums/914020-azure-kubernetes-service-aks/suggestions/35146387-support-non-interactive-login-for-aad-integrated-c

【讨论】:

链接已失效。【参考方案2】:

您可以从https://github.com/Azure/kubelogin 为您的管道使用 kubelogin

这是从登录步骤开始的完整示例,直到在 Kubernetes 中获取命名空间资源。

az login --service-principal -u $APP_ID -p $PASSWORD -t $TENANT

此语句更重要,如果您的 ~/.kube/config 文件中没有现有的集群上下文

az aks get-credentials --resource-group $RG_AKS --name $CLUSTER_NAME --overwrite-existing --file .kubeconfig-$CLUSTER_NAME
Merged "my-aks-cluster-name" as current context in .kubeconfig-my-aks-cluster-name

使用 kubelogin 代替 az aks get-credential ....

export KUBECONFIG=$(pwd)/.kubeconfig-$CLUSTER_NAME
kubelogin convert-kubeconfig -l spn
export AAD_SERVICE_PRINCIPAL_CLIENT_ID=$APP_ID
export AAD_SERVICE_PRINCIPAL_CLIENT_SECRET=$PASSWORD

现在您可以在没有设备身份验证的情况下运行 kubectl

kubectl get pods -n $NAMESPACE
NAME                       READY   STATUS    RESTARTS   AGE
myapp-be-7c8cf7d8b9-gnj2t   1/1     Running   0          103m
myapp-cms-65fd6df9c-z7752   1/1     Running   0          14m
myapp-fe-5dbcdd8d9c-fzxgh   1/1     Running   0          52m

【讨论】:

这不是像使用 --admin 标志和 az aks get-credential 一样不安全吗? 如果您创建具有有限权限的服务主体,例如只有一个命名空间,那么它的爆炸半径更小(比 admin)更安全。 这确实有效,但我如何确保kubectl@1 任务也像这样进行身份验证?我现在只能使用 az cli tasks 来部署 k8s 资源...

以上是关于配置了 Azure AD RBAC 的 Azure DevOp Pipelines 对 AKS 的身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role

Azure 实践系列 3:Azure AD中的服务器管理

在没有门户的情况下配置 Azure AD Connect 云同步?

Azure RBAC管理ASM资源

Azure通过RBAC对资源进行管理

所有 Azure 资源的 RBAC 权限列表