使用 Terraform 在整個機構中設定 VM 管理員

如要強制執行一致的作業系統設定,並在 Cloud de Confiance by S3NS 資源階層中自動確保合規性,請使用 Terraform 在機構層級設定 VM 管理員

本文說明如何使用 Terraform 自動啟用 VM 管理員 (OS Config API)、設定常見的執行個體中繼資料,以及在資源階層的所有目標專案中指派 OS 政策。

如要瞭解 VM 管理員可用的 Terraform 資源,請參閱「使用 Terraform 佈建 VM 管理員資源」。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Cloud de Confiance by S3NS 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    如要在本機開發環境中使用本頁的 Terraform 範例,請安裝並初始化 gcloud CLI,然後使用使用者憑證設定應用程式預設憑證。

    1. 安裝 Google Cloud CLI。

    2. 設定 gcloud CLI,使用您的聯合身分。

      詳情請參閱「使用聯合身分登入 gcloud CLI」。

    3. 為使用者帳戶建立本機驗證憑證:

      gcloud auth application-default login

      如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI

    詳情請參閱 這篇文章,瞭解如何設定本機開發環境的驗證機制。

事前準備

必要 IAM 權限

如要自動啟用 VM 管理員,並在多個專案中指派 OS 政策,執行 Terraform 的主體或服務帳戶必須具備特定 Identity and Access Management (IAM) 權限。

目標專案權限

如要取得啟用 VM 管理員服務及設定專案中繼資料所需的權限,請要求管理員在每個目標專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備啟用 VM 管理員服務及設定專案中繼資料所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要啟用 VM 管理員服務及設定專案中繼資料,您必須具備下列權限:

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

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

服務帳戶和自訂角色設定

Google 建議您建立專屬的服務帳戶,執行集中式 Terraform 自動化作業。

如要跨多個專案授予這個服務帳戶必要的權限,請在機構層級建立 IAM 自訂角色

  1. 建立包含 serviceusage.services.enablecompute.projects.setCommonInstanceMetadata 的組織層級自訂角色。
  2. 在適用的最低範圍 (例如機構或資料夾層級),將自訂角色授予服務帳戶。舉例來說,如果目標專案都包含在特定資料夾中,請在資料夾層級授予角色。

使用 Terraform 啟用 VM 管理員

如要啟用 VM 管理員,並在多個專案中指派 OS 政策,請使用下列其中一種自動化方法:黃金專案藍圖或集中式專案管理。

使用黃金專案藍圖

如果貴機構使用標準化 Terraform 專案模組 (黃金藍圖),或集中強制執行的機制來佈建專案,請將下列資源定義新增至專案藍圖。

如要啟用 VM 管理員,請加入下列服務和中繼資料資源:

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

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

如要將 OS 政策指派作業部署至藍圖佈建的所有 VM,請附加下列政策指派資源:

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

集中管理所有專案

如果無法修改黃金專案藍圖,您可以使用 Terraform for_each 引數,集中管理多個現有專案的 VM 管理員啟用狀態和 OS 政策指派作業。

如要在目標專案中啟用 VM 管理員,請使用 for_each 引數疊代專案對應:

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

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

如要在目標專案中指派 OS 政策,請使用 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"
  }
}

定義目標專案

您可以透過固定範圍或動態範圍,將 var.target_projects 對應至 Terraform 設定:

  • 修正範圍。在區域變數或外部資料檔案中,維護專案 ID 的明確清單。如果範圍固定,您每次建立或刪除專案時,都必須更新清單。
  • 動態範圍設定。根據資源階層規則 (例如機構或資料夾中的所有專案),探索目標專案。您可以使用 google_projects 資料來源查詢專案:

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

    如要處理例外狀況,請篩除含有特定排除標籤的專案。您也可以使用 local_exec 執行外部指令碼,這些指令碼會執行 Google Cloud CLI 指令 (例如 gcloud asset search-all-resources),產生動態目標名單。

建立無狀態的自動化工作流程

使用動態範圍時,目標專案清單會不斷變更。 使用標準的持續性 Terraform 狀態檔案時,需要手動匯入新資源,並從狀態中移除已刪除的專案。

如要有效管理動態範圍,請使用 Cloud Build 實作無狀態自動化工作流程:

  1. 初始化 Terraform。使用暫時性的非持續性本機後端執行 terraform init
  2. 探索目標專案。根據動態範圍界定條件,產生目前的目標專案清單。
  3. 匯入現有資源。執行 terraform import,將現有的 google_project_servicegoogle_compute_project_metadata_itemgoogle_os_config_os_policy_assignment 資源拉入本機狀態。
  4. 套用設定。執行標準 Terraform 指令 (terraform planterraform apply),將探索到的專案清單傳遞至宣告。
  5. 儲存執行構件。您可以選擇將計畫輸出內容、狀態快照和副本摘要儲存至 Cloud Storage bucket,以供稽核。

排定 Cloud Build 管道的執行時間 (例如每日或每週),自動偵測設定差異,並在整個機構中強制執行法規遵循。

查看機構層級的 VM 管理員狀態

在整個機構中設定 VM 管理員後,您就能查看階層中所有專案的啟用和作業系統狀態報告。將 Cloud Asset Inventory 資料匯出至 BigQuery 後,您就能執行 SQL 查詢,檢查 VM 管理員是否已啟用、檢查 OS Config 代理程式版本,以及檢查機構中所有專案的作業系統詳細資料。

如要瞭解如何匯出資料及執行狀態報告查詢,請參閱「使用 Cloud Asset Inventory 和 BigQuery 查看機構的 VM 管理工具狀態」。

後續步驟