问题描述
我有一些 terraform 代码来更新 Azure AD 应用程序的秘密。它与 Azure DevOps 服务连接是相同的服务主体和 AD 应用程序。它每 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 用户进行身份验证时,这在我的本地 CLI 中有效。但是在使用 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>"}}]
╵
很明显,问题是权限。但我无法找到需要哪个权限。是因为它试图从自己身上删除一个秘密吗?即使是不同的秘密?
解决方法
该角色需要应用程序管理员。和应用程序读/写 API 权限