Ошибка AzureBlobStorage AuthorizationPermissionMismatch с использованием удостоверений, управляемых пользователем, SDK Python из AKS

Я запускаю приложение Python в AKS (как задание, но это не имеет значения), используя Azure Python SDK для доступа к хранилищу больших двоичных объектов. Я использую управляемую пользователем идентификацию для аутентификации, используя ManagedIdentityCredential с client_id kwarg (см. https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.managedidentitycredential?view=azure-python ). Он успешно может запросить конечную точку IMDS и получить токен, но я все еще получаю ошибку. Кто-нибудь знает, какой настройки мне может не хватать?

Есть очень ценные небольшие документы об управляемых пользователем удостоверениях в целом, особенно в отношении AKS и хранилища BLOB-объектов, а также об этой ошибке.

Успешная выборка токена IMDS:

2021-01-26 05:26:05,944 - azure.core.pipeline.policies.http_logging_policy - INFO - Request URL: 'http://REDACTED/metadata/identity/oauth2/token?api-version=REDACTED&resource=REDACTED&client_id=REDACTED'
2021-01-26 05:26:05,945 - azure.core.pipeline.policies.http_logging_policy - INFO - Request method: 'GET'
2021-01-26 05:26:05,945 - azure.core.pipeline.policies.http_logging_policy - INFO - Request headers:
2021-01-26 05:26:05,945 - azure.core.pipeline.policies.http_logging_policy - INFO -     'Metadata': 'REDACTED'
2021-01-26 05:26:05,945 - azure.core.pipeline.policies.http_logging_policy - INFO -     'User-Agent': 'azsdk-python-identity/1.5.0 Python/3.7.7 (Linux-4.15.0-1103-azure-x86_64-with-debian-9.12)'
2021-01-26 05:26:05,945 - azure.core.pipeline.policies.http_logging_policy - INFO - No body was attached to the request
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO - Response status: 200
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO - Response headers:
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO -     'Content-Type': 'application/json; charset=utf-8'
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO -     'Server': 'IMDS/150.870.65.486'
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO -     'Date': 'Tue, 26 Jan 2021 05:26:05 GMT'
2021-01-26 05:26:05,956 - azure.core.pipeline.policies.http_logging_policy - INFO -     'Content-Length': '1760'
2021-01-26 05:26:05,957 - azure.identity._internal.decorators - INFO - ManagedIdentityCredential.get_token succeeded
2021-01-26 05:26:05,957 - azure.identity._credentials.chained - INFO - ChainedTokenCredential acquired a token from ManagedIdentityCredential

Последующий вызов API для blob.core.windows.net / .... ошибки:

  File "/usr/local/lib/python3.7/site-packages/azure/storage/blob/_blob_client.py", line 685, in upload_blob
    return upload_block_blob(**options)
  File "/usr/local/lib/python3.7/site-packages/azure/storage/blob/_upload_helpers.py", line 157, in upload_block_blob
    process_storage_error(error)
  File "/usr/local/lib/python3.7/site-packages/azure/storage/blob/_shared/response_handlers.py", line 150, in process_storage_error
    error.raise_with_traceback()
  File "/usr/local/lib/python3.7/site-packages/azure/core/exceptions.py", line 218, in raise_with_traceback
    raise super(AzureError, self).with_traceback(self.exc_traceback)
  File "/usr/local/lib/python3.7/site-packages/azure/storage/blob/_upload_helpers.py", line 105, in upload_block_blob
    **kwargs)
  File "/usr/local/lib/python3.7/site-packages/azure/storage/blob/_generated/operations/_block_blob_operations.py", line 233, in upload
    raise HttpResponseError(response=response, model=error)
azure.core.exceptions.HttpResponseError: This request is not authorized to perform this operation using this permission.
RequestId:defcc13f-101e-006c-6aa3-f321cb000000
Time:2021-01-26T05:26:06.0112926Z
ErrorCode:AuthorizationPermissionMismatch
Error:None

Рассматриваемый ресурс хранилища больших двоичных объектов имеет назначение роли управляемому пользователем удостоверению в качестве участника этого ресурса.

Код:

    managed_identity = ManagedIdentityCredential(client_id=mi_client_id)
    azure_cli = AzureCliCredential()
    credential_chain = ChainedTokenCredential(managed_identity, azure_cli)
    return BlobServiceClient(url_prefix, credential=credential_chain)

Версии: azure-identity 1.5, Python 3.7.7

Я не уверен, что наш кластер AKS предоставил управляемому пользователем удостоверению роль роль, и я не уверен, имеет ли это значение или что еще нужно настроить.

Благодарность




Ответы (2)


Я считаю, что вам может потребоваться предоставить разрешение Storage Blob Data Contibutor

person Yana K.    schedule 26.01.2021
comment
О, управляемое удостоверение уже имеет разрешение участника, которое должно включать разрешения на запись. - person Evan Chan; 27.01.2021
comment
Участник не разрешает доступ к плоскости данных (blob). Существуют специальные разрешения плоскости данных, например @yana, упомянутые выше. Попробуйте :) - person ckittel; 27.01.2021
comment
Да, нас это укусило, когда мы перешли на идентификацию. По какой-то до сих пор непонятной для меня причине оба были необходимы. Если это не сработает, я предлагаю попытаться получить доступ через azure cli: по крайней мере, это поможет вам определить проблемы с настройкой идентичности и использование библиотеки Python. У меня есть только образцы клиентов Go и Java, ничего для python ... но разрешения были самым непрозрачным шагом - person Yana K.; 28.01.2021
comment
Похоже, переключение разрешений на Storage Data Contributor не помогло. - person Evan Chan; 02.02.2021

Оказывается, ответ состоит в том, что для решения проблемы должны быть назначены роли «Участник данных BLOB-объектов хранилища» и «Участник данных очереди хранилища».

person Evan Chan    schedule 02.02.2021