Bicep roleAssignments/ошибка разрешения на запись при назначении роли Keyvault

Я использую GitHub Actions для развертывания через Bicep:

- name: Login
  uses: azure/login@v1
  with:
    creds: ${{ secrets.AZURE_CREDENTIALS }}
        
- name: Deploy Bicep file
  uses: azure/arm-deploy@v1
  with:
    scope: subscription
    subscriptionId: ${{ secrets.AZURE_CREDENTIALS_subscriptionId }}
    region: ${{ env.DEPLOY_REGION }}
    template: ${{ env.BICEP_ENTRY_FILE }}
    parameters: parameters.${{ inputs.selectedEnvironment }}.json

Я использовал доступ участника для своего AZURE_CREDENTIALS на основе вывода следующей команды:

az ad sp create-for-rbac --n infra-bicep --role contributor --scopes /subscriptions/my-subscription-guid --sdk-auth

Я использую Azure Keyvault с RBAC. Этот Bicep работал нормально, пока я не попытался предоставить веб-приложению Azure доступ на чтение хранилища ключей к хранилищу ключей как таковому:

var kvSecretsUser = '4633458b-17de-408a-b874-0445c86b69e6'
var kvSecretsUserRole = subscriptionResourceId('Microsoft.Authorization/roleDefinitions', kvSecretsUser)
resource kx_webapp_roleAssignments 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: 'kv-webapp-roleAssignments'
  scope: kv
  properties: {
    principalId: webappPrincipleId
    principalType: 'ServicePrincipal'
    roleDefinitionId: kvSecretsUserRole
  }
}

Затем я столкнулся со следующей ошибкой:

'Authorization failed for template resource 'kv-webapp-roleAssignments' 
of type 'Microsoft.Authorization/roleAssignments'. 
The client 'guid-value' with object id 'guid-value' does not have permission to perform action 
'Microsoft.Authorization/roleAssignments/write' at scope
 '/subscriptions/***/resourceGroups/rg-x/providers/Microsoft.KeyVault/vaults/
kv-x/providers/Microsoft.Authorization/roleAssignments/kv-webapp-roleAssignments'.'

Каковы общие минимальные необходимые разрешения и какими должны быть мои az ad sp create-for-rbac утверждения, и есть ли какие-либо другие шаги, которые мне нужно сделать, чтобы назначить разрешения роли?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы назначать роли RBAC, вам необходимо иметь доступ пользователя Роль администратора или владельца, которая включает следующие разрешения: Microsoft.Authorization/roleAssignments/write

С ролью участника вы не можете назначать роли RBAC ресурсам Azure. Чтобы убедиться в этом, вы можете проверить этот MS Doc.

Я попытался воспроизвести то же самое в своей среде и получил следующие результаты:

Я использовал ту же команду и создал один субъект-службу с ролью участника, как показано ниже:

az ad sp create-for-rbac --n infra-bicep --role contributor --scopes /subscriptions/my-subscription-guid --sdk-auth

Ответ:

Я сгенерировал один токен доступа через Postman со следующими параметрами:

POST https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/token

grant_type:client_credentials
client_id: <clientID from above response>
client_secret: <clientSecret from above response>
scope: https://management.azure.com/.default

Ответ:

Когда я использовал этот токен для назначения роли пользователя Key Vault Secrets с помощью приведенного ниже вызова API, я получил ту же ошибку, что и ниже:

PUT https://management.azure.com/subscriptions/d689e7fb-47d7-4fc3-b0db-xxxxxxxxxxx/providers/Microsoft.Authorization/roleAssignments/xxxxxxxxxxx?api-version=2022-04-01
{
  "properties": {
    "roleDefinitionId": "/subscriptions/d689e7fb-47d7-4fc3-b0db-xxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6",
    "principalId": "456c2d5f-12e7-4448-88ba-xxxxxxxxx",
    "principalType": "ServicePrincipal"
  }
}

Ответ:

Чтобы устранить эту ошибку, создайте субъект-службу с ролью администратора доступа пользователей или владельца.

В моем случае я создал субъект-службу с ролью владельца, как показано ниже:

az ad sp create-for-rbac --n infra-bicep-owner --role owner --scopes /subscriptions/my-subscription-guid --sdk-auth

Ответ:

Теперь я снова сгенерировал токен доступа через Postman, заменив значения clientId и clientSecret, как показано ниже:

POST https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/token

grant_type:client_credentials
client_id: <clientID from above response>
client_secret: <clientSecret from above response>
scope: https://management.azure.com/.default

Ответ:

Когда я использовал этот токен для назначения роли пользователя Key Vault Secrets с помощью приведенного ниже вызова API, я успешно получил ответ, как показано ниже:

PUT https://management.azure.com/subscriptions/d689e7fb-47d7-4fc3-b0db-xxxxxxxxxxx/providers/Microsoft.Authorization/roleAssignments/xxxxxxxxxxx?api-version=2022-04-01
{
  "properties": {
    "roleDefinitionId": "/subscriptions/d689e7fb-47d7-4fc3-b0db-xxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6",
    "principalId": "456c2d5f-12e7-4448-88ba-xxxxxxxxx",
    "principalType": "ServicePrincipal"
  }
}

Ответ:

ОБНОВЛЯТЬ:

Учитывая принцип наименьших привилегий, вам нужно создать пользовательскую роль RBAC вместо назначения роли Owner.

Чтобы создать пользовательскую роль RBAC, выполните следующие действия:

Перейдите на портал Azure -> Подписки -> Ваша подписка -> Контроль доступа (IAM) -> Добавить -> Добавить пользовательскую роль.

Заполните детали именем и описанием, обязательно выберите роль участника после выбора Clone a role, как показано ниже:

Теперь удалите ниже разрешение из NotAction Microsoft.Authorization/roleAssignments/write

Теперь добавьте разрешение Microsoft.Authorization/roleAssignments/write в действие:

Теперь нажмите «Создать», как показано ниже:

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

az ad sp create-for-rbac --n infra_bicep_custom_role --role 'Custom Contributor' --scopes /subscriptions/my-subscription-guid --sdk-auth

Ответ:

Спасибо, что нашли время, чтобы воспроизвести. Тем не менее, в нем отсутствует важная часть моего вопроса, которая минимальна, и я считаю, что владелец слишком много для него, поскольку он не следует принципу наименьших привилегий. Могу ли я «добавить» администратора доступа пользователей к роли участника?

Adam 16.01.2023 10:52

В этом случае вы можете создать собственную роль RBAC, добавив разрешение Microsoft.Authorization/roleAssignments/write вместе с разрешениями участника.

Sridevi 16.01.2023 13:49

Я сделал это. Я создал пользовательскую роль на уровне подписки, начал с contributer добавил Microsoft.Authorization/roleAssignments/write , затем мне нужно удалить Microsoft.Authorization/*/write и Microsoft.Authorization/*/readNoAction, которые пришли из contributor. Вы хотите обновить свой ответ с помощью этих действий, чтобы я мог отметить его? Это поможет будущим поколениям.

Adam 16.01.2023 14:25

Удаление двух разрешений No Action BUT добавление Microsoft.Authorization/roleAssignments/write . Я думаю, вы только что удалили два, не добавив это разрешение. Только последнее замечание, команда RBAC должна быть az ad sp create-for-rbac --n infra-bicep-owner --role **[Your Custom Roles]** --scopes /subscriptions/my-subscription-guid --sdk-auth

Adam 16.01.2023 16:56

Другие вопросы по теме

Приложение Azure AKS/Container не может получить доступ к хранилищу ключей с помощью управляемого удостоверения
DefaultAzureCredetials не может пройти аутентификацию через Visual Studio — не удается найти AzureServiceAuth\tokenProvider.json
Как аутентифицировать хранилище ключей Azure, используя идентификатор клиента и секрет?
Шифрование диска виртуальной машины Azure: не удалось настроить блокировку битов должным образом. Исключение: неверный URI
Как обнаружить хранилища ключей Azure и добавить IP-адреса в его брандмауэр при создании?
Используйте секретные учетные данные Azure Keyvault в тестах пользовательского интерфейса Cypress, выполняемых в конвейере Azure Devops
Переменная конвейеров выпуска Azure в переменной
Экспорт секретов хранилища ключей Azure в виде списка JSON (или файла)
Azure Key Vault — загрузите оригинальный PFX из Ket Vault
Не удалось импортировать сертификат хранилища ключей в приложение-функцию Azure