modules/secure_data_warehouse/taxonomy.tf (120 lines of code) (raw):
/**
* Copyright 2023 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.
*/
locals {
pt_confidential = [ for key, value in var.confidential_tags : { "${key}" = "${google_data_catalog_policy_tag.confidential_tags["${key}"].id}" } ]
pt_private = [ for key, value in var.private_tags : { "${key}" = "${google_data_catalog_policy_tag.private_tags["${key}"].id}" } ]
pt_sensitive = [ for key, value in var.sensitive_tags : { "${key}" = "${google_data_catalog_policy_tag.sensitive_tags["${key}"].id}" } ]
}
resource "google_data_catalog_taxonomy" "secure_taxonomy" {
provider = google-beta
project = module.project_radlab_sdw_data_govern.project_id
region = var.region
display_name = local.taxonomy_display_name
description = "Taxonomy created for Sensitive Data"
activated_policy_types = ["FINE_GRAINED_ACCESS_CONTROL"]
depends_on = [
module.secured_data_warehouse
]
}
resource "google_data_catalog_policy_tag" "policy_tag_confidential" {
provider = google-beta
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = "3_Confidential"
description = "Most sensitive data classification. Significant damage to enterprise."
}
resource "google_data_catalog_policy_tag" "confidential_tags" {
provider = google-beta
for_each = var.confidential_tags
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = each.value["display_name"]
description = each.value["description"]
parent_policy_tag = google_data_catalog_policy_tag.policy_tag_confidential.id
}
resource "google_data_catalog_policy_tag" "policy_tag_private" {
provider = google-beta
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = "2_Private"
description = "Data meant to be private. Likely to cause damage to enterprise."
parent_policy_tag = google_data_catalog_policy_tag.policy_tag_confidential.id
}
resource "google_data_catalog_policy_tag" "private_tags" {
provider = google-beta
for_each = var.private_tags
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = each.value["display_name"]
description = each.value["description"]
parent_policy_tag = google_data_catalog_policy_tag.policy_tag_private.id
}
resource "google_data_catalog_policy_tag" "policy_tag_sensitive" {
provider = google-beta
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = "1_Sensitive"
description = "Data not meant to be public."
parent_policy_tag = google_data_catalog_policy_tag.policy_tag_private.id
}
resource "google_data_catalog_policy_tag" "sensitive_tags" {
provider = google-beta
for_each = var.sensitive_tags
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.id
display_name = each.value["display_name"]
description = each.value["description"]
parent_policy_tag = google_data_catalog_policy_tag.policy_tag_sensitive.id
}
resource "local_file" "schema_template_file" {
filename = format("${path.module}/templates/schema.tpl")
content = templatefile("${path.module}/templates/schema_template.tpl",
{
fields = var.data_fields
confidential_tags = var.confidential_tags
private_tags = var.private_tags
sensitive_tags = var.sensitive_tags
pt_confidential = merge(local.pt_confidential...)
pt_private = merge(local.pt_private...)
pt_sensitive = merge(local.pt_sensitive...)
})
}
resource "google_bigquery_table" "re_id" {
dataset_id = local.confidential_dataset_id
project = module.project_radlab_sdw_conf_data.project_id
table_id = local.confidential_table_id
friendly_name = local.confidential_table_id
deletion_protection = !var.delete_contents_on_destroy
schema = local_file.schema_template_file.content
lifecycle {
ignore_changes = [
encryption_configuration # managed by the confidential dataset default_encryption_configuration.
]
}
depends_on = [
module.secured_data_warehouse
]
}
data "google_bigquery_default_service_account" "bq_sa" {
project = module.project_radlab_sdw_conf_data.project_id
depends_on = [
time_sleep.wait_120_seconds
]
}
resource "google_data_catalog_taxonomy_iam_binding" "confidential_bq_binding" {
provider = google-beta
project = module.project_radlab_sdw_data_govern.project_id
taxonomy = google_data_catalog_taxonomy.secure_taxonomy.name
role = "roles/datacatalog.categoryFineGrainedReader"
members = [
"serviceAccount:${data.google_bigquery_default_service_account.bq_sa.email}",
"serviceAccount:${module.secured_data_warehouse.confidential_dataflow_controller_service_account_email}"
]
}