【问题标题】:Authenticate a python application in VM with Managed Service Identity(MSI)使用托管服务标识 (MSI) 在 VM 中验证 python 应用程序
【发布时间】:2018-03-30 04:44:19
【问题描述】:

我正在尝试使用以下链接中提供的 MSI 示例:

https://docs.microsoft.com/en-us/python/azure/python-sdk-azure-authenticate?view=azure-python#mgmt-auth-msi

为此,我创建了一个 linux VM,在其上安装了 MSI 扩展并在 python 应用程序中运行上述代码,当我运行该 python 应用程序时,我收到以下错误:

[azureuser@vish-redhat ~]$ python msi-auth.py 
No handlers could be found for logger "msrestazure.azure_active_directory"
Traceback (most recent call last):
  File "msi-auth.py", line 10, in <module>
    subscription = next(subscription_client.subscriptions.list())
  File "/usr/lib/python2.7/site-packages/msrest/paging.py", line 121, in __next__
    self.advance_page()
  File "/usr/lib/python2.7/site-packages/msrest/paging.py", line 107, in advance_page
    self._response = self._get_next(self.next_link)
  File "/usr/lib/python2.7/site-packages/azure/mgmt/resource/subscriptions/v2016_06_01/operations/subscriptions_operations.py", line 207, in internal_paging
    request, header_parameters, **operation_config)
  File "/usr/lib/python2.7/site-packages/msrest/service_client.py", line 191, in send
    session = self.creds.signed_session()
  File "/usr/lib/python2.7/site-packages/msrestazure/azure_active_directory.py", line 685, in signed_session
    self.set_token()
  File "/usr/lib/python2.7/site-packages/msrestazure/azure_active_directory.py", line 681, in set_token
    self.scheme, _, self.token = get_msi_token(self.resource, self.port, self.msi_conf)
  File "/usr/lib/python2.7/site-packages/msrestazure/azure_active_directory.py", line 590, in get_msi_token
    result = requests.post(request_uri, data=payload, headers={'Metadata': 'true'})
  File "/usr/lib/python2.7/site-packages/requests/api.py", line 108, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 464, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', error(111, 'Connection refused'))
[azureuser@vish-redhat ~]$ 

代码:

from msrestazure.azure_active_directory import MSIAuthentication
from azure.mgmt.resource import ResourceManagementClient, SubscriptionClient

# Create MSI Authentication
credentials = MSIAuthentication()


# Create a Subscription Client
subscription_client = SubscriptionClient(credentials)
subscription = next(subscription_client.subscriptions.list())
subscription_id = subscription.subscription_id

# Create a Resource Management client
resource_client = ResourceManagementClient(credentials, subscription_id)


# List resource groups as an example. The only limit is what role and policy are assigned to this MSI token.
for resource_group in resource_client.resource_groups.list():
    print(resource_group.name)

【问题讨论】:

    标签: python azure azure-sdk azure-managed-identity


    【解决方案1】:

    您需要在 Linux 虚拟机中安装 Python SDK。请参考这个official document

    pip install azure
    

    此外,您需要在订阅级别为您的虚拟机授予所有者角色。

    更多信息请参考link

    现在,您可以使用此代码在 VM 上进行测试。我在我的实验室进行测试,它对我有用。

    注意:resource_client = ResourceManagementClient(credentials, subscription_id)需要修改为resource_client = ResourceManagementClient(credentials, str(subscription_id)),需要字符串类型。

    【讨论】:

    • 我已经 pip 安装了 azure 包。我认为这就是为什么我没有收到导入错误而是收到连接错误的原因。我的代码没有到达 resource_client 分配行。在订阅 = next() 行失败
    • @ForeverLearner 我在实验室测试,我也遇到了这个错误。这意味着您没有在订阅级别上提供Owner 角色。检查我的回答步骤2。因为如果你不赋予所有者角色,代码没有获得订阅的权限,所以你会得到错误日志。
    • 但老实说,您的错误日志似乎不是这个问题。如果可能,您可以更新您的问题,我会尽力帮助您解决。
    • 已经有一个 IAM 角色代表我的用户电子邮件地址成为所有者,并且范围为资源和订阅级别。
    • 不,您将此虚拟机添加为Owner 角色,而不仅仅是您的电子邮件地址。看我的截图assign access to Virtual Machine不是Azure AD user, group or application
    【解决方案2】:

    连接错误通常是因为扩展程序尚不可用。您可以使用带有az login --msi的CLI 尝试扩展是否可用

    https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/how-to-use-vm-sign-in

    如果它工作正常,您的 VM 已正确创建并具有 MSI 支持。它没有,可能你的扩展配置不正确。

    请注意,我们更改了通过 MSI 从 VM 内部获取令牌的方式。我们现在使用 IMDS: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service

    从 CLI 的下一个版本(2018 年 4 月的第一个版本)开始,CLI 将直接通过 IMDS 进行身份验证,不再使用 VM 扩展。这已经在其 0.4.25 版本的底层库 msrestazure 中提供。这将完全绕过您的 VM 扩展来使用 IMDS,并且现在是首选方案。你能试试这个版本的msrestazure吗?如果它适用于 0.4.25 但不适用于 0.4.24,这可能意味着您的 VM 扩展未正确安装,但您不必在意,因为它已被弃用:)

    请注意,为了获取令牌,您的虚拟机不需要任何特殊权限或订阅所有权。但是,要使此令牌有用,您需要它:)。但由于您的错误与“获取令牌”部分有关,而不是权限,我只是建议您稍后如果遇到权限问题可能需要此补充信息:

    https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/howto-assign-access-cli

    (完全披露,我在 MS 的 SDK/CLI 团队工作并编写了 MSI 支持)

    【讨论】:

    • 是的,NightOwl888 和盛宝,我试图提供帮助,但我有 20 秒的时间来做我的第一个答案,而且太仓促了。我很抱歉。
    • az login --msi 失败。它吐出错误:MSI:无法从 '169.254.169.254/metadata/identity/oauth2/token' 检索令牌,错误为 '{"error":"invalid_request","error_description":"Identity not found"}'
    • 这使用 IMDS,考虑到内部 IP。我目前的猜测是您的虚拟机未启用 MSI。尝试重新启用 MSI:docs.microsoft.com/en-us/azure/active-directory/…
    • 你的猜测是正确的。它没有正确启用。重新启用后,我得到了不同的错误。回溯(最近一次调用):文件“msi-auth.py”,第 10 行,在 subscription = next(subscription_client.subscriptions.list()) .....File "/usr/lib/python2. 7/site-packages/msrest/paging.py",第 105 行,提前_page raise StopIteration("End of paging") StopIteration: End of paging
    • 我不这么认为,错误意味着您没有足够的权限。如果您的 MSI 服务未运行,您将在 credentials = MSIAuthentication() 中收到错误消息。要检查这一点,netstat -ant|grep 50342 的结果是什么,并使用curl http://localhost:50342/oauth2/token --data "resource=https://management.azure.com/" -H Metadata:true 获取令牌。
    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2021-09-13
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多