如何找到我的 AKS 群集的服务主体密码?

How can I find the service principal secret of my AKS cluster?

好吧,我搞砸了,我不小心 运行 az ad sp reset-credentials 反对我们的 AKS 集群运行的服务主体。现在我们收到如下错误:

Error creating load balancer (will retry): error getting LB for service test/admin-api: azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://management.azure.com/subscriptions/****/resourceGroups/MC_****/providers/Microsoft.Network/loadBalancers?api-version=2017-09-01: StatusCode=0 -- Original Error: adal: Refresh request failed. Status Code = '401'. Response body: {"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID:****\r\nCorrelation ID:**** \r\nTimestamp: 2018-08-23 12:01:33Z","error_codes":[70002,50012],"timestamp":"2018-08-23 12:01:33Z","trace_id":"****","correlation_id":"****"}

Failed to pull image "****.azurecr.io/****:****": rpc error: code = Unknown desc = Error response from daemon: Get https://****.azurecr.io/v2/****/manifests/****: unauthorized: authentication required

所以现在我想找到服务主体使用的原始客户端机密,以便我可以将其作为密钥重新添加到服务主体。除了重新创建整个集群之外,这是我能想到的唯一解决方案。

有什么想法吗?

你想做的事情很烦人。针对你的问题,未经认证无法拉取镜像。

首先,您必须找出容器注册表的服务主体。您可以在 Azure 门户中执行此操作并导航到注册表面板,然后您可以像这样找到服务主体:

或者您可以使用 Azure CLI 命令查找注册表 ID,如下所示:

az acr show --resource-group groupName --name registryName --query id --output tsv

然后使用命令查找服务主体 ID,如下所示:

az role assignment list --scope registryID

您可以select您想要的服务主体。

然后你将通过命令kubectl get secretskubectl get secrets secretName -o yaml获取所有秘密以获得秘密的令牌。然后一一分析,检查用户名是否与服务主体ID相同。您可以使用 JWT 等工具来分析秘密令牌。结果会是这样的:

如果用户名与您找到的服务主体 ID 相同,那就是您想要的秘密。这一步很麻烦。你应该一个一个地检查秘密,否则你将有一个更好的方法来检查它们。

顺便说一句,您似乎只能在创建服务主体时看到一次密码。 Azure 不会再向您展示。但是如果你创建了 Kubernetes secret,密码就会存储在里面。

最后解决的办法很简单。

  • 在 Azure 门户中,导航到名为 MC_<resourcegroup>_<aksName>_<region> 的资源组。
  • 单击 "Virtual machine" 类型的资源之一。
  • 向下滚动到 "Run command"

  • 选择"RunShellScript"
  • 输入cat /etc/kubernetes/azure.json然后点击"Run"

该命令将 return JSON 文件的内容。你需要的 属性 是 aadClientSecret

无论谁解决了这个问题,Microsoft 都会提供更新的解决方案

https://docs.microsoft.com/en-us/azure/aks/update-credentials#update-aks-cluster-with-new-credentials

他们还提到(不明显的地方): 默认情况下,AKS 群集是使用具有 one-year 过期时间的服务主体创建的。

此外, 从 Azure CLI 2.0.68 开始,不再支持使用 user-defined 密码创建服务主体的 --password 参数,以防止意外使用弱密码。 所以更改服务主体密码的初始解决方案不再有效。

Azure 门户中提供了新功能,无需使用 CLI 即可查看群集配置。 转到 Azure 门户 -> 你的集群资源 -> 概述

在右侧有一个按钮,上面写着“JSON 查看”。单击它,您将看到一个包含集群详细信息的 json 文件。服务主体 ID 可见于:“servicePrincipalProfile”。