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.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
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
- Revisa la descripción general de la configuración de VM Manager.
- Revisa las cuotas de configuración del SO.
- Prepara tu entorno de Terraform.
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:
- Administrador de Service Usage ()
roles/serviceusage.serviceUsageAdmin - Administrador de instancias de Compute (v1) (
roles/compute.instanceAdmin.v1)
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:
- Crea un rol personalizado a nivel de la organización que incluya
serviceusage.services.enableycompute.projects.setCommonInstanceMetadata. - 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:
google_project_servicegoogle_project_service_identitygoogle_project_iam_membergoogle_compute_project_metadata_item
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_execque ejecuten comandos de Google Cloud CLI (comogcloud 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:
- Inicializa Terraform. Ejecuta
terraform initcon un backend local temporal no persistente. - Descubre proyectos de destino. Genera la lista actual de proyectos objetivo según tus criterios de alcance dinámico.
- Importa recursos existentes. Ejecuta
terraform importpara extraer los recursos existentes degoogle_project_service,google_project_service_identity,google_project_iam_member,google_compute_project_metadata_itemygoogle_os_config_os_policy_assignmental estado local. - Aplica la configuración. Ejecuta comandos estándar de Terraform (
terraform planyterraform apply) y pasa la lista de proyectos descubiertos a tus declaraciones. - 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?
- Consulta el estado de VM Manager de tu organización con Cloud Asset Inventory y BigQuery.
- Crea una asignación de política del SO.
- Crea trabajos de aplicación de parches.
- Soluciona problemas de VM Manager.