Migra recursos de Terraform de organizationSecurityPolicies a firewallPolicies

Google recomienda usar los métodos firewallPolicies para configurar políticas del Firewall de nueva generación de Cloud. En este documento, se explica cómo migrar tus configuraciones de Terraform para usar los métodos de firewallPolicies en lugar de los métodos de organizationSecurityPolicies.

Los métodos firewallPolicies proporcionan opciones de administración de la organización con controles detallados. Recomendamos los métodos firewallPolicies para la administración de recursos con Terraform. En este documento, se supone que conoces las prácticas recomendadas y las operaciones básicas de Terraform.

Las políticas de firewall te permiten agrupar varias reglas de firewall que pueden rechazar o permitir las conexiones de forma explícita. Para obtener más información sobre las políticas de firewall, consulta Políticas de firewall.

Beneficios de migrar a los métodos de firewallPolicies

Los métodos de firewallPolicies ofrecen una experiencia de firewall coherente en toda la jerarquía de recursos deGoogle Cloud y ofrecen varios beneficios operativos.

  • Seguridad mejorada de la organización: Los métodos de firewallPolicies aplican seguridad a la organización con controles avanzados de permisos de Identity and Access Management (IAM).

  • Facilidad de operaciones: Los métodos firewallPolicies admiten el uso de funciones avanzadas, como objetos de nombre de dominio completamente calificados (FQDN), objetos de ubicación geográfica, detección de amenazas, prevención de intrusiones y grupos de direcciones, para facilitar y optimizar las operaciones.

Cómo funciona la migración

Antes de comenzar el proceso de migración, debes completar los siguientes pasos, que se describen en la sección Antes de comenzar:

  • Asegúrate de usar la versión 4.0.0 o una posterior del proveedor de Terraform para Google Cloud.
  • Asegúrate de que el estado de Terraform coincida con la configuración actual.
  • Identifica los recursos que se encuentran dentro del alcance de la migración, incluidas las políticas, las reglas y las asociaciones.
  • Prepara comandos para importar los nuevos recursos firewallPolicies al estado de Terraform de forma manual o con una secuencia de comandos automatizada.
  • Revisa los procedimientos recomendados de copia de seguridad y recuperación para tu versión de Terraform, y crea una copia de seguridad de tu estado actual de Terraform.

El proceso de reconfiguración de Terraform para migrar los recursos de organizationSecurityPolicies incluye los siguientes pasos:

  1. Quita los recursos existentes del estado de Terraform. Quita los recursos organizationSecurityPolicies existentes del estado de Terraform.

  2. Actualiza la configuración de Terraform. Edita los archivos de configuración de Terraform para reemplazar el tipo, los nombres y los atributos de recursos existentes por los nuevos.

  3. Importa recursos nuevos al estado de Terraform. Importa los nuevos recursos de firewallPolicies al estado de Terraform.

Antes de comenzar

En esta sección, se explican los requisitos previos para el proceso de migración.

Asegúrate de que el proveedor de Terraform sea compatible

Asegúrate de usar la versión 4.0.0 o una posterior del proveedor de Terraform paraGoogle Cloud, que incluye los siguientes recursos del registro de Terraform:

Asegúrate de que el estado de Terraform esté actualizado

Ejecuta el siguiente comando de Terraform para verificar que el estado de Terraform coincida con la configuración actual.

terraform plan

Para evitar incoherencias, te recomendamos que apliques los cambios o las acciones pendientes antes de continuar con el proceso de migración.

Identifica los recursos que se migrarán

Ejecuta el siguiente comando de Terraform para generar una lista de los recursos que se encuentran dentro del alcance de la migración, incluidas las políticas, las reglas y las asociaciones.

terraform state list | grep ^google_compute_organization_security_policy

El resultado es similar a este:

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

Necesitas estos recursos para migrar a los métodos de firewallPolicies. Guárdalas para más adelante.

Prepara comandos de importación con una secuencia de comandos automatizada

Para evitar errores o configuraciones perdidas durante la migración, te recomendamos que uses una secuencia de comandos automatizada para generar los comandos necesarios para importar los recursos de firewallPolicies al estado de Terraform.

Ejecuta la siguiente secuencia de comandos de Terraform para realizar estas tareas:

  • Genera direcciones de recursos nuevas a partir de las existentes.
  • Obtén los identificadores de recursos (o IDs de recursos) de las direcciones de recursos existentes.
  • Genera identificadores de importación (o IDs de importación) a partir de los IDs de recursos.
  • Muestra los comandos de importación para todos los recursos firewallPolicies nuevos.
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

Necesitas el resultado de esta secuencia de comandos para importar los recursos. Guarda el resultado para usarlo más adelante.

Prepara comandos de importación de forma manual

Si el enfoque automatizado no es factible, puedes generar los comandos para importar los recursos de firewallPolicies de forma manual. Puedes usar el comando terraform console para obtener los identificadores (IDs) de los recursos.

El siguiente comando de Terraform muestra el ID del recurso google_compute_organization_security_policy.policy:

echo google_compute_organization_security_policy.policy.id | terraform console

El resultado es similar a este:

"locations/global/securityPolicies/12345"

Del mismo modo, obtén los IDs de recurso de los otros recursos que identificaste en la sección Identifica los recursos que se migrarán.

Como alternativa, puedes usar el siguiente comando de Terraform para obtener los IDs de todos los recursos identificados juntos:

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

El resultado es similar a este:

"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 los recursos de firewallPolicies, necesitas sus IDs de importación. Los IDs de importación se componen de un identificador numérico llamado número de política, un nombre de asociación y un número de prioridad de regla, como se describe en esta sección.

  • El identificador numérico que se encuentra después del tercer carácter de barra diagonal (/) es el número de política, que representa el ID de importación de las políticas. En la siguiente tabla, se muestra un ejemplo de un ID de recurso y un ID de importación para una política.

    ID de recurso ID de importación
    "locations/global/securityPolicies/12345" 12345
  • El número de política junto con el nombre de la asociación representa el ID de importación de las asociaciones. Un nombre de asociación es la parte del ID del recurso que se muestra después del elemento /association/.

    Reemplaza cualquier carácter de barra diagonal (/) en el nombre de la asociación por %2F para permitir que el comando terraform import interprete el nombre de la asociación como una sola entidad. En la siguiente tabla, se muestran ejemplos de ID de recurso y de importación para las asociaciones.

    ID de recurso ID de importación
    "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
  • El número de política junto con el número de prioridad de la regla representan el ID de importación de las reglas. En la siguiente tabla, se muestra un ejemplo de un ID de recurso y un ID de importación para una regla.

    ID de recurso ID de importación
    "locations/global/securityPolicies/12345/priority/1000" 12345/1000

Para importar los recursos firewallPolicies, necesitas los nombres de instancias de recursos actualizados. Genera los nombres de las instancias de recursos reemplazando el prefijo google_compute_organization_security_policy por google_compute_firewall_policy para todos los recursos que identificaste en la sección Identifica los recursos que se migrarán. En la siguiente lista, se muestra un ejemplo de los nombres de instancias de recursos actualizados:

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

Combina los nombres de las instancias de recursos con los IDs de importación asociados para obtener los comandos terraform import. En la siguiente lista, se muestra un ejemplo de los 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'

Guarda estos comandos de importación para consultarlos más adelante.

Crea una copia de seguridad del estado de Terraform

Antes de continuar con el proceso de migración, te recomendamos que crees una copia de seguridad del estado de Terraform. Usa el siguiente comando de Terraform para crear una copia de seguridad en el archivo terraform.tfstate.backup.

terraform state pull > terraform.tfstate.backup

Si cambias el estado de Terraform de formas no deseadas, puedes usar el archivo de copia de seguridad terraform.tfstate.backup para restablecer el estado original de Terraform con el siguiente comando:

terraform state push terraform.tfstate.backup

Migra recursos de organizationSecurityPolicies

En esta sección, se explica el procedimiento para migrar tus configuraciones de Terraform de los métodos organizationSecurityPolicies a los métodos firewallPolicies.

Quita recursos existentes del estado de Terraform

Para quitar los recursos organizationSecurityPolicies que se encuentran en la sección Identifica los recursos que se migrarán del estado de Terraform, ejecuta el siguiente comando de Terraform.

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

Actualiza la configuración de Terraform

Para actualizar tu archivo de configuración de Terraform, busca las definiciones de los recursos que encontraste en la sección Identifica los recursos que se migrarán. Usa el siguiente comando para encontrar las definiciones.

grep -r google_compute_organization_security_policy .

Por ejemplo, el archivo de configuración de Terraform define la política google_compute_organization_security_policy.policy de la siguiente manera:

resource "google_compute_organization_security_policy" "policy" {
  …
  }

Usa la siguiente tabla para editar la definición de un recurso de política de seguridad de la organización y crear un nuevo recurso de política jerárquica de firewall.

Recurso de Terraform existente Nuevo recurso de Terraform
Nombre del recurso google_compute_organization_security_policy google_compute_firewall_policy
Nombre del campo en la política display_name short_name

Usa la siguiente tabla para editar la definición de un recurso de asociación de política de seguridad de la organización y crear un nuevo recurso de asociación de política jerárquica de firewall.

Recurso de Terraform existente Nuevo recurso de Terraform
Nombre del recurso google_compute_organization_security_policy_association google_compute_firewall_policy_association
Nombre del campo en la asociación policy_id firewall_policy
Nombre del campo en la asociación attachment_id attachment_target

Usa la siguiente tabla para editar la definición de un recurso de regla de política de seguridad de la organización y crear un nuevo recurso de regla de política de firewall jerárquica.

Recurso de Terraform existente Nuevo recurso de Terraform
Nombre del recurso google_compute_organization_security_policy_rule google_compute_firewall_policy_rule
Nombre del campo en la regla policy_id (ID de política de seguridad) firewall_policy
Nombre del campo quitado de la regla versioned_expr — (el campo no existe)
Definición del objeto match: Quita el conjunto config y cambia layer4_config a 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
  }
}
  
Nombre del campo en la regla layer4_config layer4_configs

Puedes usar el siguiente comando de Terraform para verificar si la configuración modificada de Terraform es válida:

terraform validate

Importa recursos al estado de Terraform

Para importar recursos de firewallPolicies a tu archivo de configuración de Terraform, ejecuta los comandos de importación de Terraform que generaste en la sección Prepara los comandos de importación con una secuencia de comandos automatizada o Prepara los comandos de importación de forma manual.

Después de importar los recursos de firewallPolicies, Terraform accede a ellos con los métodos de firewallPolicies.

Verifica tu configuración de Terraform y corrige las discrepancias

Ejecuta el siguiente comando de Terraform para verificar si hay acciones.

terraform plan

Dado que la migración no cambia ningún recurso Google Cloud subyacente, el plan que crea Terraform no debe contener ninguna acción.

Por ejemplo, en el siguiente resultado que se obtiene al ejecutar el comando terraform plan, las acciones de Terraform indican que se debe actualizar el name en el recurso google_compute_firewall_policy_association.

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)
  }

En este caso, debes verificar y actualizar el archivo de configuración de Terraform de modo que el atributo name sea coherente con el nombre que ya está instalado.

Puedes configurar Terraform para que cambie el name esperado en el recurso google_compute_firewall_policy_association a su valor original locations/global/securityPolicies/12345-folders/23456 reemplazando el campo name en la configuración de la siguiente manera:

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

El cambio anterior usa la función de reemplazo para actualizar el valor de local.policy_id a securityPolicies en lugar de firewallPolicies. Dado que Terraform ahora espera locations/global/securityPolicies/12345-folders/23456 para el atributo name, ejecutar terraform plan ya no muestra la acción de Terraform relacionada con el atributo name.

Si el comando terraform plan no indica ningún cambio ni acciones de Terraform, la migración se completó.

¿Qué sigue?