使用 Terraform 在整个组织中设置虚拟机管理器

如需在整个 Cloud de Confiance by S3NS 资源层次结构中强制执行一致的操作系统配置并自动实现合规性 ,请使用 Terraform 在组织级层配置 虚拟机管理器。

本文档介绍了如何使用 Terraform 在资源层次结构中的所有目标项目中自动启用虚拟机管理器 (OS Config API)、设置常见实例元数据和分配操作系统政策。

如需大致了解可用于虚拟机管理器的 Terraform 资源,请参阅 使用 Terraform 预配虚拟机管理器资源。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Cloud de Confiance by S3NS 服务和 API。如需从本地开发环境运行 代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证: {1

    如需在本地开发环境中使用本页面上的 Terraform 示例,请安装并 初始化 gcloud CLI,然后使用您的用户凭证设置应用默认凭据。

    1. 安装 Google Cloud CLI。

    2. 配置 gcloud CLI 以使用您的联合身份。

      如需了解详情,请参阅使用联合身份登录 gcloud CLI。

    3. 为您的用户账号创建本地身份验证凭证:

      gcloud auth application-default login

      如果返回了身份验证错误,并且您使用的是外部身份提供方 (IdP),请确认您已 使用联合身份登录 gcloud CLI。

    如需了解详情,请参阅 为本地开发环境设置身份验证。

准备工作

必需的 IAM 权限

如需自动启用虚拟机管理器并在多个项目中分配操作系统政策,运行 Terraform 的正文或服务帐号需要特定的 Identity and Access Management (IAM) 权限。

目标项目权限

如需获得激活虚拟机管理器服务和设置项目元数据所需的权限,请让管理员向您授予每个目标项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

这些预定义的角色包含 激活虚拟机管理器服务和设置项目元数据所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需激活虚拟机管理器服务和设置项目元数据,您需要具备以下权限:

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

您也可以使用自定义角色或其他预定义角色来获取这些权限。

服务账号和自定义角色设置

Google 建议您创建一个专用 服务 账号 来运行集中式 Terraform 自动化。

如需在多个 项目中向此服务帐号授予所需权限,请在 组织级层创建 IAM 自定义 角色:

  1. 创建一个组织级自定义角色,其中包含 serviceusage.services.enable 和 compute.projects.setCommonInstanceMetadata。
  2. 在最低适用范围(例如组织或文件夹级层)向服务 账号授予自定义角色。例如,如果您的目标项目全部包含在特定文件夹中,请在文件夹级层授予该角色。

使用 Terraform 启用虚拟机管理器

如需启用虚拟机管理器并在多个项目中分配操作系统政策,请使用以下自动化方法之一:黄金项目蓝图或集中式项目管理。

使用黄金项目蓝图

如果您的组织使用标准化的 Terraform 项目模块(黄金蓝图)或集中强制机制来预配项目,请将以下资源定义添加到项目蓝图:

如需启用虚拟机管理器,请添加以下服务和元数据资源:

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

如需在蓝图预配的所有虚拟机中部署操作系统政策分配,请添加以下政策分配资源:

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 实参集中管理多个现有项目的虚拟机管理器启用和操作系统政策分配。

如需在目标项目中启用虚拟机管理器,请使用 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_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"
}

如需在目标项目中分配操作系统政策,请使用 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"
  }
}

定义目标项目

您可以使用固定范围或动态范围向 Terraform 配置提供 var.target_projects 映射:

  • 固定范围 。在局部变量或外部数据文件中维护项目 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_service、google_project_service_identity、 google_project_iam_member、google_compute_project_metadata_item 和 google_os_config_os_policy_assignment 资源拉取到本地状态。
  4. 应用配置 。运行标准 Terraform 命令(terraform plan 和 terraform apply),并将发现的项目列表传递给声明。
  5. 存储运行工件 。(可选)将计划输出、状态快照和复制摘要保存到 Cloud Storage 存储桶以进行审核。

安排 Cloud Build 流水线定期(例如每天或每周)运行,以自动检测配置偏差并在整个组织中强制执行合规性。

查看组织级虚拟机管理器状态

在整个组织中设置虚拟机管理器后,您可以查看层次结构中所有项目的启用和操作系统状态报告。通过将 Cloud Asset Inventory 数据导出到 BigQuery,您可以运行 SQL 查询来检查虚拟机管理器是否已启用、检查 OS Config 代理版本,并检查组织中所有项目的操作系统详细信息。

如需了解如何导出数据和运行状态报告查询,请参阅使用 Cloud Asset Inventory 和 BigQuery 查看组织的虚拟机管理器状态。

后续步骤