Migrar recursos do Terraform de organizationSecurityPolicies para firewallPolicies

O Google recomenda usar os métodos firewallPolicies para configurar políticas do Cloud Next Generation Firewall. Este documento orienta você na migração das configurações do Terraform para usar os métodos firewallPolicies em vez dos métodos organizationSecurityPolicies.

Os métodos firewallPolicies oferecem opções de gerenciamento organizacional com controles refinados. Recomendamos os métodos firewallPolicies para gerenciamento de recursos usando o Terraform. Este documento pressupõe que você conhece as práticas recomendadas e as operações básicas do Terraform.

As políticas de firewall permitem agrupar várias regras de firewall que podem negar ou permitir conexões explicitamente. Para mais informações sobre políticas de firewall, consulte Políticas de firewall.

Benefícios da migração para métodos firewallPolicies

Os métodos firewallPolicies oferecem uma experiência de firewall consistente em toda a hierarquia de recursosGoogle Cloud e vários benefícios operacionais.

  • Segurança organizacional avançada: os métodos firewallPolicies aplicam a segurança da organização usando controles avançados de permissão do Identity and Access Management (IAM).

  • Facilidade de operações: os métodos firewallPolicies são compatíveis com o uso de recursos avançados, como objetos de nome de domínio totalmente qualificado (FQDN), objetos de geolocalização, detecção de ameaças, prevenção de invasões e grupos de endereços, para facilitar e aumentar a eficiência operacional.

Como funciona a migração

Antes de iniciar o processo de migração, conclua as etapas a seguir, descritas na seção Antes de começar:

  • Use a versão 4.0.0 ou mais recente do provedor Terraform para Google Cloud.
  • Verifique se o estado do Terraform corresponde à configuração atual.
  • Identifique os recursos no escopo da migração, incluindo políticas, regras e associações.
  • Prepare comandos para importar os novos recursos firewallPolicies para o estado do Terraform manualmente ou usando um script automatizado.
  • Revise os procedimentos recomendados de backup e recuperação para sua versão do Terraform e crie um backup do estado atual do Terraform.

O processo de reconfiguração do Terraform para migrar os recursos do organizationSecurityPolicies inclui estas etapas:

  1. Remova os recursos atuais do estado do Terraform. Remova os recursos organizationSecurityPolicies atuais do estado do Terraform.

  2. Atualize a configuração do Terraform. Edite os arquivos de configuração do Terraform para substituir o tipo, os nomes e os atributos de recursos atuais pelos novos.

  3. Importe novos recursos para o estado do Terraform. Importe os novos recursos firewallPolicies para o estado do Terraform.

Antes de começar

Nesta seção, explicamos os pré-requisitos para o processo de migração.

Verificar se o provedor do Terraform é compatível

Use a versão 4.0.0 ou mais recente do provedor do Terraform para Google Cloud, que inclui os seguintes recursos do registro do Terraform:

Verificar se o estado do Terraform está atualizado

Execute o seguinte comando do Terraform para verificar se o estado do Terraform corresponde à configuração atual.

terraform plan

Para evitar inconsistências, recomendamos que você aplique as mudanças ou ações pendentes antes de prosseguir com o processo de migração.

Identificar os recursos que serão migrados

Execute o seguinte comando do Terraform para gerar uma lista de recursos no escopo da migração, incluindo políticas, regras e associações.

terraform state list | grep ^google_compute_organization_security_policy

O resultado será assim:

google_compute_organization_security_policy.policy
google_compute_organization_security_policy_association.association["folders/45678"]
google_compute_organization_security_policy_rule.rule["allow-inbound-ssh"]
google_compute_organization_security_policy_rule.rule["deny-all-egress"]

Você precisa desses recursos para migrar para os métodos firewallPolicies. Salve-os para mais tarde.

Preparar comandos de importação usando um script automatizado

Para evitar erros ou configurações perdidas durante a migração, recomendamos usar um script automatizado para gerar os comandos necessários para importar os recursos firewallPolicies para o estado do Terraform.

Execute o seguinte script do Terraform para realizar essas tarefas:

  • Gere novos endereços de recursos com base nos atuais.
  • Extraia os identificadores (ou IDs) dos recursos dos endereços atuais.
  • Gere identificadores de importação (ou IDs de importação) com base nos IDs de recursos.
  • Mostre os comandos de importação para todos os novos recursos firewallPolicies.
terraform state list | grep ^google_compute_organization_security_policy | while read -r resource_address; do
# Generate the new resource address for google_compute_firewall_policy
new_address=$(echo "$resource_address" | sed 's/google_compute_organization_security_policy/google_compute_firewall_policy/')

# Get the full resource ID from terraform state and remove quotes
resource_id=$(echo "$resource_address.id" | terraform console | tr -d '"')

# Use awk to parse the resource_id and generate the correct import identifier
import_id=$(echo "$resource_id" | awk -F'/' '
  /association/ {
    split($0, a, "/association/");
    assoc_name = a[2];
    gsub(/\//, "%2F", assoc_name);
    print $4 "/" assoc_name;
    next
  }
  /priority/ {
    print $4 "/" $6;
    next
  }
  {
    print $4
  }
')

# Print the final import command
echo "terraform import '$new_address' '$import_id'"
done

Você precisa da saída desse script para importar os recursos. Salve a saída para mais tarde.

Preparar comandos de importação manualmente

Se a abordagem automatizada não for viável, gere os comandos para importar os recursos firewallPolicies manualmente. Use o comando terraform console para receber os identificadores (IDs) dos recursos.

O comando do Terraform a seguir mostra o ID do recurso google_compute_organization_security_policy.policy:

echo google_compute_organization_security_policy.policy.id | terraform console

O resultado será assim:

"locations/global/securityPolicies/12345"

Da mesma forma, obtenha os IDs dos outros recursos identificados na seção Identificar recursos para migrar.

Como alternativa, use o seguinte comando do Terraform para receber os IDs de todos os recursos identificados:

terraform state list | grep ^google_compute_organization_security_policy | while read -r line; do echo "$line".id | terraform console; done

O resultado será assim:

"locations/global/securityPolicies/12345"
"locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789"
"locations/global/securityPolicies/12345/priority/1000"
"locations/global/securityPolicies/12345/priority/65535"

Para importar os recursos firewallPolicies, você precisa dos IDs de importação deles. Os IDs de importação são compostos por um identificador numérico chamado número da política, um nome de associação e um número de prioridade da regra, conforme descrito nesta seção.

  • O identificador numérico após o terceiro caractere de barra (/) é o número da política, que representa o ID de importação das políticas. A tabela a seguir mostra um exemplo de ID de recurso e ID de importação para uma política.

    ID do recurso ID da importação
    "locations/global/securityPolicies/12345" 12345
  • O número da política e o nome da associação representam o ID de importação das associações. Um nome de associação é a parte do ID do recurso mostrada após o elemento /association/.

    Substitua qualquer caractere de barra (/) no nome da associação por %2F para permitir que o comando terraform import interprete o nome da associação como uma única entidade. A tabela a seguir mostra exemplos de ID de recurso e ID de importação para associações.

    ID do recurso ID da importação
    "locations/global/securityPolicies/12345/association/assoc-name" 12345/assoc-name
    "locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789" 12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789
  • O número da política e o número de prioridade da regra representam o ID de importação das regras. A tabela a seguir mostra um exemplo de ID de recurso e ID de importação para uma regra.

    ID do recurso ID da importação
    "locations/global/securityPolicies/12345/priority/1000" 12345/1000

Para importar os recursos firewallPolicies, você precisa dos nomes de instância de recurso atualizados. Gere os nomes das instâncias de recursos substituindo o prefixo google_compute_organization_security_policy por google_compute_firewall_policy para todos os recursos identificados na seção Identificar recursos para migrar. A lista a seguir mostra um exemplo dos nomes de instâncias de recursos atualizados:

google_compute_firewall_policy.policy
google_compute_firewall_policy_association.association["folders/45678"]
google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]
google_compute_firewall_policy_rule.rule["deny-all-egress"]

Combine os nomes das instâncias de recursos com os IDs de importação associados para obter os comandos terraform import. A lista a seguir mostra um exemplo dos comandos terraform import:

terraform import 'google_compute_firewall_policy.policy' '12345'
terraform import 'google_compute_firewall_policy_association.association["folders/23456"]' '12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789'
terraform import 'google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]' '12345/1000'
terraform import 'google_compute_firewall_policy_rule.rule["deny-all-egress"]' '12345/65535'

Salve esses comandos de importação para referência futura.

Fazer backup do estado do Terraform

Antes de prosseguir com o processo de migração, recomendamos que você crie um backup do estado do Terraform. Use o seguinte comando do Terraform para criar um backup no arquivo terraform.tfstate.backup.

terraform state pull > terraform.tfstate.backup

Se você mudar o estado do Terraform de maneiras não intencionais, use o arquivo de backup terraform.tfstate.backup para restaurar o estado original do Terraform com o comando a seguir:

terraform state push terraform.tfstate.backup

Migrar organizationSecurityPolicies recursos

Esta seção explica o procedimento para migrar suas configurações do Terraform dos métodos organizationSecurityPolicies para os métodos firewallPolicies.

Remover recursos atuais do estado do Terraform

Para remover os recursos organizationSecurityPolicies encontrados na seção Identificar recursos para migrar do estado do Terraform, execute o seguinte comando do Terraform.

terraform state list | grep ^google_compute_organization_security_policy | while read -r resource; do
  terraform state rm "$resource"
done

Atualizar a configuração do Terraform

Para atualizar o arquivo de configuração do Terraform, encontre as definições dos recursos que você encontrou na seção Identificar recursos para migrar. Use o comando a seguir para encontrar as definições.

grep -r google_compute_organization_security_policy .

Por exemplo, o arquivo de configuração do Terraform define a política google_compute_organization_security_policy.policy da seguinte maneira:

resource "google_compute_organization_security_policy" "policy" {
  …
  }

Use a tabela a seguir para editar a definição de um recurso de política de segurança da organização e criar um recurso de política de firewall hierárquica.

Recurso do Terraform atual Novo recurso do Terraform
Nome do recurso google_compute_organization_security_policy google_compute_firewall_policy
Nome do campo na política display_name short_name

Use a tabela a seguir para editar a definição de um recurso de associação de política de segurança da organização e criar um novo recurso de associação de política de firewall hierárquica.

Recurso do Terraform atual Novo recurso do Terraform
Nome do recurso google_compute_organization_security_policy_association google_compute_firewall_policy_association
Nome do campo na associação policy_id firewall_policy
Nome do campo na associação attachment_id attachment_target

Use a tabela a seguir para editar a definição de um recurso de regra de política de segurança da organização e criar um recurso de regra de política hierárquica de firewall.

Recurso do Terraform atual Novo recurso do Terraform
Nome do recurso google_compute_organization_security_policy_rule google_compute_firewall_policy_rule
Nome do campo na regra policy_id (ID da política de segurança) firewall_policy
Nome do campo removido da regra versioned_expr — (o campo não existe)
Definição do objeto match: Remova o conjunto config e mude layer4_config para layer4_configs
match {
  config {
    src_ip_ranges = SRC_IP_RANGES
    dest_ip_ranges = DEST_IP_RANGES
    layer4_config {
      ip_protocol = IP_PROTOCOL
      ports = [PORT1, PORT2]
    }
    layer4_config {
      ip_protocol = IP_PROTOCOL
    }
  }
}
  
match {
  src_ip_ranges = SRC_IP_RANGES
  dest_ip_ranges = DEST_IP_RANGES
  layer4_configs {
    ip_protocol = IP_PROTOCOL
    ports = [PORT1, PORT2]
  }
  layer4_configs {
    ip_protocol = IP_PROTOCOL
  }
}
  
Nome do campo na regra layer4_config layer4_configs

Use o comando do Terraform a seguir para verificar se a configuração modificada do Terraform é válida:

terraform validate

Importar recursos para o estado do Terraform

Para importar recursos firewallPolicies para seu arquivo de configuração do Terraform, execute os comandos de importação do Terraform gerados na seção Preparar comandos de importação usando um script automatizado ou Preparar comandos de importação manualmente.

Depois de importar os recursos do firewallPolicies, o Terraform acessa esses recursos usando os métodos firewallPolicies.

Verificar a configuração do Terraform e corrigir discrepâncias

Execute o seguinte comando do Terraform para verificar se há ações.

terraform plan

Como a migração não muda nenhum recurso Google Cloud subjacente, o plano criado pelo Terraform não pode conter ações.

Por exemplo, na saída a seguir, obtida ao executar o comando terraform plan, as ações do Terraform indicam que o name no recurso google_compute_firewall_policy_association precisa ser atualizado.

Terraform will perform the following actions:

 # google_compute_firewall_policy_association.association["folders/23456"] must be replaced
-/+ resource "google_compute_firewall_policy_association" "association" {
    ~ firewall_policy   = "12345" -> "locations/global/firewallPolicies/12345"
    ~ id                = "locations/global/firewallPolicies/12345/associations/locations%2Fglobal%2FsecurityPolicies%2F12345-folders%2F23456" -> (known after apply)
    ~ name              = "locations/global/securityPolicies/12345-folders/23456" -> "locations/global/firewallPolicies/12345-folders/23456" # forces replacement
    + short_name        = (known after apply)
      # (1 unchanged attribute hidden)
  }

Nesse caso, verifique e atualize o arquivo de configuração do Terraform para que o atributo name seja consistente com o nome já instalado.

É possível configurar o Terraform para mudar o name esperado no recurso google_compute_firewall_policy_association para o valor original locations/global/securityPolicies/12345-folders/23456 substituindo o campo name na configuração da seguinte maneira:

name = "${replace(local.policy_id, "firewallPolicies", "securityPolicies")}-${each.value}"

A mudança anterior usa a função "replace" para atualizar o valor de local.policy_id para securityPolicies em vez de firewallPolicies. Como o Terraform agora espera locations/global/securityPolicies/12345-folders/23456 para o atributo name, a execução de terraform plan não mostra mais a ação do Terraform relacionada ao atributo name.

Se o comando terraform plan não indicar nenhuma mudança ou ação do Terraform, a migração estará concluída.

A seguir