Как создать субъект-службу в azure с помощью azuread_application в terraform, Ошибка Недостаточно прав для завершения операции - PullRequest
0 голосов
/ 29 апреля 2020

Попытка создать субъект-службу в Terraform, чтобы стать субъектом-службой в кластере, который я создаю в другом файле. Но при создании ошибка приходит с "azuread_application" "aks_sp" в файле ниже

data "azurerm_subscription" "current" {}

data "azurerm_client_config" "default" {}
data "azuread_client_config" "defualt" {} # added with azuread 0.8.0

data "azurerm_role_definition" "builtin" {
  name = "Contributor"
}
# Resource group is needed to manage users priveleges
resource "azurerm_resource_group" "test_rs" {
  name      = var.resource_group_name # mwk8ResourceGroup
  location  = var.location # eastus2
}

# Service principal for cluster
# first you need an azure application
resource "azuread_application" "aks_sp" {
  name                        = var.clustername
  homepage                    = "https://${var.clustername}"
  identifier_uris             = ["https://${var.clustername}"]
  reply_urls                  = ["https://${var.clustername}"]
  available_to_other_tenants  = false # default
  public_client               = false # default
  oauth2_allow_implicit_flow  = false # default
}

# service principal
resource "azuread_service_principal" "sp" {
  application_id                = azuread_application.aks_sp.application_id
  app_role_assignment_required  = false # default
}

# create random password
resource "random_password" "aks_rnd_sp_pwd" {
  length  = 16
  special = true
}

resource "azuread_service_principal_password" "aks_sp_pwd" {
  service_principal_id  = azuread_service_principal.sp.id
  value                 = random_password.aks_rnd_sp_pwd.result
  end_date              = "2099-01-01T01:01:01Z"
}

resource "azurerm_role_assignment" "aks_sp_role_assignment" {
  scope                = data.azurerm_subscription.current.id
  role_definition_name = data.azurerm_role_definition.builtin.name
  principal_id         = azuread_service_principal.sp.id

  depends_on = [
    azuread_service_principal_password.aks_sp_pwd
  ]
}

Мне нужен субъект службы в кластере, потому что кластер позже заполнен kubernetes с, а kubernetes нужен субъект службы, чтобы иметь роль участника для динамического c выделения диска. Я получил все это на работу, если я вручную создаю кластер и субъект службы, а затем освобождаю кластер. Но я работаю над тем, чтобы все это было выполнено с помощью terraform, который не работает с этой ошибкой.

Error: graphrbac.ApplicationsClient#Create: 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":"2020-04-29T16:27:42","message":{"lang":"en","value":"Insufficient privileges to complete the operation."},"requestId":"hash"}}]

Я добавил subscription_id, client_id, client_secret и tennant_id к provider "azuread" блок, но это, похоже, не решает проблему.

Все проблемы, которые я обнаружил, связанные с этим на github, похоже, содержат недействительные ссылки на документацию от Microsoft и Terraform.

github аналогичная проблема

Я уже создал роль Contributor rba c для подписки и добавил этого Azuread-провайдера, как указано выше. Есть ли шаги, которые мне не хватает? Нужно ли выполнить больше шагов по аутентификации cli? Я работаю через локальный PowerShell с аутентификацией azure с клиентом. Также могут помочь любые обновленные ссылки на документацию.

РЕДАКТИРОВАТЬ 1: Блок провайдера

provider "azurerm" {
  version = "~>2.7" # https://github.com/terraform-providers/terraform-provider-azurerm/blob/master/CHANGELOG.md
  features {}
}

provider "azuread" {
  version = "~>0.8.0" # https://github.com/terraform-providers/terraform-provider-azuread/blob/master/CHANGELOG.md

  subscription_id = "subscription_id"
  client_id       = "app_id" # "appId"
  client_secret   = "password"
  tenant_id       = "tennant_id" # "appOwnerTenantId"
}

provider "kubernetes" {
  load_config_file        = false
  host                    = azurerm_kubernetes_cluster.cluster_1.kube_config.0.host
  username                = azurerm_kubernetes_cluster.cluster_1.kube_config.0.username
  password                = azurerm_kubernetes_cluster.cluster_1.kube_config.0.password
  client_certificate      = base64decode(azurerm_kubernetes_cluster.cluster_1.kube_config.0.client_certificate)
  client_key              = base64decode(azurerm_kubernetes_cluster.cluster_1.kube_config.0.client_key)
  cluster_ca_certificate  = base64decode(azurerm_kubernetes_cluster.cluster_1.kube_config.0.cluster_ca_certificate)
}

1 Ответ

0 голосов
/ 30 апреля 2020

См. документ terraform , обратите внимание, что

Если вы проходите аутентификацию с использованием принципала службы, у него должны быть разрешения на чтение и запись, принадлежащие приложениям, и вход в систему. и прочитайте профиль пользователя в Windows Azure API-интерфейсе Active Directory.

Вы можете убедиться, что у субъекта-службы, который вы используете для аутентификации Azure, у поставщика объявлений есть достаточные привилегии для завершения операция. Обратитесь к https://github.com/terraform-providers/terraform-provider-azuread/issues/35#issuecomment -479116655

В этом случае вы можете обратиться к аутентификации на Azure с использованием принципала службы с секретом клиента для получения более подробной информации. Вы можете создать принципала службы, который будет иметь полномочия для управления ресурсами в указанной подписке, используя следующую команду:

az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/SUBSCRIPTION_ID"

Для меня я просто оставляю блок провайдера «azurerm» и удаляю провайдера «azuread» Блок, это будет работать. Для получения дополнительной информации: Создание кластера Kubernetes с AKS и Terraform

...