我使用的是具有动态 IP 地址的 Azure VM。当我登录时,我可以使用以下 python 代码检索 secret ,没有任何问题;
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
credential = DefaultAzureCredential()
secret_client = SecretClient(vault_url="https://xxxx/", credential=credential)
secret = secret_client.get_secret("testSecret")
我需要在虚拟机打开但未登录时检索 secret 以启用其他进程运行。我注意到当我注销时上面的代码失败了。系统管理员向我提供了 AZURE_CLIENT_ID
、AZURE_CLIENT_SECRET
、AZURE_TENANT_ID
和 VAULT_URL
,以便我将它们设置为环境凭据。
我在CMD中设置它们如下;
SETX AZURE_CLIENT_ID "pppp"
SETX AZURE_CLIENT_SECRET "mmmm"
SETX AZURE_TENANT_ID "kkkk"
SETX VAULT_URL "xxxx"
我尝试使用此代码检索我的 secret ,
from azure.keyvault.secrets import SecretClient
VAULT_URL = os.environ["VAULT_URL"]
credential = EnvironmentCredential()
client = SecretClient(vault_url=VAULT_URL, credential=credential)
password = client.get_secret("testSecret").value
我收到这个错误
raise HttpResponseError(response=response, model=error)
azure.core.exceptions.HttpResponseError: (Forbidden) The user, group or application 'pppp;iss=https://sts.windows.net/kkkk/' does not have secrets get permission on key vault 'name of my vault-vault;location=australiasoutheast'. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287
问题 系统管理员确认颁发的凭据是服务主体的正确详细信息。
- 如何纠正这个问题或者我做错了什么?
- 有没有办法让我打印 DefaultAzureCredentials,以便将其设置为与 EnvironmentCredential 相同,因为我相信登录时恢复 secret 的原因是登录时凭据会被缓存?
我们将非常感谢您的帮助。
最佳答案
How can correct this or what am I doing wrong?
该错误表示您的服务主体在 keyvault 中没有正确的 secret 权限 -> 访问策略
,要解决此问题,请将错误消息中提到的应用程序(服务主体)添加到使用 Azure 门户中的 keyvault 中的 Get
secret 权限访问策略
。如果仍然不起作用,请尝试在系统变量
中设置环境变量,而不是xxx的用户变量
,如屏幕截图所示。
Is there a way for me to print DefaultAzureCredentials so that I set the same as EnvironmentCredential because I believe why I recover secrets when I am logged in is that the credentials are cached when I sign in?
无需执行此操作,DefaultAzureCredential
尝试按此顺序通过以下机制进行身份验证,请参阅 here 。如果您之前未设置环境变量,则应使用虚拟机的托管身份进行身份验证。
关于python-3.x - 设置 Azure 环境凭据(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64473359/