如何找到我的 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 secrets
和kubectl 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 都会提供更新的解决方案
他们还提到(不明显的地方):
默认情况下,AKS 群集是使用具有 one-year 过期时间的服务主体创建的。
此外,
从 Azure CLI 2.0.68 开始,不再支持使用 user-defined 密码创建服务主体的 --password 参数,以防止意外使用弱密码。
所以更改服务主体密码的初始解决方案不再有效。
Azure 门户中提供了新功能,无需使用 CLI 即可查看群集配置。
转到 Azure 门户 -> 你的集群资源 -> 概述
在右侧有一个按钮,上面写着“JSON 查看”。单击它,您将看到一个包含集群详细信息的 json 文件。服务主体 ID 可见于:“servicePrincipalProfile”。
好吧,我搞砸了,我不小心 运行 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 secrets
和kubectl 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 都会提供更新的解决方案
他们还提到(不明显的地方): 默认情况下,AKS 群集是使用具有 one-year 过期时间的服务主体创建的。
此外, 从 Azure CLI 2.0.68 开始,不再支持使用 user-defined 密码创建服务主体的 --password 参数,以防止意外使用弱密码。 所以更改服务主体密码的初始解决方案不再有效。
Azure 门户中提供了新功能,无需使用 CLI 即可查看群集配置。 转到 Azure 门户 -> 你的集群资源 -> 概述
在右侧有一个按钮,上面写着“JSON 查看”。单击它,您将看到一个包含集群详细信息的 json 文件。服务主体 ID 可见于:“servicePrincipalProfile”。