Создание базы данных в учетной записи Azure Cosmos DB с помощью RBAC

Я использую java версию 4 SDK для лазурного космоса db. Я хочу создать базу данных в учетной записи azure cosmos db с субъектом службы, а не с мастер-ключом.

Я назначил субъекту службы DocumentDB Account Contributor и Cosmos DB Operator определения встроенных ролей в соответствии с этой документацией:

https://docs.microsoft.com/pl-pl/azure/role-based-access-control/built-in-roles#cosmos-db-operator

Мне не удалось создать CosmosAsyncClient, пока я не добавил новую настраиваемую роль, которая просто содержит метаданные для чтения. Вышеупомянутые определения встроенных ролей не содержат его ...

 TokenCredential ServicePrincipal = new ClientSecretCredentialBuilder()
            .authorityHost("https://login.microsoftonline.com")
            .tenantId(tenant_here)
            .clientId(clientid_here)
            .clientSecret(secret_from_above_client)
            .build();

 client = new CosmosClientBuilder()
                            .endpoint(AccountSettings.HOST)
                            .credential(ServicePrincipal)
                            .buildAsyncClient();

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

Более того, когда я сначала создаю базу данных и контейнер с главным ключом, а затем хочу читать / записывать данные с помощью принципала службы, он работает (очевидно, после добавления настраиваемой роли для записи).

Тогда я не знаю, почему DocumentDB Account Contributor и Cosmos DB Operator не работают для создания базы данных.




Ответы (1)


Похоже, это ошибка в java SDK, роли DocumentDB Account Contributor достаточно для создания базы данных и контейнера, поскольку у него есть разрешение Microsoft.DocumentDb/databaseAccounts/* (* - это подстановочный знак, он также включает Microsoft.DocumentDB/databaseAccounts/readMetadata, о котором вы упомянули).

Когда я тестирую использование субъекта-службы с этой ролью для создания базы данных с помощью powershell _ 5_, работает нормально. При использовании субъекта-службы для запуска этой команды он по существу использует поток учетных данных клиента Azure AD для получения токена, затем использует токен для вызова REST API - PUT https://management.azure.com/subscriptions/xxxx/resourceGroups/xxxx/providers/Microsoft.DocumentDB/databaseAccounts/xxxx/sqlDatabases/testdb1?api-version=2020-04-01 для создания базы данных, java SDK, по сути, также выполняет то же самое, поэтому тоже должно работать.

person Joy Wang    schedule 14.04.2021
comment
{..., userAgent: azsdk-java-cosmos / 4.13.1 Windows10 / 10.0 JRE / 11.0.10, statusCode: 403, resourceAddress: dev-sqlapi-acc-westus.documents.azure.com: 443 /…: { \ code \: \ Forbidden \, \ message \: \ Запрос заблокирован аутентификацией dev-sqlapi-acc: данный запрос [POST / dbs] не может быть авторизован токеном AAD в плоскости данных. \\ r \\, Microsoft.Azure .Documents.Common / 2.11.0, StatusCode: Forbidden \, \ additionalErrorInfo \: null}, innerErrorMessage: запрос заблокирован аутентификацией dev-sqlapi-acc: данный запрос [POST / dbs] не может быть авторизован токеном AAD в плоскости данных . - person gorrch; 14.04.2021
comment
Спасибо за ответ. Я вошел в azure cli как субъект службы и могу создать базу данных с помощью az cosmosdb sql database create. Похоже на ошибку. - person gorrch; 14.04.2021