Запретить KeyVault обновлять секреты с помощью Terraform - PullRequest
1 голос
/ 17 июня 2020

Я создаю шаблон terraform для создания Azure ресурсов, включая Keyvault Secrets. Политика подписки клиента не позволяет никому обновлять / удалять / просматривать секреты хранилища ключей.

Если я запустил terraform apply в первый раз, он будет работать отлично. Однако повторный запуск того же шаблона приведет к следующей ошибке: Ошибка:

Error updating Key Vault "####" (Resource Group "####"): keyvault.VaultsClient#Update: Failure responding to request: StatusCode=403 --
Original Error: autorest/azure: Service returned an error. Status=403 Code="RequestDisallowedByPolicy" Message="Resource '###' was disallowed by policy. Policy identifiers: '[{\"policyAssignment\":{\"name\":\"###nis-deny-keyvault-acl\", ...

on ..\..\modules\azure\keyvault\main.tf line 15, in resource "azurerm_key_vault" "keyvault": 
15: resource "azurerm_key_vault" "keyvault" { 
  • Как я могу заставить мой CI / CD работать, если это означает, что приложение terraform будет работать постоянно?
  • Есть ли способ передать эту политику в terraform?
  • Есть ли способ запретить terraform обновлять KV после его создания (кроме блокировки ресурса)?

Вот модуль Keyvault:

variable "keyvault_id" { 
  type        = string
} 
variable "secrets" { 
  type        = map(string) 
} 


locals { 
  secret_names = keys(var.secrets) 
} 

resource "azurerm_key_vault_secret" "secret" { 
  count        = length(var.secrets) 
  name         = local.secret_names[count.index] 
  value        = var.secrets[local.secret_names[count.index]] 
  key_vault_id = var.keyvault_id 
} 

data "azurerm_key_vault_secret" "secrets" { 
  count        = length(var.secrets) 
  depends_on   = [azurerm_key_vault_secret.secret] 
  name         = local.secret_names[count.index] 
  key_vault_id = var.keyvault_id 
} 

output "keyvault_secret_attributes" { 
  value = [for i in range(length(azurerm_key_vault_secret.secret.*.id)) : data.azurerm_key_vault_secret.secrets[i]] 
} 

А вот модуль из моего шаблона:

locals { 
  secrets_map = { 
    appinsights-key     = module.app_insights.app_insights_instrumentation_key 
    storage-account-key  = module.storage_account.primary_access_key 
  }
  output_secret_map = { 
    for secret in module.keyvault_secrets.keyvault_secret_attributes : 
    secret.name => secret.id 
  } 
} 

module "keyvault" { 
  source              = "../../modules/azure/keyvault" 
  keyvault_name       = local.kv_name 
  resource_group_name = azurerm_resource_group.app_rg.name 
} 


module "keyvault_secrets" { 
  source      = "../../modules/azure/keyvault-secret" 
  keyvault_id = module.keyvault.keyvault_id 
  secrets     = local.secrets_map 
} 

module "app_service_keyvault_access_policy" { 
  source                  = "../../modules/azure/keyvault-policy" 
  vault_id                = module.keyvault.keyvault_id 
  tenant_id               = module.app_service.app_service_identity_tenant_id 
  object_ids              = module.app_service.app_service_identity_object_ids 
  key_permissions         = ["get", "list"] 
  secret_permissions      = ["get", "list"] 
  certificate_permissions = ["get", "list"] 
} 

1 Ответ

1 голос
/ 17 июня 2020

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

Если ваша цель - просто создать секреты в хранилище ключей, я бы просто используйте команды az keyvault , например:

az login
az keyvault secret set --name mySecret --vault-name myKeyvault --value mySecretValue

Оптимальным решением, конечно же, будет то, что ваш субъект службы, который вы используете для выполнения команд Terrafom, имеет достаточные права для выполнения действий, которые он был создан для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...