Migrar recursos de Terraform de organizationSecurityPolicies a firewallPolicies

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

Los métodos de firewallPolicies ofrecen opciones de gestión de organizaciones con controles detallados. Te recomendamos los firewallPoliciesmétodos de gestión de recursos con Terraform. En este documento se da por supuesto que conoces las prácticas recomendadas de Terraform y las operaciones básicas de Terraform.

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

Ventajas de migrar a los métodos de firewallPolicies

Los métodos firewallPolicies proporcionan una experiencia de firewall coherente en toda la jerarquía de recursosGoogle Cloud y ofrecen varias ventajas operativas.

  • Seguridad de la organización mejorada: los firewallPolicies métodos aplican la seguridad de la organización mediante controles de permisos avanzados de Gestión de Identidades y Accesos (IAM).

  • Facilidad de las operaciones: los métodos firewallPolicies admiten el uso de funciones avanzadas, como objetos de nombres de dominio completos (FQDN), objetos de geolocalización, 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 empezar el proceso de migración, debes completar los siguientes pasos, que se describen en la sección Antes de empezar:

  • Asegúrate de que estás usando 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 están en el ámbito de la migración, incluidas las políticas, las reglas y las asociaciones.
  • Prepara los comandos para importar los nuevos recursos de firewallPolicies al estado de Terraform manualmente o mediante una secuencia de comandos automatizada.
  • Consulta los procedimientos de copia de seguridad y recuperación recomendados 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. Elimina los recursos del estado de Terraform. Elimina los recursos organizationSecurityPolicies del estado de Terraform.

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

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

Antes de empezar

En esta sección se explican los requisitos previos del proceso de migración.

Comprobar que el proveedor de Terraform sea compatible

Asegúrate de que estás usando la versión 4.0.0 o una posterior del proveedor de Terraform para Google 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 comprobar que el estado de Terraform coincide 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.

Identificar los recursos que se van a migrar

Ejecuta el siguiente comando de Terraform para generar una lista de recursos que estén en el ámbito de la migración, incluidas las políticas, las reglas y las asociaciones.

terraform state list | grep ^google_compute_organization_security_policy

El resultado debería ser similar al siguiente:

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 firewallPolicies. Guárdalos para más tarde.

Preparar 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 nuevas direcciones de recursos a partir de las que ya tienes.
  • 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 recurso.
  • Muestra los comandos de importación de 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 la salida para más adelante.

Preparar comandos de importación manualmente

Si no puedes usar el método automático, puedes generar los comandos para importar los recursos de firewallPolicies manualmente. Puedes usar el comando terraform console para obtener los identificadores (IDs) de los recursos.

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

echo google_compute_organization_security_policy.policy.id | terraform console

El resultado debería ser similar al siguiente:

"locations/global/securityPolicies/12345"

Del mismo modo, obtenga los IDs de los demás recursos que haya identificado en la sección Identificar los recursos que se van a migrar.

También puedes usar el siguiente comando de Terraform para obtener los IDs de recursos de todos los recursos identificados a la vez:

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

El resultado debería ser similar al siguiente:

"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, tal como se describe en esta sección.

  • El identificador numérico que aparece después de la tercera barra (/) es el número de póliza, que representa el ID de importación de las pólizas. En la siguiente tabla se muestra un ejemplo de ID de recurso y de ID de importación de una política.

    ID de recurso Import ID
    "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. El nombre de una asociación es la parte del ID de recurso que se muestra después del elemento /association/.

    Sustituye cualquier barra diagonal (/) del nombre de la asociación por %2F para 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 e ID de importación de asociaciones.

    ID de recurso Import ID
    "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 representa el ID de importación de las reglas. En la siguiente tabla se muestra un ejemplo de ID de recurso y de ID de importación de una regla.

    ID de recurso Import ID
    "locations/global/securityPolicies/12345/priority/1000" 12345/1000

Para importar los recursos de firewallPolicies, necesitas los nombres de instancia de recurso actualizados. Genera los nombres de las instancias de recursos sustituyendo el prefijo google_compute_organization_security_policy por google_compute_firewall_policy en todos los recursos que hayas identificado en la sección Identificar los recursos que se van a migrar. En la siguiente lista se muestra un ejemplo de los nombres de las instancias de recursos actualizadas:

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 instancia de los 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 de 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.

Crear 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 forma no intencionada, puedes usar el archivo de copia de seguridad terraform.tfstate.backup para restaurar el estado original de Terraform con el siguiente comando:

terraform state push terraform.tfstate.backup

Migrar recursos de organizationSecurityPolicies

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

Eliminar recursos del estado de Terraform

Para eliminar los recursos organizationSecurityPolicies que se encuentran en la sección Identificar recursos que migrar 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

Actualizar la configuración de Terraform

Para actualizar el archivo de configuración de Terraform, busca las definiciones de los recursos que has encontrado en la sección Identificar recursos que migrar. 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 una organización y crear un recurso de política de cortafuegos jerárquica.

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

Usa la siguiente tabla para editar la definición de un recurso de asociación de políticas de seguridad de una organización y crear un recurso de asociación de políticas de cortafuegos jerárquicas.

Recurso de Terraform actual Nuevo recurso de Terraform
Nombre del recurso google_compute_organization_security_policy_association google_compute_firewall_policy_association
Nombre del campo de la asociación. policy_id firewall_policy
Nombre del campo de 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 una organización y crear un recurso de regla de política de cortafuegos jerárquica.

Recurso de Terraform actual Nuevo recurso de Terraform
Nombre del recurso google_compute_organization_security_policy_rule google_compute_firewall_policy_rule
Nombre del campo de la regla policy_id (ID de la política de seguridad) firewall_policy
Nombre del campo eliminado de la regla versioned_expr — (el campo no existe)
Definición del objeto match: Elimina 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 de la regla layer4_config layer4_configs

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

terraform validate

Importar 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 has generado en la sección Preparar comandos de importación con una secuencia de comandos automatizada o Preparar comandos de importación manualmente.

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

Verificar la configuración de Terraform y corregir las discrepancias

Ejecuta el siguiente comando de Terraform para comprobar si hay alguna acción.

terraform plan

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

Por ejemplo, en el siguiente resultado obtenido al ejecutar el comando terraform plan, las acciones de Terraform indican que el name del recurso google_compute_firewall_policy_association debe actualizarse.

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 para que el atributo name sea coherente con el nombre que ya está instalado.

Puedes configurar Terraform para cambiar el name esperado en el recurso google_compute_firewall_policy_association a su valor original locations/global/securityPolicies/12345-folders/23456 sustituyendo 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 sustitución para actualizar el valor de local.policy_id a securityPolicies en lugar de firewallPolicies. Como Terraform ahora espera locations/global/securityPolicies/12345-folders/23456 para el atributo name, al ejecutar terraform plan ya no se muestra la acción de Terraform relacionada con el atributo name.

Si el comando terraform plan no indica ningún cambio ni acción de Terraform, la migración se habrá completado.

Siguientes pasos