Migre recursos do Terraform de organizationSecurityPolicies para firewallPolicies

A Google recomenda a utilização dos métodos firewallPolicies para configurar as políticas de firewall de nova geração da nuvem. Este documento explica como migrar as suas configurações do Terraform para usar os métodos firewallPolicies em vez dos métodos organizationSecurityPolicies.

Os métodos firewallPolicies oferecem opções de gestão organizacional com controlos detalhados. Recomendamos os firewallPoliciesmétodos de gestão de recursos através do Terraform. Este documento pressupõe que tem familiaridade com as práticas recomendadas do Terraform e as operações básicas do Terraform.

As políticas de firewall permitem-lhe agrupar várias regras de firewall que podem negar ou permitir explicitamente ligações. Para mais informações acerca das políticas de firewall, consulte o artigo Políticas de firewall.

Vantagens da migração para os métodos firewallPolicies

Os métodos firewallPolicies oferecem uma experiência de firewall consistente em toda a hierarquia de recursos e oferecem várias vantagens operacionais.Google Cloud

  • Segurança da organização melhorada: os métodos firewallPolicies aplicam a segurança da organização através de controlos avançados de autorização da gestão de identidade e de acesso (IAM).

  • Facilidade de operações: os métodos firewallPolicies suportam a utilização de funcionalidades avançadas, como objetos de nome de domínio totalmente qualificado (FQDN), objetos de geolocalização, deteção de ameaças, prevenção de intrusões e grupos de endereços, para facilitar e tornar mais eficientes as operações.

Como funciona a migração

Antes de iniciar o processo de migração, tem de concluir os seguintes passos, descritos na secção Antes de começar:

  • Certifique-se de que está a usar a versão 4.0.0 ou posterior do fornecedor Terraform para Google Cloud.
  • Certifique-se de que o estado do Terraform corresponde à configuração atual.
  • Identifique os recursos que estão no âmbito 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 através de um script automatizado.
  • Reveja os procedimentos de cópia de segurança e recuperação recomendados para a sua versão do Terraform e crie uma cópia de segurança do estado atual do Terraform.

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

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

  2. Atualize a configuração do Terraform. Edite os ficheiros de configuração do Terraform para substituir o tipo de recurso, os nomes e os atributos existentes pelo novo tipo de recurso, nomes e atributos.

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

Antes de começar

Esta secção explica os pré-requisitos para o processo de migração.

Certifique-se de que o fornecedor do Terraform é suportado

Certifique-se de que está a usar a versão 4.0.0 ou posterior do fornecedor Terraform para Google Cloud, que inclui os seguintes recursos do registo Terraform:

Certifique-se de que 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 aplique as alterações ou as ações pendentes antes de avançar com o processo de migração.

Identifique os recursos a migrar

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

terraform state list | grep ^google_compute_organization_security_policy

O resultado é semelhante ao seguinte:

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"]

Precisa destes recursos para migrar para os métodos firewallPolicies. Guardá-los para mais tarde.

Prepare comandos de importação com um script automatizado

Para evitar erros ou configurações em falta durante a migração, recomendamos que use 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 estas tarefas:

  • Gerar novas moradas de recursos a partir das moradas de recursos existentes.
  • Obtenha identificadores de recursos (ou IDs de recursos) a partir dos endereços de recursos existentes.
  • Gerar identificadores de importação (ou IDs de importação) a partir dos IDs de recursos.
  • Apresentar 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

Precisa do resultado deste script para importar os recursos. Guarde o resultado para mais tarde.

Prepare comandos de importação manualmente

Se a abordagem automática não for viável, pode gerar os comandos para importar os recursos firewallPolicies manualmente. Pode usar o comando terraform console para obter os identificadores (IDs) dos recursos.

O seguinte comando do Terraform apresenta o ID do recurso do recurso google_compute_organization_security_policy.policy:

echo google_compute_organization_security_policy.policy.id | terraform console

O resultado é semelhante ao seguinte:

"locations/global/securityPolicies/12345"

Da mesma forma, obtenha os IDs dos recursos que identificou na secção Identifique os recursos a migrar.

Em alternativa, pode usar o seguinte comando do Terraform para obter os IDs dos recursos de todos os recursos identificados em conjunto:

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

O resultado é semelhante ao seguinte:

"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, precisa dos respetivos IDs de importação. Os IDs de importação são compostos por um identificador numérico denominado número de apólice, um nome de associação e um número de prioridade da regra, conforme descrito nesta secção.

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

    ID do recurso ID de importação
    "locations/global/securityPolicies/12345" 12345
  • O número da política, juntamente com o nome da associação, representa o ID de importação das associações. O nome de uma associação é a parte do ID do recurso apresentada após o elemento /association/.

    Substitua qualquer caráter 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 seguinte mostra exemplos de ID do recurso e ID de importação para associações.

    ID do recurso ID de 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 de apólice, juntamente com o número de prioridade da regra, representa o ID de importação das regras. A tabela seguinte mostra um exemplo de um ID do recurso e um ID de importação para uma regra.

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

Para importar os recursos firewallPolicies, precisa dos respetivos nomes de instâncias de recursos 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 que identificou na secção Identifique os recursos a migrar. A lista seguinte mostra um exemplo dos nomes das 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 seguinte 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'

Guarde estes comandos de importação para referência futura.

Faça uma cópia de segurança do estado do Terraform

Antes de avançar com o processo de migração, recomendamos que crie uma cópia de segurança do estado do Terraform. Use o seguinte comando do Terraform para criar uma cópia de segurança no ficheiro terraform.tfstate.backup.

terraform state pull > terraform.tfstate.backup

Se alterar o estado do Terraform de formas não intencionais, pode usar o ficheiro de cópia de segurança terraform.tfstate.backup para restaurar o estado original do Terraform com o seguinte comando:

terraform state push terraform.tfstate.backup

Migre recursos do organizationSecurityPolicies

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

Remova recursos existentes do estado do Terraform

Para remover os recursos organizationSecurityPolicies encontrados na secção Identifique recursos a 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

Atualize a configuração do Terraform

Para atualizar o ficheiro de configuração do Terraform, encontre as definições dos recursos que encontrou na secção Identifique recursos a migrar. Use o seguinte comando para encontrar as definições.

grep -r google_compute_organization_security_policy .

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

resource "google_compute_organization_security_policy" "policy" {
  …
  }

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

Recurso do Terraform existente 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 seguinte para editar a definição de um recurso de associação de políticas de segurança da organização para criar um novo recurso de associação de políticas de firewall hierárquicas.

Recurso do Terraform existente 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 seguinte para editar a definição de um recurso de regra de política de segurança da organização para criar um novo recurso de regra de política de firewall hierárquica.

Recurso do Terraform existente 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 altere 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

Pode usar o seguinte comando do Terraform para verificar se a configuração do Terraform modificada é válida:

terraform validate

Importe recursos para o estado do Terraform

Para importar recursos firewallPolicies para o seu ficheiro de configuração do Terraform, execute os comandos de importação do Terraform que gerou na secção Prepare comandos de importação com um script automatizado ou Prepare comandos de importação manualmente.

Depois de importar os recursos firewallPolicies, o Terraform acede aos mesmos através dos métodos firewallPolicies.

Valide a configuração do Terraform e corrija as discrepâncias

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

terraform plan

Uma vez que a migração não altera os Google Cloud recursos subjacentes, o plano criado pelo Terraform não pode conter ações.

Por exemplo, no seguinte resultado obtido através da execução do comando terraform plan, as ações do Terraform indicam que o name no recurso google_compute_firewall_policy_association tem de 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)
  }

Neste caso, tem de validar e atualizar o ficheiro de configuração do Terraform de modo que o atributo name seja consistente com o nome que já está instalado.

Pode configurar o Terraform para alterar o name esperado no recurso google_compute_firewall_policy_association para o respetivo valor original locations/global/securityPolicies/12345-folders/23456 substituindo o campo name na configuração da seguinte forma:

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

A alteração anterior usa a função de substituição para atualizar o valor de local.policy_id para securityPolicies em vez de firewallPolicies. Uma vez que o Terraform espera agora locations/global/securityPolicies/12345-folders/23456 para o atributo name, a execução de terraform plan já não mostra a ação do Terraform relacionada com o atributo name.

Se o comando terraform plan não indicar alterações nem ações do Terraform, a migração está concluída.

O que se segue?