Configurare VM Manager in un'organizzazione utilizzando Terraform

Per applicare configurazioni coerenti del sistema operativo e automatizzare la conformità nell'intera gerarchia delle risorse Google Cloud , 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 metadati di istanza comuni e assegnare 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 Provisioning delle risorse 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 Google Cloud . 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. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

    3. Se utilizzi una shell locale, crea credenziali di autenticazione locali per il tuo account utente:

      gcloud auth application-default login

      Non è necessario eseguire questa operazione se utilizzi Cloud Shell.

      Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver eseguito l'accesso 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 policy del sistema operativo a più progetti, il principal 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 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 account di servizio 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.

Attiva VM Manager utilizzando Terraform

Per abilitare VM Manager e assegnare policy del sistema operativo a più progetti, utilizza uno dei seguenti approcci automatizzati: blueprint di progetti golden o gestione centralizzata dei progetti.

Utilizzare i blueprint di progetto golden

Se la tua organizzazione utilizza un modulo di progetto Terraform standardizzato (un progetto d'oro) o un meccanismo applicato centralmente per eseguire il provisioning dei progetti, aggiungi le seguenti definizioni delle risorse al progetto:

Per attivare 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 in tutte le VM di cui è stato eseguito il provisioning del blueprint, 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"
  }
}

Gestisci tutti i progetti a livello centrale

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

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 a più 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 quello dinamico:

  • Ambito fisso. Mantieni un elenco esplicito di ID progetto in una variabile locale o in un file di dati esterno. L'ambito fisso richiede l'aggiornamento dell'elenco ogni volta che crei o elimini progetti.
  • Scoping dinamico. Scopri i progetti di destinazione in base alle regole della gerarchia delle risorse (ad esempio, tutti i progetti all'interno di un'organizzazione o una cartella). Puoi interrogare i 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 i comandi Google Cloud CLI (ad esempio gcloud asset search-all-resources) per generare elenchi target dinamici.

Stabilisci un workflow automatizzato stateless

Quando utilizzi l'ambito dinamico, l'elenco dei progetti target cambia continuamente. L'utilizzo di un file di stato Terraform permanente 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 automatizzato stateless utilizzando Cloud Build:

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

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

Visualizzare lo stato di VM Manager a livello di organizzazione

Dopo aver configurato VM Manager in tutta l'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 di stato, consulta Visualizza lo stato di VM Manager per la tua organizzazione utilizzando Cloud Asset Inventory e BigQuery.

Passaggi successivi