Configurare VM Manager in un'organizzazione utilizzando Terraform

Per applicare configurazioni coerenti del sistema operativo e automatizzare la conformità nella Cloud de Confiance by S3NS gerarchia delle risorse, utilizza Terraform per configurare VM Manager a livello di organizzazione.

Questo documento spiega come utilizzare Terraform per abilitare automaticamente VM Manager (API OS Config), impostare i metadati comuni delle istanze e assegnare le policy del sistema operativo a tutti i progetti di destinazione nella gerarchia delle risorse.

Per una panoramica delle risorse Terraform disponibili per VM Manager, consulta Eseguire il provisioning delle risorse di VM Manager utilizzando Terraform.

Prima di iniziare

  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione verifica la tua identità per l'accesso ad API e servizi Cloud de Confiance by S3NS . Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine selezionando una delle seguenti opzioni:

    Per utilizzare gli esempi di Terraform in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.

    2. Configura gcloud CLI per utilizzare la tua identità federata.

      Per ulteriori informazioni, vedi Accedi a gcloud CLI con la tua identità federata.

    3. Crea le credenziali di autenticazione locali per il tuo account utente:

      gcloud auth application-default login

      Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.

    Per saperne di più, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

Prima di iniziare

Autorizzazioni IAM obbligatorie

Per abilitare automaticamente VM Manager e assegnare le policy del sistema operativo a più progetti, l'entità o il account di servizio che esegue Terraform richiede autorizzazioni Identity and Access Management (IAM) specifiche.

Autorizzazioni per il progetto di destinazione

Per ottenere le autorizzazioni necessarie per attivare il servizio VM Manager e impostare i metadati del progetto, chiedi all'amministratore di concederti i seguenti ruoli IAM in ogni progetto di destinazione:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questi ruoli predefiniti contengono le autorizzazioni necessarie per attivare il servizio VM Manager e impostare i metadati del progetto. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per attivare il servizio VM Manager e impostare i metadati del progetto sono necessarie le seguenti autorizzazioni:

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

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Configurazione del service account e del ruolo personalizzato

Google consiglia di creare un service account dedicato per eseguire l'automazione Terraform centralizzata.

Per concedere le autorizzazioni richieste a questo account di servizio in più progetti, crea un ruolo personalizzato IAM con a livello di organizzazione:

  1. Crea un ruolo personalizzato a livello di organizzazione che includa serviceusage.services.enable e compute.projects.setCommonInstanceMetadata.
  2. Concedi il ruolo personalizzato al tuo service account nell'ambito applicabile più basso, ad esempio a livello di organizzazione o cartella. Ad esempio, se tutti i progetti di destinazione sono contenuti in una cartella specifica, concedi il ruolo a livello di cartella.

Abilitare VM Manager utilizzando Terraform

Per abilitare VM Manager e assegnare le policy del sistema operativo a più progetti, utilizza uno dei seguenti approcci automatizzati: inventari di armi del progetto di riferimento o gestione centralizzata dei progetti.

Utilizzare gli inventari di armi del progetto di riferimento

Se la tua organizzazione utilizza un modulo di progetto Terraform standardizzato (un inventario di armi di riferimento) o un meccanismo applicato centralmente per il provisioning dei progetti, aggiungi le seguenti definizioni di risorse all'inventario di armi del progetto:

Per abilitare VM Manager, includi le seguenti risorse di servizio e metadati:

# 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"
}

Per eseguire il deployment delle assegnazioni delle policy del sistema operativo su tutte le VM di cui è stato eseguito il provisioning dall'inventario di armi, aggiungi la seguente risorsa di assegnazione delle policy:

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

Gestire tutti i progetti a livello centrale

Se la modifica di un inventario di armi del progetto di riferimento non è applicabile, puoi gestire centralmente l'abilitazione di VM Manager e le assegnazioni delle policy del sistema operativo in più progetti esistenti utilizzando l'argomento for_each di Terraform.

Per abilitare VM Manager nei progetti di destinazione, utilizza l'argomento for_each per scorrere la mappa del progetto:

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

Per assegnare una policy del sistema operativo ai progetti di destinazione, definisci la risorsa di assegnazione delle policy con l'argomento 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"
  }
}

Definisci progetti di destinazione

Puoi fornire la mappa var.target_projects alla configurazione Terraform utilizzando l'ambito fisso o l'ambito dinamico:

  • Ambito fisso. Mantieni un elenco esplicito di ID progetto in una variabile locale o in un file di dati esterni. L'ambito fisso richiede di aggiornare l'elenco ogni volta che crei o elimini progetti.
  • Ambito dinamico. Individua i progetti di destinazione in base alle regole della gerarchia delle risorse (ad esempio, tutti i progetti all'interno di un'organizzazione o di una cartella). Puoi eseguire query sui progetti utilizzando l'origine dati google_projects:

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

    Per gestire le eccezioni, filtra i progetti che contengono etichette di esclusione specifiche. Puoi anche eseguire script esterni utilizzando local_exec che eseguono comandi Google Cloud CLI (ad esempio gcloud asset search-all-resources) per generare elenchi di destinazione dinamici.

Stabilire un workflow automatico senza stato

Quando utilizzi l'ambito dinamico, l'elenco dei progetti di destinazione cambia costantemente. L'utilizzo di un file di stato Terraform persistente standard richiede un intervento manuale per importare nuove risorse e rimuovere i progetti eliminati dallo stato.

Per gestire in modo efficiente l'ambito dinamico, implementa un workflow automatico senza stato utilizzando Cloud Build:

  1. Inizializza Terraform. Esegui terraform init utilizzando un backend locale temporaneo e non persistente.
  2. Individua i progetti di destinazione. Genera l'elenco attuale dei progetti di destinazione in base ai criteri di ambito dinamico.
  3. Importa risorse esistenti. Esegui terraform import per inserire le risorse esistenti google_project_service, google_project_service_identity, google_project_iam_member, google_compute_project_metadata_item, e google_os_config_os_policy_assignment nello stato locale.
  4. Applica configurazione. Esegui i comandi Terraform standard (terraform plan e terraform apply), passando l'elenco dei progetti individuati alle dichiarazioni.
  5. Archivia gli artefatti di esecuzione. Facoltativamente, salva gli output del piano, gli snapshot dello stato e i riepiloghi di copia in un bucket Cloud Storage per l'audit.

Pianifica l'esecuzione periodica (ad esempio, giornaliera o settimanale) della pipeline Cloud Build per rilevare automaticamente la deriva della configurazione e applicare la conformità in tutta l'organizzazione.

Visualizzare lo stato di VM Manager a livello di organizzazione

Dopo aver configurato VM Manager nella tua organizzazione, puoi visualizzare i report sullo stato di abilitazione e del sistema operativo in tutti i progetti della gerarchia. Esportando i dati di Cloud Asset Inventory in BigQuery, puoi eseguire query SQL per verificare se VM Manager è abilitato, controllare le versioni dell'agente OS Config e ispezionare i dettagli del sistema operativo in tutti i progetti della tua organizzazione.

Per scoprire come esportare i dati ed eseguire query sui report sullo stato, consulta Visualizzare lo stato di VM Manager per la tua organizzazione utilizzando Cloud Asset Inventory e BigQuery.

Passaggi successivi