У меня есть код Terraform для обновления секрета приложения Azure AD. Это тот же субъект-служба и приложение AD, что и подключение службы Azure DevOps. Он меняет его каждые 30 минут, поэтому я могу использовать субъект-службу для выполнения некоторых задач sql.
Код
# Rotate password every 30min
resource "time_rotating" "azure" {
rotation_minutes = 30
}
# Generate application temp password
resource "random_password" "ado_temp_secret" {
length = 32
special = true
keepers = {
expiry = time_rotating.azure.rotation_rfc3339
}
}
# Create temp secret for ADO Service Connection application
resource "azuread_application_password" "ado_temp_secret" {
application_object_id = data.azuread_application.ado_service_connection.object_id
description = "${module.sql_server.sql_server_name} Temp Password"
value = random_password.ado_temp_secret.result
end_date = time_rotating.azure.rotation_rfc3339
}
Это работает из моего локального интерфейса командной строки, когда я аутентифицируюсь своим собственным пользователем Azure. Но это не работает при использовании конвейерной задачи DevOos.
Задача
- task: TerraformCLI@0
displayName: Terraform Apply
inputs:
command: 'apply'
workingDirectory: '${{ parameters.TerraformWorkingDirectory }}'
environmentServiceName: '${{ parameters.ServiceConnection }}'
runAzLogin: true
commandOptions: '${{ parameters.TerraformClioptions }}'
allowTelemetryCollection: false
Значение для environmentServiceName
будет тем же сервисным подключением, для которого я пытаюсь обновить пароль.
В конвейере есть ошибка:
azuread_application_password.ado_temp_secret: Destroying... [<id>]
╷
│ Error: Removing password credential "<credentials>" from application with object ID "<id>"
│
│ graphrbac.ApplicationsClient#UpdatePasswordCredentials: Failure responding
│ to request: StatusCode=403 -- Original Error: autorest/azure: Service
│ returned an error. Status=403 Code="Unknown" Message="Unknown service
│ error"
│ Details=[{"odata.error":{"code":"Authorization_RequestDenied","date":"2021-04-27T06:29:38","message":{"lang":"en","value":"Insufficient
│ privileges to complete the
│ operation."},"requestId":"<id>"}}]
╵
Итак, очевидно, что проблема в разрешениях. Но я не могу найти, какое разрешение необходимо. Не потому ли, что пытается лишить себя секрета? Хоть и другой секрет?