4-projects/modules/data_governance/iam.tf (244 lines of code) (raw):

/** * Copyright 2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ ######################################## # IAM ######################################## locals { project_iam_roles = merge(flatten([ for sa, config in local.project_iam : [ for role in config.roles : { "${sa}.${role}" = { member = config.member role = role } } ] ])...) project_iam = { #data governance iam "compute" = { member = "serviceAccount:${data.google_compute_default_service_account.default.email}", roles = [ "roles/logging.logWriter", "roles/bigquery.admin", "roles/serviceusage.serviceUsageConsumer", ] } "cloud_run" = { member = "serviceAccount:${google_service_account.cloud_run.email}", roles = [ "roles/run.invoker", "roles/serviceusage.serviceUsageConsumer", "roles/logging.logWriter", "roles/bigquery.admin", "roles/workflows.invoker", "roles/cloudbuild.builds.editor", "roles/iam.serviceAccountTokenCreator", ] } "cloud_function" = { member = "serviceAccount:${google_service_account.cloud_function.email}", roles = [ "roles/cloudbuild.builds.builder", "roles/logging.logWriter", "roles/cloudtasks.taskRunner", ] } "scheduler" = { member = "serviceAccount:${google_service_account.scheduler_controller_service_account.email}", roles = [ "roles/cloudscheduler.serviceAgent", ] } "tag_engine" = { member = "serviceAccount:${google_service_account.tag_engine.email}", roles = [ "roles/cloudtasks.enqueuer", "roles/datastore.user", "roles/datastore.indexAdmin", "roles/run.invoker", "roles/storage.objectViewer", "roles/logging.logWriter", "roles/artifactregistry.repoAdmin", "roles/iam.serviceAccountViewer", ] } "tag_creator" = { member = "serviceAccount:${google_service_account.tag_creator.email}", roles = [ "roles/datacatalog.tagEditor", "roles/datacatalog.tagTemplateUser", "roles/datacatalog.tagTemplateViewer", "roles/datacatalog.viewer", "roles/bigquery.admin", "roles/bigquery.jobUser", "roles/bigquery.dataViewer", "roles/bigquery.user", "roles/bigquery.resourceViewer", "roles/storage.objectViewer", "roles/logging.viewer", ] } "record_manager" = { member = "serviceAccount:${google_service_account.record_manager_service_account.email}", roles = [ "roles/storage.objectViewer", "roles/bigquery.jobUser", "roles/bigquery.dataOwner", "roles/bigquery.connectionAdmin", "roles/datacatalog.searchAdmin", "roles/datacatalog.tagTemplateViewer", "roles/run.invoker", "roles/logging.logWriter", ] } "report_engine" = { member = "serviceAccount:${google_service_account.report_engine_service_account.email}", roles = [ "roles/bigquery.resourceViewer", "roles/bigquery.metadataViewer", "roles/datacatalog.viewer", "roles/datalineage.viewer", "roles/bigquery.dataEditor", "roles/bigquery.jobUser", "roles/pubsub.publisher", "roles/pubsub.viewer", ] } "pubsub" = { member = "serviceAccount:${google_project_service_identity.identity["pubsub.googleapis.com"].email}", roles = [ "roles/bigquery.dataEditor", "roles/bigquery.metadataViewer", ] } "bigquerydatatransfer" = { member = "serviceAccount:${google_project_service_identity.identity["bigquerydatatransfer.googleapis.com"].email}", roles = [ "roles/bigquery.admin" // roles/bigquerydatatransfer.serviceAgent is granted automatically ] } "dashboard" = { member = "serviceAccount:${google_service_account.dashboard_service_account.email}", roles = [ "roles/bigquery.dataViewer", "roles/bigquery.jobUser", "roles/iam.serviceAccountTokenCreator", ] } "data_access_management" = { member = "serviceAccount:${google_service_account.data_access_management_service_account.email}", roles = [ "roles/bigquery.dataEditor", ] } } dlp_kms_wrapper_roles = [ "roles/secretmanager.secretAccessor", "roles/secretmanager.viewer", ] sa_tag_engine_users = { "cloud_run" = google_service_account.cloud_run.email, "tag_engine" = google_service_account.tag_engine.email, "terraform" = var.terraform_service_account, } sa_data_access_management_users = { "cloud_run" = google_service_account.cloud_run.email, "data_access_management" = google_service_account.data_access_management_service_account.email, "terraform" = var.terraform_service_account, } cloud_run_service_account_users = { "cloud_run" = google_service_account.cloud_run.email, "terraform" = var.terraform_service_account, } data_governance_sa_user = { "cloud_function" = google_service_account.cloud_function.id "report_engine_service_account" = google_service_account.report_engine_service_account.id "record_manager_service_account" = google_service_account.record_manager_service_account.id } } data "google_compute_default_service_account" "default" { project = module.data_governance_project.project_id } resource "google_service_account_iam_member" "cloud_run" { for_each = local.cloud_run_service_account_users service_account_id = google_service_account.cloud_run.id role = "roles/iam.serviceAccountUser" member = "serviceAccount:${each.value}" } resource "google_service_account_iam_member" "tf_sa_data_governance" { for_each = local.data_governance_sa_user service_account_id = each.value role = "roles/iam.serviceAccountUser" member = "serviceAccount:${var.terraform_service_account}" } resource "google_service_account_iam_member" "cloud_function" { service_account_id = google_service_account.cloud_function.id role = "roles/iam.serviceAccountUser" member = "serviceAccount:${var.terraform_service_account}" } # ************************************************************ # # Create the service account policy bindings for tag_engine_sa # ************************************************************ # resource "google_service_account_iam_member" "serviceAccountUser_tag_engine_sa" { for_each = local.sa_tag_engine_users service_account_id = google_service_account.tag_engine.id role = "roles/iam.serviceAccountUser" member = "serviceAccount:${each.value}" } resource "google_service_account_iam_member" "serviceAccountUser_tag_creator_sa" { for_each = local.sa_tag_engine_users service_account_id = google_service_account.tag_creator.id role = "roles/iam.serviceAccountUser" member = "serviceAccount:${each.value}" } resource "google_service_account_iam_member" "serviceAccountViewer_tag_creator_sa" { service_account_id = google_service_account.tag_creator.id role = "roles/iam.serviceAccountViewer" member = "serviceAccount:${google_service_account.tag_engine.email}" } resource "google_service_account_iam_member" "serviceAccountTokenCreator_tag_creator_sa" { service_account_id = google_service_account.tag_creator.id role = "roles/iam.serviceAccountTokenCreator" member = "serviceAccount:${google_service_account.tag_engine.email}" } resource "google_service_account_iam_member" "serviceAccountUser_compute_sa" { service_account_id = "projects/${module.data_governance_project.project_id}/serviceAccounts/${data.google_compute_default_service_account.default.email}" role = "roles/iam.serviceAccountUser" member = "serviceAccount:${var.terraform_service_account}" } # ************************************************************ # # Create the service account policy bindings for data access management # ************************************************************ # resource "google_service_account_iam_member" "serviceAccountUser_data_access_management_sa" { for_each = local.sa_data_access_management_users service_account_id = google_service_account.data_access_management_service_account.id role = "roles/iam.serviceAccountUser" member = "serviceAccount:${each.value}" } # ************************************************************************ # # Consolidated Resources - Secret Manager IAM # ************************************************************************ # resource "google_secret_manager_secret_iam_member" "dlp_kms_wrapper" { for_each = toset(local.dlp_kms_wrapper_roles) project = var.secrets_project_id member = "serviceAccount:${var.terraform_service_account}" role = each.value secret_id = data.google_secret_manager_secret.dlp_kms_wrapper.secret_id } # ************************************************************************ # # Consolidated Resources - Project IAM # ************************************************************************ # resource "google_project_iam_member" "data_governance_project_iam" { for_each = local.project_iam_roles project = module.data_governance_project.project_id role = each.value.role member = each.value.member } resource "google_project_iam_member" "kms_viewer" { project = var.kms_project_id # one instance of unique project, so it's kept out of loop role = "roles/cloudkms.viewer" member = "serviceAccount:${google_service_account.cloud_function.email}" } resource "google_project_iam_member" "kms_encrypter" { project = var.kms_project_id # one instance of unique project, so it's kept out of loop role = "roles/cloudkms.cryptoKeyDecrypterViaDelegation" member = "group:${var.encrypted_data_viewers_group}" }