Configura VM Manager en toda una organización con Terraform

Para aplicar parámetros de configuración coherentes del sistema operativo y automatizar el cumplimiento en toda la jerarquía de recursos de Google Cloud , usa Terraform para configurar VM Manager a nivel de la organización.

En este documento, se explica cómo usar Terraform para habilitar automáticamente VM Manager (API de OS Config), establecer metadatos de instancias comunes y asignar políticas del SO en todos los proyectos de destino de tu jerarquía de recursos.

Para obtener una descripción general de los recursos de Terraform disponibles para VM Manager, consulta Aprovisiona recursos de VM Manager con Terraform.

Antes de comenzar

  • Si aún no lo hiciste, configura la autenticación. La autenticación verifica tu identidad para acceder a los servicios y las APIs de Google Cloud . Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Para usar las muestras de Terraform de esta página en un entorno de desarrollo local, instala e inicializa la gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Instala Google Cloud CLI.

    2. Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.

    3. Si usas una shell local, crea credenciales de autenticación locales para tu cuenta de usuario:

      gcloud auth application-default login

      No es necesario que lo hagas si usas Cloud Shell.

      Si se muestra un error de autenticación y usas un proveedor de identidad externo (IdP), confirma que accediste a gcloud CLI con tu identidad federada.

    Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

Antes de comenzar

Permisos de IAM obligatorios

Para habilitar automáticamente VM Manager y asignar políticas del SO en varios proyectos, la principal o la cuenta de servicio que ejecuta Terraform requiere permisos específicos de Identity and Access Management (IAM).

Permisos del proyecto de destino

Para obtener los permisos que necesitas para activar el servicio de VM Manager y establecer los metadatos del proyecto, pídele a tu administrador que te otorgue los siguientes roles de IAM en cada proyecto de destino:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para activar el servicio de VM Manager y configurar los metadatos del proyecto. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para activar el servicio de VM Manager y establecer los metadatos del proyecto:

  • serviceusage.services.enable
  • compute.projects.setCommonInstanceMetadata

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Configuración de la cuenta de servicio y el rol personalizado

Google recomienda que crees una cuenta de servicio dedicada para ejecutar tu automatización centralizada de Terraform.

Para otorgar los permisos necesarios a esta cuenta de servicio en varios proyectos, crea un rol personalizado de IAM a nivel de la organización:

  1. Crea un rol personalizado a nivel de la organización que incluya serviceusage.services.enable y compute.projects.setCommonInstanceMetadata.
  2. Otorga el rol personalizado a tu cuenta de servicio en el permiso aplicable más bajo, como el nivel de organización o carpeta. Por ejemplo, si todos tus proyectos de destino se encuentran dentro de una carpeta específica, otorga el rol a nivel de la carpeta.

Habilita VM Manager con Terraform

Para habilitar VM Manager y asignar políticas de SO en varios proyectos, usa uno de los siguientes enfoques automatizados: planos de proyectos dorados o administración centralizada de proyectos.

Usa planos de proyectos de referencia

Si tu organización usa un módulo de proyecto de Terraform estandarizado (un plano ideal) o un mecanismo aplicado de forma centralizada para aprovisionar proyectos, agrega las siguientes definiciones de recursos a tu plano del proyecto:

Para habilitar VM Manager, incluye los siguientes recursos de servicio y metadatos:

# Enable the OS Config API
resource "google_project_service" "osconfig" {
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

# Explicitly provision the OS Config Service Agent
resource "google_project_service_identity" "osconfig_identity" {
  provider = google-beta
  project  = google_project_service.osconfig.project
  service  = "osconfig.googleapis.com"
}

# Grant the required role to the explicitly provisioned Service Agent
resource "google_project_iam_member" "osconfig_service_agent_binding" {
  project = google_project_service.osconfig.project
  role    = "roles/osconfig.serviceAgent"
  member  = "serviceAccount:${google_project_service_identity.osconfig_identity.email}"
}

# Set project metadata to enable VM Manager
resource "google_compute_project_metadata_item" "enable_osconfig" {
  key   = "enable-osconfig"
  value = "TRUE"
}

Para implementar asignaciones de políticas del SO en todas las VMs aprovisionadas por el plano, agrega el siguiente recurso de asignación de políticas:

resource "google_os_config_os_policy_assignment" "base_security_policy" {
  name        = "base-security-ospolicy"
  description = "Ensure baseline security agent is installed and operational"
  location    = var.zone

  os_policies {
    id   = "no-op-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "sample"
        exec {
          validate {
            interpreter = "SHELL"
            script      = "exit 100"
          }
          enforce {
            interpreter = "SHELL"
            script      = "exit 100"
          }
        }
      }
    }
  }

  os_policies {
    id   = "install-security-agent"
    mode = "ENFORCEMENT"

    resource_groups {
      resources {
        id = "install-agent"
        pkg {
          desired_state = "INSTALLED"
          apt {
            name = "security-agent"
          }
          yum {
            name = "security-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

Administra todos los proyectos de forma centralizada

Si no corresponde modificar un plano de proyecto de referencia, puedes administrar de forma centralizada la habilitación de VM Manager y las asignaciones de políticas del SO en varios proyectos existentes con el argumento for_each de Terraform.

Para habilitar VM Manager en todos los proyectos objetivo, usa el argumento for_each para iterar sobre el mapa de tu proyecto:

resource "google_project_service" "osconfig" {
  for_each           = var.target_projects
  project            = each.key
  service            = "osconfig.googleapis.com"
  disable_on_destroy = false
}

resource "google_project_service_identity" "osconfig_identity" {
  provider = google-beta
  for_each = var.target_projects
  project  = google_project_service.osconfig[each.key].project
  service  = "osconfig.googleapis.com"
}

resource "google_project_iam_member" "osconfig_service_agent_binding" {
  for_each = var.target_projects
  project  = google_project_service.osconfig[each.key].project
  role     = "roles/osconfig.serviceAgent"
  member   = "serviceAccount:${google_project_service_identity.osconfig_identity[each.key].email}"
}

resource "google_compute_project_metadata_item" "enable_osconfig" {
  for_each = var.target_projects
  project  = each.key
  key      = "enable-osconfig"
  value    = "TRUE"
}

Para asignar una política del SO en todos los proyectos de destino, define el recurso de asignación de políticas con el argumento for_each:

resource "google_os_config_os_policy_assignment" "observability_agent_policy" {
  for_each    = var.target_projects
  project     = each.key
  name        = "observability-agent-ospolicy"
  description = "Install Google Cloud Observability agent on CentOS VMs across target projects"
  location    = var.zone

  os_policies {
    id   = "setup-repo-and-install-package-policy"
    mode = "ENFORCEMENT"

    resource_groups {
      inventory_filters {
        os_short_name = "centos"
        os_version    = "8"
      }

      resources {
        id = "setup-repo"
        repository {
          yum {
            id           = "google-cloud-ops-agent"
            display_name = "Google Cloud Ops Agent Repository"
            base_url     = "https://packages.cloud.google.com/yum/repos/google-cloud-ops-agent-el8-x86_64-all"
            gpg_keys = [
              "https://packages.cloud.google.com/yum/doc/yum-key.gpg",
              "https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg",
            ]
          }
        }
      }

      resources {
        id = "install-pkg"
        pkg {
          desired_state = "INSTALLED"
          yum {
            name = "google-cloud-ops-agent"
          }
        }
      }
    }
  }

  instance_filter {
    all = true
  }

  rollout {
    disruption_budget {
      percent = 10
    }
    min_wait_duration = "3.5s"
  }
}

Definir proyectos de destino

Puedes proporcionar el mapa var.target_projects a tu configuración de Terraform con un alcance fijo o dinámico:

  • Alcance fijo: Mantén una lista explícita de IDs de proyectos en una variable local o un archivo de datos externo. El alcance fijo requiere que actualices la lista cada vez que crees o borres proyectos.
  • Alcance dinámico: Descubre proyectos objetivo según las reglas de la jerarquía de recursos (por ejemplo, todos los proyectos dentro de una organización o carpeta). Puedes consultar proyectos con la fuente de datos google_projects:

     data "google_projects" "in_folder" {
     filter = "parent.id:${local.folder_id}"
     }
    

    Para controlar las excepciones, filtra los proyectos que contienen etiquetas de exclusión específicas. También puedes ejecutar secuencias de comandos externas con local_exec que ejecuten comandos de Google Cloud CLI (como gcloud asset search-all-resources) para generar listas de segmentación dinámicas.

Establecer un flujo de trabajo automatizado sin estado

Cuando usas el alcance dinámico, la lista de proyectos objetivo cambia constantemente. Usar un archivo de estado persistente estándar de Terraform requiere esfuerzo manual para importar recursos nuevos y quitar proyectos borrados del estado.

Para administrar el alcance dinámico de manera eficiente, implementa un flujo de trabajo automatizado sin estado con Cloud Build:

  1. Inicializa Terraform. Ejecuta terraform init con un backend local temporal no persistente.
  2. Descubre proyectos de destino. Genera la lista actual de proyectos objetivo según tus criterios de alcance dinámico.
  3. Importa recursos existentes. Ejecuta terraform import para extraer los recursos existentes de google_project_service, google_project_service_identity, google_project_iam_member, google_compute_project_metadata_item y google_os_config_os_policy_assignment al estado local.
  4. Aplica la configuración. Ejecuta comandos estándar de Terraform (terraform plan y terraform apply) y pasa la lista de proyectos descubiertos a tus declaraciones.
  5. Almacena artefactos de ejecución. De manera opcional, guarda los resultados del plan, las instantáneas de estado y los resúmenes de copias en un bucket de Cloud Storage para realizar auditorías.

Programa tu canalización de Cloud Build para que se ejecute de forma periódica (por ejemplo, diaria o semanalmente) y detecte automáticamente el desvío de configuración y aplique el cumplimiento en toda tu organización.

Visualiza el estado de VM Manager a nivel de la organización

Después de configurar VM Manager en toda tu organización, puedes ver los informes de estado del sistema operativo y de habilitación en todos los proyectos de tu jerarquía. Si exportas los datos de Cloud Asset Inventory a BigQuery, puedes ejecutar consultas de SQL para verificar si VM Manager está habilitado, comprobar las versiones del agente de OS Config y analizar los detalles del sistema operativo en todos los proyectos de tu organización.

Para aprender a exportar datos y ejecutar consultas de informes de estado, consulta Visualiza el estado de VM Manager de tu organización con Cloud Asset Inventory y BigQuery.

¿Qué sigue?