diff --git a/fast/stage-links.sh b/fast/stage-links.sh index 1363f5f43..e66ace3f2 100755 --- a/fast/stage-links.sh +++ b/fast/stage-links.sh @@ -109,13 +109,15 @@ case $STAGE_NAME in PROVIDER="providers/3-network-security-providers.tf" TFVARS="tfvars/0-bootstrap.auto.tfvars.json tfvars/1-resman.auto.tfvars.json - tfvars/2-networking.auto.tfvars.json" + tfvars/2-networking.auto.tfvars.json + tfvars/2-security.auto.tfvars.json" else unset GLOBALS PROVIDER="tenants/$TENANT/providers/3-network-security-providers.tf" TFVARS="tenants/$TENANT/tfvars/0-bootstrap-tenant.auto.tfvars.json tenants/$TENANT/tfvars/1-resman.auto.tfvars.json - tenants/$TENANT/tfvars/2-networking.auto.tfvars.json" + tenants/$TENANT/tfvars/2-networking.auto.tfvars.json + tenants/$TENANT/tfvars/2-security.auto.tfvars.json" fi ;; *) diff --git a/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_admin.yaml b/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_admin.yaml index 8f6b08a23..1020bd138 100644 --- a/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_admin.yaml +++ b/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_admin.yaml @@ -40,3 +40,8 @@ includedPermissions: - networksecurity.securityProfiles.list - networksecurity.securityProfiles.update - networksecurity.securityProfiles.use + - networksecurity.tlsInspectionPolicies.create + - networksecurity.tlsInspectionPolicies.get + - networksecurity.tlsInspectionPolicies.list + - networksecurity.tlsInspectionPolicies.update + - networksecurity.tlsInspectionPolicies.use diff --git a/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_viewer.yaml b/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_viewer.yaml index 2242207a0..73e560d78 100644 --- a/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_viewer.yaml +++ b/fast/stages/0-bootstrap/data/custom-roles/ngfw_enterprise_viewer.yaml @@ -29,3 +29,6 @@ includedPermissions: - networksecurity.securityProfiles.get - networksecurity.securityProfiles.list - networksecurity.securityProfiles.use + - networksecurity.tlsInspectionPolicies.get + - networksecurity.tlsInspectionPolicies.list + - networksecurity.tlsInspectionPolicies.use diff --git a/fast/stages/0-bootstrap/organization.tf b/fast/stages/0-bootstrap/organization.tf index aa700dc7f..7505e149b 100644 --- a/fast/stages/0-bootstrap/organization.tf +++ b/fast/stages/0-bootstrap/organization.tf @@ -181,6 +181,7 @@ module "organization" { "roles/accesscontextmanager.policyAdmin", "roles/cloudasset.viewer", "roles/compute.orgFirewallPolicyAdmin", + "roles/compute.orgFirewallPolicyUser", "roles/compute.xpnAdmin", "roles/orgpolicy.policyAdmin", "roles/orgpolicy.policyViewer", @@ -188,7 +189,6 @@ module "organization" { ])) , join(",", formatlist("'%s'", [ module.organization.custom_role_id["network_firewall_policies_admin"], - module.organization.custom_role_id["network_firewall_policies_viewer"], module.organization.custom_role_id["ngfw_enterprise_admin"], module.organization.custom_role_id["ngfw_enterprise_viewer"], module.organization.custom_role_id["service_project_network_admin"], diff --git a/fast/stages/1-resman/branch-networking.tf b/fast/stages/1-resman/branch-networking.tf index c875fccbc..0a03a381d 100644 --- a/fast/stages/1-resman/branch-networking.tf +++ b/fast/stages/1-resman/branch-networking.tf @@ -41,7 +41,7 @@ locals { (var.custom_roles["network_firewall_policies_admin"]) = [ try(module.branch-nsec-sa[0].iam_email, null) ] - (var.custom_roles["network_firewall_policies_viewer"]) = [ + "roles/compute.orgFirewallPolicyUser" = [ try(module.branch-nsec-r-sa[0].iam_email, null) ] } diff --git a/fast/stages/1-resman/branch-security.tf b/fast/stages/1-resman/branch-security.tf index 34dd347f1..97cba1d7b 100644 --- a/fast/stages/1-resman/branch-security.tf +++ b/fast/stages/1-resman/branch-security.tf @@ -50,6 +50,24 @@ module "branch-security-folder" { ] } iam = local._security_folder_iam + iam_bindings = { + tenant_iam_admin_conditional = { + members = [ + module.branch-security-sa.iam_email, + ] + role = "roles/resourcemanager.folderIamAdmin" + condition = { + expression = format( + "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly([%s])", + join(",", formatlist("'%s'", [ + "roles/privateca.certificateManager" + ])) + ) + title = "security_sa_delegated_grants" + description = "Certificate Authority Service delegated grants." + } + } + } tag_bindings = { context = try( local.tag_values["${var.tag_names.context}/security"].id, null diff --git a/fast/stages/1-resman/iam.tf b/fast/stages/1-resman/iam.tf index d4bb6277c..4e8e0663f 100644 --- a/fast/stages/1-resman/iam.tf +++ b/fast/stages/1-resman/iam.tf @@ -48,7 +48,7 @@ locals { member = module.branch-nsec-sa[0].iam_email role = local.custom_roles["ngfw_enterprise_admin"], } - sa_net_nsec_r_fw_policy_admin = { + sa_net_nsec_r_fw_policy_user = { member = module.branch-nsec-sa[0].iam_email role = "roles/compute.orgFirewallPolicyUser" } diff --git a/fast/stages/2-security/README.md b/fast/stages/2-security/README.md index d99cdffdf..6ee1c93ce 100644 --- a/fast/stages/2-security/README.md +++ b/fast/stages/2-security/README.md @@ -6,17 +6,18 @@ The design of this stage is fairly general, and out of the box it only provides Expanding it to include other security-related services like Secret Manager is fairly simple by adapting the provided implementation for Cloud KMS, and leveraging the broad permissions granted on the top-level Security folder to the automation service account used here. - The following diagram illustrates the high-level design of resources managed here:

Security diagram

---> - [Design overview and choices](#design-overview-and-choices) - [Cloud KMS](#cloud-kms) + - [Certificate Authority Service (CAS)](#certificate-authority-service-cas) + - [Trust Configs](#trust-configs) + - [NGFW Enterprise and TLS inspection support](#ngfw-enterprise-and-tls-inspection-support) - [How to run this stage](#how-to-run-this-stage) - [Provider and Terraform variables](#provider-and-terraform-variables) - [Impersonating the automation service account](#impersonating-the-automation-service-account) @@ -25,6 +26,7 @@ The following diagram illustrates the high-level design of resources managed her - [Running the stage](#running-the-stage) - [Customizations](#customizations) - [KMS keys](#kms-keys) + - [NGFW Enterprise - sample TLS configurations](#ngfw-enterprise-sample-tls-configurations) - [Files](#files) - [Variables](#variables) - [Outputs](#outputs) @@ -46,6 +48,22 @@ The Cloud KMS configuration allows defining keys by name (typically matching the IAM roles on keys can be configured at the logical level for all locations where a logical key is created. Their management can also be delegated via [delegated role grants](https://cloud.google.com/iam/docs/setting-limits-on-granting-roles) exposed through a simple variable, to allow other identities to set IAM policies on keys. This is particularly useful in setups like project factories, making it possible to configure IAM bindings during project creation for team groups or service agent accounts (compute, storage, etc.). +### Certificate Authority Service (CAS) + +With this stage you can leverage Certificate Authority Services (CAS) and create as many CAs you need for each environments. To create custom CAS, you can use the `cas_configs` variable. The variable comes with some defaults, useful for demos: in each environment, specifying the CA `location` should be enough for most of your test scenarios. + +### Trust Configs + +The stage lets you also create Certificate Manager trust configs. With trust configs you can trust whole CAs or specific server certificates, when you use them with other services, such as NGFW Enterprise. You can create additional trust configs for each environment with the `trust_configs` variable. At a very minimum, each trust config needs a `location` (the region) and either a `trust_stores` block or an `allowed_certificates` block. + +### NGFW Enterprise and TLS inspection support + +We deploy NGFW Enterprise in the [network-security stage](../3-network-security/README.md). If you require TLS inspection, NGFW needs to interact with CAS and -optionally- Certificate Manager trust-configs. These components bind to firewall endpoint associations (created in the [network-security stage](../3-network-security/README.md)) with zonal TLS inspection policies. +Using this module, you can define CAS configurations and trust-configs for NGFW Enterprise. You can create them using the `cas_configs` and `trust_configs` variables. Anyway, these will need to use specific keys (defined in `ngfw_tls_configs.keys`), so that FAST knows which configurations to use for NGFW Enterprise. +You can then enable TLS inspection and customize its behavior for NGFW Enterprise, using the `ngfw_tls_configs.tls_inspection` variable. FAST will create the TLS inspection policies for you in the regions where you defined your CAs for NGFW Enterprise. +When you create your CAs and trust-configs for NGFW Enterprise, make sure their region matches the zones where you will define your firewall endpoints. +You can read more about NGFW configurations in the [Customizations section](#customizations) of this document. + ## How to run this stage This stage is meant to be executed after the [resource management](../1-resman) stage has run, as it leverages the automation service account and bucket created there, and additional resources configured in the [bootstrap](../0-bootstrap) stage. @@ -162,14 +180,96 @@ kms_keys = { The script will create one keyring for each specified location and keys on each keyring. +### NGFW Enterprise - sample TLS configurations + +This is a minimal configuration that creates a CAs for each environment and enables TLS inspection policies for NGFW Enterprise. + +```tfvars +cas_configs = { + dev = { + ngfw-dev-cas-0 = { + location = "europe-west1" + } + } + prod = { + ngfw-prod-cas-0 = { + location = "europe-west1" + } + } +} +tls_inspection = { + enabled = true +} +``` + +You can optionally create also trust-configs for NGFW Enterprise. + +```tfvars +cas_configs = { + dev = { + ngfw-dev-cas-0 = { + location = "europe-west1" + } + } + prod = { + ngfw-prod-cas-0 = { + location = "europe-west1" + } + } +} +trust_configs = { + dev = { + ngfw-dev-tc-0 = { + allowlisted_certificates = { + my_ca = "~/my_keys/srv-dev.crt" + } + location = "europe-west1" + } + } + prod = { + ngfw-prod-tc-0 = { + allowlisted_certificates = { + my_ca = "~/my_keys/srv-prod.crt" + } + location = "europe-west1" + } + } +} +tls_inspection = { + enabled = true +} +``` + +You can customize the keys of your configurations, as long as they match the ones you specify in the `ngfw_tls_configs.keys` variable. + +```tfvars +cas_configs = { + dev = { + my-ca-0 = { + location = "europe-west1" + } + } +} +ngfw_tls_configs = { + keys = { + dev = { + cas = "my-ca-0" + } + } +} +tls_inspection = { + enabled = true +} +``` + ## Files | name | description | modules | resources | |---|---|---|---| -| [core-dev.tf](./core-dev.tf) | None | kms · project | | -| [core-prod.tf](./core-prod.tf) | None | kms · project | | +| [core-dev.tf](./core-dev.tf) | None | certificate-authority-service · kms · project | google_certificate_manager_trust_config · google_network_security_tls_inspection_policy | +| [core-prod.tf](./core-prod.tf) | None | certificate-authority-service · kms · project | google_certificate_manager_trust_config · google_network_security_tls_inspection_policy | | [main.tf](./main.tf) | Module-level locals and resources. | folder | | | [outputs.tf](./outputs.tf) | Module outputs. | | google_storage_bucket_object · local_file | | [variables-fast.tf](./variables-fast.tf) | None | | | @@ -184,15 +284,21 @@ The script will create one keyring for each specified location and keys on each | [folder_ids](variables-fast.tf#L38) | Folder name => id mappings, the 'security' folder name must exist. | object({…}) | ✓ | | 1-resman | | [organization](variables-fast.tf#L46) | Organization details. | object({…}) | ✓ | | 0-bootstrap | | [prefix](variables-fast.tf#L56) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | -| [service_accounts](variables-fast.tf#L66) | Automation service accounts that can assign the encrypt/decrypt roles on keys. | object({…}) | ✓ | | 1-resman | -| [essential_contacts](variables.tf#L17) | Email used for essential contacts, unset if null. | string | | null | | -| [kms_keys](variables.tf#L23) | KMS keys to create, keyed by name. | map(object({…})) | | {} | | -| [outputs_location](variables.tf#L62) | Path where providers, tfvars files, and lists for the following stages are written. Leave empty to disable. | string | | null | | +| [service_accounts](variables-fast.tf#L66) | Automation service accounts that can assign the encrypt/decrypt roles on keys. | object({…}) | ✓ | | 1-resman | +| [cas_configs](variables.tf#L18) | The CAS CAs to add to each environment. | object({…}) | | {…} | | +| [essential_contacts](variables.tf#L179) | Email used for essential contacts, unset if null. | string | | null | | +| [kms_keys](variables.tf#L185) | KMS keys to create, keyed by name. | map(object({…})) | | {} | | +| [ngfw_tls_configs](variables.tf#L224) | The CAS and trust configurations key names to be used for NGFW Enterprise. | object({…}) | | {…} | | +| [outputs_location](variables.tf#L250) | Path where providers, tfvars files, and lists for the following stages are written. Leave empty to disable. | string | | null | | +| [trust_configs](variables.tf#L256) | The trust configs grouped by environment. | object({…}) | | {…} | | ## Outputs | name | description | sensitive | consumers | |---|---|:---:|---| -| [kms_keys](outputs.tf#L55) | KMS key ids. | | | -| [tfvars](outputs.tf#L60) | Terraform variable files for the following stages. | ✓ | | +| [cas_configs](outputs.tf#L99) | Certificate Authority Service configurations. | | | +| [kms_keys](outputs.tf#L104) | KMS key ids. | | | +| [ngfw_tls_configs](outputs.tf#L109) | The NGFW Enterprise configurations. | | | +| [tfvars](outputs.tf#L114) | Terraform variable files for the following stages. | ✓ | | +| [trust_config_ids](outputs.tf#L120) | Certificate Manager trust-config ids. | | | diff --git a/fast/stages/2-security/core-dev.tf b/fast/stages/2-security/core-dev.tf index b44aca42d..9ac7d417f 100644 --- a/fast/stages/2-security/core-dev.tf +++ b/fast/stages/2-security/core-dev.tf @@ -1,5 +1,5 @@ /** - * Copyright 2023 Google LLC + * 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. @@ -15,6 +15,18 @@ */ locals { + # Extract NGFW locations from dev CAS + ngfw_dev_locations = toset([ + for k, v in var.cas_configs.dev + : v.location + if contains(var.ngfw_tls_configs.keys.dev.cas, k) + ]) + ngfw_dev_sa_agent_cas_iam_bindings_additive = { + nsec_dev_agent_sa_binding = { + member = module.dev-sec-project.service_agents["networksecurity"].iam_email + role = "roles/privateca.certificateManager" + } + } dev_kms_restricted_admins = [ for sa in distinct(compact([ var.service_accounts.data-platform-dev, @@ -54,3 +66,75 @@ module "dev-sec-kms" { } keys = local.kms_locations_keys[each.key] } + +module "dev-cas" { + for_each = var.cas_configs.dev + source = "../../../modules/certificate-authority-service" + project_id = module.dev-sec-project.project_id + ca_configs = each.value.ca_configs + ca_pool_config = each.value.ca_pool_config + iam = each.value.iam + iam_bindings = each.value.iam_bindings + iam_bindings_additive = ( + contains(var.ngfw_tls_configs.keys.dev.cas, each.key) + ? merge(local.ngfw_dev_sa_agent_cas_iam_bindings_additive, each.value.iam_bindings_additive) + : each.value.iam_bindings_additive + ) + iam_by_principals = each.value.iam_by_principals + location = each.value.location +} + +resource "google_certificate_manager_trust_config" "dev_trust_configs" { + for_each = var.trust_configs.dev + name = each.key + project = module.dev-sec-project.project_id + description = each.value.description + location = each.value.location + + dynamic "allowlisted_certificates" { + for_each = each.value.allowlisted_certificates + content { + pem_certificate = file(allowlisted_certificates.value) + } + } + + dynamic "trust_stores" { + for_each = each.value.trust_stores + content { + dynamic "intermediate_cas" { + for_each = trust_stores.value.intermediate_cas + content { + pem_certificate = file(intermediate_cas.value) + } + } + dynamic "trust_anchors" { + for_each = trust_stores.value.trust_anchors + content { + pem_certificate = file(trust_anchors.value) + } + } + } + } +} + +resource "google_network_security_tls_inspection_policy" "ngfw_dev_tls_ips" { + for_each = ( + var.ngfw_tls_configs.tls_inspection.enabled + ? local.ngfw_dev_locations : toset([]) + ) + name = "${var.prefix}-dev-tls-ip-0" + project = module.dev-sec-project.project_id + location = each.key + ca_pool = try([ + for k, v in module.dev-cas + : v.ca_pool_id + if v.ca_pool.location == each.key && contains(var.ngfw_tls_configs.keys.dev.cas, k) + ][0], null) + exclude_public_ca_set = var.ngfw_tls_configs.tls_inspection.exclude_public_ca_set + min_tls_version = var.ngfw_tls_configs.tls_inspection.min_tls_version + trust_config = try([ + for k, v in google_certificate_manager_trust_config.dev_trust_configs + : v.id + if v.location == each.key + ][0], null) +} diff --git a/fast/stages/2-security/core-prod.tf b/fast/stages/2-security/core-prod.tf index 393627a47..c98fe7028 100644 --- a/fast/stages/2-security/core-prod.tf +++ b/fast/stages/2-security/core-prod.tf @@ -1,5 +1,5 @@ /** - * Copyright 2023 Google LLC + * 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. @@ -15,6 +15,18 @@ */ locals { + # Extract NGFW locations from prod CAS + ngfw_prod_locations = toset([ + for k, v in var.cas_configs.prod + : v.location + if contains(var.ngfw_tls_configs.keys.prod.cas, k) + ]) + ngfw_prod_sa_agent_cas_iam_bindings_additive = { + nsec_prod_agent_sa_binding = { + member = module.prod-sec-project.service_agents["networksecurity"].iam_email + role = "roles/privateca.certificateManager" + } + } prod_kms_restricted_admins = [ for sa in distinct(compact([ var.service_accounts.data-platform-prod, @@ -53,3 +65,76 @@ module "prod-sec-kms" { } keys = local.kms_locations_keys[each.key] } + +module "prod-cas" { + for_each = var.cas_configs.prod + source = "../../../modules/certificate-authority-service" + project_id = module.prod-sec-project.project_id + ca_configs = each.value.ca_configs + ca_pool_config = each.value.ca_pool_config + iam = each.value.iam + iam_bindings = each.value.iam_bindings + iam_bindings_additive = ( + contains(var.ngfw_tls_configs.keys.prod.cas, each.key) + ? merge(local.ngfw_prod_sa_agent_cas_iam_bindings_additive, each.value.iam_bindings_additive) + : each.value.iam_bindings_additive + ) + iam_by_principals = each.value.iam_by_principals + location = each.value.location +} + +resource "google_certificate_manager_trust_config" "prod_trust_configs" { + for_each = var.trust_configs.prod + name = each.key + project = module.prod-sec-project.project_id + description = each.value.description + location = each.value.location + + dynamic "allowlisted_certificates" { + for_each = each.value.allowlisted_certificates + content { + pem_certificate = file(allowlisted_certificates.value) + } + } + + dynamic "trust_stores" { + for_each = each.value.trust_stores + content { + dynamic "intermediate_cas" { + for_each = trust_stores.value.intermediate_cas + content { + pem_certificate = file(intermediate_cas.value) + } + } + dynamic "trust_anchors" { + for_each = trust_stores.value.trust_anchors + content { + pem_certificate = file(trust_anchors.value) + } + } + } + } +} + +resource "google_network_security_tls_inspection_policy" "ngfw_prod_tls_ips" { + for_each = ( + var.ngfw_tls_configs.tls_inspection.enabled + ? local.ngfw_prod_locations : toset([]) + ) + name = "${var.prefix}-prod-tls-ip-0" + project = module.prod-sec-project.project_id + location = each.key + ca_pool = try([ + for k, v in module.prod-cas + : v.ca_pool_id + if v.ca_pool.location == each.key && contains(var.ngfw_tls_configs.keys.prod.cas, k) + ][0], null) + exclude_public_ca_set = var.ngfw_tls_configs.tls_inspection.exclude_public_ca_set + min_tls_version = var.ngfw_tls_configs.tls_inspection.min_tls_version + trust_config = try([ + for k, v in google_certificate_manager_trust_config.prod_trust_configs + : v.id + if v.location == each.key + ][0], null) +} + diff --git a/fast/stages/2-security/diagram.png b/fast/stages/2-security/diagram.png index f7cd1f8ce..a92ca897a 100644 Binary files a/fast/stages/2-security/diagram.png and b/fast/stages/2-security/diagram.png differ diff --git a/fast/stages/2-security/main.tf b/fast/stages/2-security/main.tf index a72bd7b78..ba9b6d8a4 100644 --- a/fast/stages/2-security/main.tf +++ b/fast/stages/2-security/main.tf @@ -1,5 +1,5 @@ /** - * Copyright 2023 Google LLC + * 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. @@ -33,7 +33,6 @@ locals { ) } } - # list of locations with keys kms_locations = distinct(flatten([ for k, v in var.kms_keys : v.locations @@ -48,7 +47,11 @@ locals { } } project_services = [ + "certificatemanager.googleapis.com", "cloudkms.googleapis.com", + "networkmanagement.googleapis.com", + "networksecurity.googleapis.com", + "privateca.googleapis.com", "secretmanager.googleapis.com", "stackdriver.googleapis.com" ] diff --git a/fast/stages/2-security/outputs.tf b/fast/stages/2-security/outputs.tf index 16884b066..9fdd12783 100644 --- a/fast/stages/2-security/outputs.tf +++ b/fast/stages/2-security/outputs.tf @@ -1,5 +1,5 @@ /** - * Copyright 2022 Google LLC + * 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. @@ -33,9 +33,53 @@ locals { ] ]) ) + cas_configs = { + dev = { + for k, v in module.dev-cas + : k => { + ca_pool_id = v.ca_pool_id + ca_ids = v.ca_ids + location = v.ca_pool.location + } + } + prod = { + for k, v in module.prod-cas + : k => { + ca_pool_id = v.ca_pool_id + ca_ids = v.ca_ids + location = v.ca_pool.location + } + } + } + ngfw_tls_configs = { + tls_enabled = var.ngfw_tls_configs.tls_inspection.enabled + tls_ip_ids_by_region = { + dev = { + for k, v in google_network_security_tls_inspection_policy.ngfw_dev_tls_ips + : v.location => v.id + } + prod = { + for k, v in google_network_security_tls_inspection_policy.ngfw_prod_tls_ips + : v.location => v.id + } + } + } output_kms_keys = { for k in local._output_kms_keys : k.key => k.id } tfvars = { - kms_keys = local.output_kms_keys + cas_configs = local.cas_configs + kms_keys = local.output_kms_keys + ngfw_tls_configs = local.ngfw_tls_configs + trust_config_ids = local.trust_config_ids + } + trust_config_ids = { + dev = { + for k, v in google_certificate_manager_trust_config.dev_trust_configs + : k => v.id + } + prod = { + for k, v in google_certificate_manager_trust_config.prod_trust_configs + : k => v.id + } } } @@ -52,13 +96,28 @@ resource "google_storage_bucket_object" "tfvars" { content = jsonencode(local.tfvars) } +output "cas_configs" { + description = "Certificate Authority Service configurations." + value = local.cas_configs +} + output "kms_keys" { description = "KMS key ids." value = local.output_kms_keys } +output "ngfw_tls_configs" { + description = "The NGFW Enterprise configurations." + value = local.ngfw_tls_configs +} + output "tfvars" { description = "Terraform variable files for the following stages." sensitive = true value = local.tfvars } + +output "trust_config_ids" { + description = "Certificate Manager trust-config ids." + value = local.trust_config_ids +} diff --git a/fast/stages/2-security/variables-fast.tf b/fast/stages/2-security/variables-fast.tf index 96288b0e2..7d6259920 100644 --- a/fast/stages/2-security/variables-fast.tf +++ b/fast/stages/2-security/variables-fast.tf @@ -69,6 +69,8 @@ variable "service_accounts" { type = object({ data-platform-dev = string data-platform-prod = string + nsec = string + nsec-r = string project-factory = string project-factory-dev = string project-factory-prod = string diff --git a/fast/stages/2-security/variables.tf b/fast/stages/2-security/variables.tf index dee73646f..e4c3a3623 100644 --- a/fast/stages/2-security/variables.tf +++ b/fast/stages/2-security/variables.tf @@ -14,6 +14,168 @@ * limitations under the License. */ +# Refer +variable "cas_configs" { + description = "The CAS CAs to add to each environment." + type = object({ + dev = optional(map(object({ + ca_configs = map(object({ + deletion_protection = optional(string, true) + type = optional(string, "SELF_SIGNED") + is_ca = optional(bool, true) + lifetime = optional(string, null) + pem_ca_certificate = optional(string, null) + ignore_active_certificates_on_deletion = optional(bool, false) + skip_grace_period = optional(bool, true) + labels = optional(map(string), null) + gcs_bucket = optional(string, null) + key_spec = optional(object({ + algorithm = optional(string, "RSA_PKCS1_2048_SHA256") + kms_key_id = optional(string, null) + }), {}) + key_usage = optional(object({ + cert_sign = optional(bool, true) + client_auth = optional(bool, false) + code_signing = optional(bool, false) + content_commitment = optional(bool, false) + crl_sign = optional(bool, true) + data_encipherment = optional(bool, false) + decipher_only = optional(bool, false) + digital_signature = optional(bool, false) + email_protection = optional(bool, false) + encipher_only = optional(bool, false) + key_agreement = optional(bool, false) + key_encipherment = optional(bool, true) + ocsp_signing = optional(bool, false) + server_auth = optional(bool, true) + time_stamping = optional(bool, false) + }), {}) + subject = optional(object({ + common_name = string + organization = string + country_code = optional(string) + locality = optional(string) + organizational_unit = optional(string) + postal_code = optional(string) + province = optional(string) + street_address = optional(string) + }), { + common_name = "test.example.com" + organization = "Test Example" + }) + subject_alt_name = optional(object({ + dns_names = optional(list(string), null) + email_addresses = optional(list(string), null) + ip_addresses = optional(list(string), null) + uris = optional(list(string), null) + }), null) + subordinate_config = optional(object({ + root_ca_id = optional(string) + pem_issuer_certificates = optional(list(string)) + }), null) + })) + ca_pool_config = object({ + ca_pool_id = optional(string, null) + name = optional(string, null) + tier = optional(string, "DEVOPS") + }) + location = string + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(any), {}) + iam_bindings_additive = optional(map(any), {}) + iam_by_principals = optional(map(list(string)), {}) + })), {}) + prod = optional(map(object({ + ca_configs = map(object({ + deletion_protection = optional(string, true) + type = optional(string, "SELF_SIGNED") + is_ca = optional(bool, true) + lifetime = optional(string, null) + pem_ca_certificate = optional(string, null) + ignore_active_certificates_on_deletion = optional(bool, false) + skip_grace_period = optional(bool, true) + labels = optional(map(string), null) + gcs_bucket = optional(string, null) + key_spec = optional(object({ + algorithm = optional(string, "RSA_PKCS1_2048_SHA256") + kms_key_id = optional(string, null) + }), {}) + key_usage = optional(object({ + cert_sign = optional(bool, true) + client_auth = optional(bool, false) + code_signing = optional(bool, false) + content_commitment = optional(bool, false) + crl_sign = optional(bool, true) + data_encipherment = optional(bool, false) + decipher_only = optional(bool, false) + digital_signature = optional(bool, false) + email_protection = optional(bool, false) + encipher_only = optional(bool, false) + key_agreement = optional(bool, false) + key_encipherment = optional(bool, true) + ocsp_signing = optional(bool, false) + server_auth = optional(bool, true) + time_stamping = optional(bool, false) + }), {}) + subject = optional(object({ + common_name = string + organization = string + country_code = optional(string) + locality = optional(string) + organizational_unit = optional(string) + postal_code = optional(string) + province = optional(string) + street_address = optional(string) + }), { + common_name = "test.example.com" + organization = "Test Example" + }) + subject_alt_name = optional(object({ + dns_names = optional(list(string), null) + email_addresses = optional(list(string), null) + ip_addresses = optional(list(string), null) + uris = optional(list(string), null) + }), null) + subordinate_config = optional(object({ + root_ca_id = optional(string) + pem_issuer_certificates = optional(list(string)) + }), null) + })) + ca_pool_config = object({ + ca_pool_id = optional(string, null) + name = optional(string, null) + tier = optional(string, "DEVOPS") + }) + location = string + iam = optional(map(list(string)), {}) + iam_bindings = optional(map(object({ + members = list(string) + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_bindings_additive = optional(map(object({ + member = string + role = string + condition = optional(object({ + expression = string + title = string + description = optional(string) + })) + })), {}) + iam_by_principals = optional(map(list(string)), {}) + })), {}) + }) + nullable = false + default = { + dev = {} + prod = {} + } +} + variable "essential_contacts" { description = "Email used for essential contacts, unset if null." type = string @@ -59,8 +221,63 @@ variable "kms_keys" { nullable = false } +variable "ngfw_tls_configs" { + description = "The CAS and trust configurations key names to be used for NGFW Enterprise." + type = object({ + keys = optional(object({ + dev = optional(object({ + cas = optional(list(string), ["ngfw-dev-cas-0"]) + trust_configs = optional(list(string), ["ngfw-dev-tc-0"]) + }), {}) + prod = optional(object({ + cas = optional(list(string), ["ngfw-prod-cas-0"]) + trust_configs = optional(list(string), ["ngfw-prod-tc-0"]) + }), {}) + }), {}) + tls_inspection = optional(object({ + enabled = optional(bool, false) + exclude_public_ca_set = optional(bool, false) + min_tls_version = optional(string, "TLS_1_0") + }), {}) + }) + nullable = false + default = { + dev = {} + prod = {} + } +} + variable "outputs_location" { description = "Path where providers, tfvars files, and lists for the following stages are written. Leave empty to disable." type = string default = null } + +variable "trust_configs" { + description = "The trust configs grouped by environment." + type = object({ + dev = optional(map(object({ + description = optional(string) + location = string + allowlisted_certificates = optional(map(string), {}) + trust_stores = optional(map(object({ + intermediate_cas = optional(map(string), {}) + trust_anchors = optional(map(string), {}) + })), {}) + }))) + prod = optional(map(object({ + description = optional(string) + location = string + allowlisted_certificates = optional(map(string), {}) + trust_stores = optional(map(object({ + intermediate_cas = optional(map(string), {}) + trust_anchors = optional(map(string), {}) + })), {}) + }))) + }) + nullable = false + default = { + dev = {} + prod = {} + } +} diff --git a/fast/stages/3-network-security/README.md b/fast/stages/3-network-security/README.md index 6e9a51905..cf52c977c 100644 --- a/fast/stages/3-network-security/README.md +++ b/fast/stages/3-network-security/README.md @@ -37,6 +37,8 @@ The following diagram is a high level reference of the resources created and man - We use global network firewall policies, as legacy VPC firewall rules are not compatible with NGFW Enterprise. These policies coexist with the legacy VPC firewall rules that we create in the netwroking stage. - For your convenience, firewall policy rules leverage factories, so that you can define firewall policy rules using yaml files. The path of these files is configurable. Look in the [Customization](#customizations) section for more details. - NGFW Enterprise endpoints are org-level resources that need to reference a quota project for billing purposes. By default, we create a dedicated `xxx-net-ngfw-0` quota project. Anyway, you can choose to leverage an existing project. Look in the [Customization](#customizations) section for more details. +- Firewall endpoint associations in this stage can reference TLS inspection policies created in the [2-security stage](../2-security/README.md). More info in the customization section of this document. +- While TLS inspection policies are created in the [2-security stage](../2-security/README.md), FAST still allows the service accounts of this stage and the `gcp-network-admins` group to create and manage them anywhere in the organization. ## How to run this stage @@ -137,6 +139,10 @@ ngfw_enterprise_config = { } ``` +You can optionally enable TLS inspection in stage [2-security](../2-security/README.md). +Ingesting outputs from [stage 2-security](../2-security/README.md), this stage will configure TLS inspection in NGFW Enterprise and will reference the CAs and the trust-configs you created in [stage 2-security](../2-security/README.md). +Make sure the CAs and the trusted configs created for NGFW Enterprise in the [2-security stage](../2-security/README.md) match the region where you defined your zonal firewall endpoints. + ## Files @@ -156,12 +162,13 @@ ngfw_enterprise_config = { |---|---|:---:|:---:|:---:|:---:| | [billing_account](variables-fast.tf#L17) | Billing account id. If billing account is not part of the same org set `is_org_level` to false. | object({…}) | ✓ | | 0-bootstrap | | [folder_ids](variables-fast.tf#L30) | Folders to be used for the networking resources in folders/nnnnnnnnnnn format. If null, folder will be created. | object({…}) | ✓ | | 1-resman | -| [organization](variables-fast.tf#L52) | Organization details. | object({…}) | ✓ | | 00-globals | -| [prefix](variables-fast.tf#L62) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | -| [vpc_self_links](variables-fast.tf#L72) | Self link for the shared VPC. | object({…}) | ✓ | | 2-networking | +| [organization](variables-fast.tf#L72) | Organization details. | object({…}) | ✓ | | 00-globals | +| [prefix](variables-fast.tf#L82) | Prefix used for resources that need unique names. Use a maximum of 9 chars for organizations, and 11 chars for tenants. | string | ✓ | | 0-bootstrap | +| [vpc_self_links](variables-fast.tf#L92) | Self link for the shared VPC. | object({…}) | ✓ | | 2-networking | | [factories_config](variables.tf#L17) | Configuration for network resource factories. | object({…}) | | {…} | | | [host_project_ids](variables-fast.tf#L41) | Host project for the shared VPC. | object({…}) | | {} | 2-networking | | [ngfw_enterprise_config](variables.tf#L35) | NGFW Enterprise configuration. | object({…}) | | {…} | | +| [ngfw_tls_configs](variables-fast.tf#L52) | The NGFW Enterprise TLS configurations. | object({…}) | | {…} | 2-security | ## Outputs diff --git a/fast/stages/3-network-security/data/firewall-policy-rules/dev/egress.yaml b/fast/stages/3-network-security/data/firewall-policy-rules/dev/egress.yaml index 698e450b6..b193b872c 100644 --- a/fast/stages/3-network-security/data/firewall-policy-rules/dev/egress.yaml +++ b/fast/stages/3-network-security/data/firewall-policy-rules/dev/egress.yaml @@ -20,3 +20,5 @@ egress-inspect-internet: - "0.0.0.0/0" action: "apply_security_profile_group" security_profile_group: "dev" + # Uncomment the line below to enable TLS inspection for this egress rule + # tls_inspect: true diff --git a/fast/stages/3-network-security/data/firewall-policy-rules/dev/ingress.yaml b/fast/stages/3-network-security/data/firewall-policy-rules/dev/ingress.yaml index 00add135c..7feca48e6 100644 --- a/fast/stages/3-network-security/data/firewall-policy-rules/dev/ingress.yaml +++ b/fast/stages/3-network-security/data/firewall-policy-rules/dev/ingress.yaml @@ -1,10 +1,9 @@ # skip boilerplate check --- -# start of document (---) avoids errors if the file only contains comments # yaml-language-server: $schema=../../../schemas/firewall-policy-rules.schema.json -# sample NGFW Enterprise ingress rules +# Sample NGFW Enterprise ingress rules to uncomment and customize as needed # ingress-allow-inspect-cross: # description: "Allow and inspect cross-env traffic from prod." @@ -14,6 +13,7 @@ # - prod (to be defined) # action: "apply_security_profile_group" # security_profile_group: "dev" +# tls_inspect: true # ingress-allow-inspect-intra: # description: "Allow and inspect same-env (intra-vpc) traffic." @@ -23,3 +23,4 @@ # - dev (to be defined) # action: "apply_security_profile_group" # security_profile_group: "dev" +# tls_inspect: true diff --git a/fast/stages/3-network-security/data/firewall-policy-rules/prod/egress.yaml b/fast/stages/3-network-security/data/firewall-policy-rules/prod/egress.yaml index 397acebe2..527428a19 100644 --- a/fast/stages/3-network-security/data/firewall-policy-rules/prod/egress.yaml +++ b/fast/stages/3-network-security/data/firewall-policy-rules/prod/egress.yaml @@ -16,3 +16,5 @@ egress-inspect-internet: - "0.0.0.0/0" action: "apply_security_profile_group" security_profile_group: "prod" + # Uncomment the line below to enable TLS inspection for this egress rule + # tls_inspect: true diff --git a/fast/stages/3-network-security/data/firewall-policy-rules/prod/ingress.yaml b/fast/stages/3-network-security/data/firewall-policy-rules/prod/ingress.yaml index e0aa293c5..96f8d3ee3 100644 --- a/fast/stages/3-network-security/data/firewall-policy-rules/prod/ingress.yaml +++ b/fast/stages/3-network-security/data/firewall-policy-rules/prod/ingress.yaml @@ -1,6 +1,8 @@ # skip boilerplate check --- -# Following are some NGFW Enterprise ingress rules examples +# yaml-language-server: $schema=../../../schemas/firewall-policy-rules.schema.json + +# Sample NGFW Enterprise ingress rules to uncomment and customize as needed # ingress-allow-inspect-cross: # description: "Allow and inspect cross-env traffic." @@ -10,6 +12,7 @@ # - dev (to be defined) # action: "apply_security_profile_group" # security_profile_group: "prod" +# tls_inspect: true # ingress-allow-inspect-intra: # description: "Allow and inspect intra-VPC traffic." @@ -19,3 +22,4 @@ # - prod (to be defined) # action: "apply_security_profile_group" # security_profile_group: "prod" +# tls_inspect: true diff --git a/fast/stages/3-network-security/diagram.png b/fast/stages/3-network-security/diagram.png index 960cbff20..9fb05873a 100644 Binary files a/fast/stages/3-network-security/diagram.png and b/fast/stages/3-network-security/diagram.png differ diff --git a/fast/stages/3-network-security/diagram.svg b/fast/stages/3-network-security/diagram.svg index 3c586b458..83547ed34 100644 --- a/fast/stages/3-network-security/diagram.svg +++ b/fast/stages/3-network-security/diagram.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/fast/stages/3-network-security/net-dev.tf b/fast/stages/3-network-security/net-dev.tf index 408a4e4ec..461cd8db0 100644 --- a/fast/stages/3-network-security/net-dev.tf +++ b/fast/stages/3-network-security/net-dev.tf @@ -38,6 +38,12 @@ resource "google_network_security_firewall_endpoint_association" "dev_fw_ep_asso location = each.value firewall_endpoint = google_network_security_firewall_endpoint.firewall_endpoint[each.key].id network = try(local.vpc_ids.dev-spoke-0, null) + # If TLS inspection is enabled, link the regional TLS inspection policy + tls_inspection_policy = ( + var.ngfw_tls_configs.tls_enabled + ? try(var.ngfw_tls_configs.tls_ip_ids_by_region.dev[substr(each.value, 0, length(each.value) - 2)], null) + : null + ) } module "dev-spoke-firewall-policy" { diff --git a/fast/stages/3-network-security/net-prod.tf b/fast/stages/3-network-security/net-prod.tf index bffdf133c..d69638033 100644 --- a/fast/stages/3-network-security/net-prod.tf +++ b/fast/stages/3-network-security/net-prod.tf @@ -38,6 +38,12 @@ resource "google_network_security_firewall_endpoint_association" "prod_fw_ep_ass location = each.value firewall_endpoint = google_network_security_firewall_endpoint.firewall_endpoint[each.key].id network = try(local.vpc_ids.prod-spoke-0, null) + # If TLS inspection is enabled, link the regional TLS inspection policy + tls_inspection_policy = ( + var.ngfw_tls_configs.tls_enabled + ? try(var.ngfw_tls_configs.tls_ip_ids_by_region.prod[substr(each.value, 0, length(each.value) - 2)], null) + : null + ) } module "prod-spoke-firewall-policy" { diff --git a/fast/stages/3-network-security/variables-fast.tf b/fast/stages/3-network-security/variables-fast.tf index 7a65658b0..e6b6de55c 100644 --- a/fast/stages/3-network-security/variables-fast.tf +++ b/fast/stages/3-network-security/variables-fast.tf @@ -49,6 +49,26 @@ variable "host_project_ids" { default = {} } +variable "ngfw_tls_configs" { + # tfdoc:variable:source 2-security + description = "The NGFW Enterprise TLS configurations." + type = object({ + tls_enabled = optional(bool, false) + tls_ip_ids_by_region = optional(object({ + dev = optional(map(string), {}) + prod = optional(map(string), {}) + })) + }) + nullable = false + default = { + tls_enabled = false + tls_ip_ids_by_region = { + dev = {} + prod = {} + } + } +} + variable "organization" { # tfdoc:variable:source 00-globals description = "Organization details." diff --git a/fast/stages/diagrams.excalidraw.gz b/fast/stages/diagrams.excalidraw.gz index 5cf62be67..2d168c2ac 100644 Binary files a/fast/stages/diagrams.excalidraw.gz and b/fast/stages/diagrams.excalidraw.gz differ diff --git a/tests/fast/stages/s0_bootstrap/checklist.yaml b/tests/fast/stages/s0_bootstrap/checklist.yaml index 86f58ee38..d49a8e57e 100644 --- a/tests/fast/stages/s0_bootstrap/checklist.yaml +++ b/tests/fast/stages/s0_bootstrap/checklist.yaml @@ -46,21 +46,6 @@ values: google_storage_bucket_object.providers["0-bootstrap"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-bootstrap-0\"\n impersonate_service_account\ - \ = \"fast-prod-bootstrap-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n\ - \ }\n}\nprovider \"google\" {\n impersonate_service_account = \"fast-prod-bootstrap-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\nprovider \"google-beta\" {\n impersonate_service_account = \"fast-prod-bootstrap-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for bootstrap\n" - content_disposition: null content_encoding: null content_language: null customer_encryption: [] @@ -75,21 +60,6 @@ values: google_storage_bucket_object.providers["0-bootstrap-r"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-bootstrap-0\"\n impersonate_service_account\ - \ = \"fast-prod-bootstrap-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n\ - \ }\n}\nprovider \"google\" {\n impersonate_service_account = \"fast-prod-bootstrap-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\nprovider \"google-beta\" {\n impersonate_service_account = \"fast-prod-bootstrap-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for bootstrap\n" - content_disposition: null content_encoding: null content_language: null customer_encryption: [] @@ -104,21 +74,6 @@ values: google_storage_bucket_object.providers["1-resman"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-resman-0\"\n impersonate_service_account\ - \ = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n }\n\ - }\nprovider \"google\" {\n impersonate_service_account = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\nprovider \"google-beta\" {\n impersonate_service_account = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for resman\n" - content_disposition: null content_encoding: null content_language: null customer_encryption: [] @@ -133,21 +88,6 @@ values: google_storage_bucket_object.providers["1-resman-r"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-resman-0\"\n impersonate_service_account\ - \ = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n \ - \ }\n}\nprovider \"google\" {\n impersonate_service_account = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\nprovider \"google-beta\" {\n impersonate_service_account = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for resman\n" - content_disposition: null content_encoding: null content_language: null customer_encryption: [] @@ -162,21 +102,6 @@ values: google_storage_bucket_object.providers["1-tenant-factory"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-resman-0\"\n impersonate_service_account\ - \ = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n \ - \ prefix = \"tenant-factory\"\n }\n}\nprovider \"google\" {\n impersonate_service_account\ - \ = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n}\n\ - provider \"google-beta\" {\n impersonate_service_account = \"fast-prod-resman-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for tenant-factory\n" content_disposition: null content_encoding: null content_language: null @@ -192,21 +117,6 @@ values: google_storage_bucket_object.providers["1-tenant-factory-r"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-resman-0\"\n impersonate_service_account\ - \ = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n \ - \ prefix = \"tenant-factory\"\n }\n}\nprovider \"google\" {\n impersonate_service_account\ - \ = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n}\n\ - provider \"google-beta\" {\n impersonate_service_account = \"fast-prod-resman-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for tenant-factory\n" content_disposition: null content_encoding: null content_language: null @@ -222,21 +132,6 @@ values: google_storage_bucket_object.providers["1-vpcsc"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-vpcsc-0\"\n impersonate_service_account\ - \ = \"fast-prod-vpcsc-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n \ - \ prefix = \"vpcsc\"\n }\n}\nprovider \"google\" {\n impersonate_service_account\ - \ = \"fast-prod-vpcsc-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n}\n\ - provider \"google-beta\" {\n impersonate_service_account = \"fast-prod-vpcsc-0@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for vpcsc\n" content_disposition: null content_encoding: null content_language: null @@ -252,21 +147,6 @@ values: google_storage_bucket_object.providers["1-vpcsc-r"]: bucket: fast-prod-iac-core-outputs-0 cache_control: null - content: "/**\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache\ - \ License, Version 2.0 (the \"License\");\n * you may not use this file except\ - \ in compliance with the License.\n * You may obtain a copy of the License at\n\ - \ *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required\ - \ by applicable law or agreed to in writing, software\n * distributed under\ - \ the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR\ - \ CONDITIONS OF ANY KIND, either express or implied.\n * See the License for\ - \ the specific language governing permissions and\n * limitations under the\ - \ License.\n */\n\nterraform {\n backend \"gcs\" {\n bucket \ - \ = \"fast-prod-iac-core-vpcsc-0\"\n impersonate_service_account\ - \ = \"fast-prod-vpcsc-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n \ - \ prefix = \"vpcsc\"\n }\n}\nprovider \"google\" {\n impersonate_service_account\ - \ = \"fast-prod-vpcsc-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\n}\n\ - provider \"google-beta\" {\n impersonate_service_account = \"fast-prod-vpcsc-0r@fast-prod-iac-core-0.iam.gserviceaccount.com\"\ - \n}\n\n# end provider.tf for vpcsc\n" content_disposition: null content_encoding: null content_language: null @@ -1646,9 +1526,9 @@ values: module.organization.google_organization_iam_binding.bindings["organization_iam_admin_conditional"]: condition: - description: Automation service account delegated grants. - expression: 'api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''roles/accesscontextmanager.policyAdmin'',''roles/cloudasset.viewer'',''roles/compute.orgFirewallPolicyAdmin'',''roles/compute.xpnAdmin'',''roles/orgpolicy.policyAdmin'',''roles/orgpolicy.policyViewer'',''roles/resourcemanager.organizationViewer'']) + expression: 'api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''roles/accesscontextmanager.policyAdmin'',''roles/cloudasset.viewer'',''roles/compute.orgFirewallPolicyAdmin'',''roles/compute.orgFirewallPolicyUser'',''roles/compute.xpnAdmin'',''roles/orgpolicy.policyAdmin'',''roles/orgpolicy.policyViewer'',''roles/resourcemanager.organizationViewer'']) - || api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''organizations/123456789012/roles/networkFirewallPoliciesAdmin'',''organizations/123456789012/roles/networkFirewallPoliciesViewer'',''organizations/123456789012/roles/ngfwEnterpriseAdmin'',''organizations/123456789012/roles/ngfwEnterpriseViewer'',''organizations/123456789012/roles/serviceProjectNetworkAdmin'',''organizations/123456789012/roles/tenantNetworkAdmin'']) + || api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''organizations/123456789012/roles/networkFirewallPoliciesAdmin'',''organizations/123456789012/roles/ngfwEnterpriseAdmin'',''organizations/123456789012/roles/ngfwEnterpriseViewer'',''organizations/123456789012/roles/serviceProjectNetworkAdmin'',''organizations/123456789012/roles/tenantNetworkAdmin'']) ' title: automation_sa_delegated_grants @@ -1687,15 +1567,6 @@ values: role_id: networkFirewallPoliciesAdmin stage: GA title: Custom role networkFirewallPoliciesAdmin - module.organization.google_organization_iam_custom_role.roles["network_firewall_policies_viewer"]: - description: Terraform-managed. - org_id: '123456789012' - permissions: - - networksecurity.firewallEndpointAssociations.get - - networksecurity.firewallEndpointAssociations.list - role_id: networkFirewallPoliciesViewer - stage: GA - title: Custom role networkFirewallPoliciesViewer module.organization.google_organization_iam_custom_role.roles["ngfw_enterprise_admin"]: description: Terraform-managed. org_id: '123456789012' @@ -1724,6 +1595,11 @@ values: - networksecurity.securityProfiles.list - networksecurity.securityProfiles.update - networksecurity.securityProfiles.use + - networksecurity.tlsInspectionPolicies.create + - networksecurity.tlsInspectionPolicies.get + - networksecurity.tlsInspectionPolicies.list + - networksecurity.tlsInspectionPolicies.update + - networksecurity.tlsInspectionPolicies.use role_id: ngfwEnterpriseAdmin stage: GA title: Custom role ngfwEnterpriseAdmin @@ -1744,6 +1620,9 @@ values: - networksecurity.securityProfiles.get - networksecurity.securityProfiles.list - networksecurity.securityProfiles.use + - networksecurity.tlsInspectionPolicies.get + - networksecurity.tlsInspectionPolicies.list + - networksecurity.tlsInspectionPolicies.use role_id: ngfwEnterpriseViewer stage: GA title: Custom role ngfwEnterpriseViewer @@ -2066,7 +1945,7 @@ counts: google_logging_project_bucket_config: 4 google_org_policy_policy: 22 google_organization_iam_binding: 28 - google_organization_iam_custom_role: 11 + google_organization_iam_custom_role: 10 google_organization_iam_member: 42 google_project: 3 google_project_iam_audit_config: 1 @@ -2085,4 +1964,4 @@ counts: google_tags_tag_key: 1 google_tags_tag_value: 1 modules: 21 - resources: 237 + resources: 236 diff --git a/tests/fast/stages/s0_bootstrap/simple.yaml b/tests/fast/stages/s0_bootstrap/simple.yaml index d5e936d86..4d1558505 100644 --- a/tests/fast/stages/s0_bootstrap/simple.yaml +++ b/tests/fast/stages/s0_bootstrap/simple.yaml @@ -21,7 +21,7 @@ counts: google_logging_project_bucket_config: 4 google_org_policy_policy: 22 google_organization_iam_binding: 28 - google_organization_iam_custom_role: 11 + google_organization_iam_custom_role: 10 google_organization_iam_member: 29 google_project: 3 google_project_iam_audit_config: 1 @@ -41,7 +41,7 @@ counts: google_tags_tag_value: 1 local_file: 10 modules: 20 - resources: 231 + resources: 230 outputs: automation: __missing__ @@ -50,7 +50,6 @@ outputs: custom_roles: gcve_network_admin: organizations/123456789012/roles/gcveNetworkAdmin network_firewall_policies_admin: organizations/123456789012/roles/networkFirewallPoliciesAdmin - network_firewall_policies_viewer: organizations/123456789012/roles/networkFirewallPoliciesViewer ngfw_enterprise_admin: organizations/123456789012/roles/ngfwEnterpriseAdmin ngfw_enterprise_viewer: organizations/123456789012/roles/ngfwEnterpriseViewer organization_admin_viewer: organizations/123456789012/roles/organizationAdminViewer @@ -73,3 +72,4 @@ outputs: workload_identity_pool: pool: null providers: {} + diff --git a/tests/fast/stages/s1_resman/checklist.tfvars b/tests/fast/stages/s1_resman/checklist.tfvars index 3684f0f77..809977312 100644 --- a/tests/fast/stages/s1_resman/checklist.tfvars +++ b/tests/fast/stages/s1_resman/checklist.tfvars @@ -13,14 +13,13 @@ billing_account = { } custom_roles = { # organization_iam_admin = "organizations/123456789012/roles/organizationIamAdmin", - gcve_network_admin = "organizations/123456789012/roles/gcveNetworkAdmin" - network_firewall_policies_admin = "organizations/123456789012/roles/networkFirewallPoliciesAdmin" - network_firewall_policies_viewer = "organizations/123456789012/roles/networkFirewallPoliciesViewer" - ngfw_enterprise_admin = "organizations/123456789012/roles/ngfwEnterpriseAdmin" - ngfw_enterprise_viewer = "organizations/123456789012/roles/ngfwEnterpriseViewer" - organization_admin_viewer = "organizations/123456789012/roles/organizationAdminViewer" - service_project_network_admin = "organizations/123456789012/roles/xpnServiceAdmin" - storage_viewer = "organizations/123456789012/roles/storageViewer" + gcve_network_admin = "organizations/123456789012/roles/gcveNetworkAdmin" + network_firewall_policies_admin = "organizations/123456789012/roles/networkFirewallPoliciesAdmin" + ngfw_enterprise_admin = "organizations/123456789012/roles/ngfwEnterpriseAdmin" + ngfw_enterprise_viewer = "organizations/123456789012/roles/ngfwEnterpriseViewer" + organization_admin_viewer = "organizations/123456789012/roles/organizationAdminViewer" + service_project_network_admin = "organizations/123456789012/roles/xpnServiceAdmin" + storage_viewer = "organizations/123456789012/roles/storageViewer" } factories_config = { checklist_data = "checklist-data.json" diff --git a/tests/fast/stages/s1_resman/checklist.yaml b/tests/fast/stages/s1_resman/checklist.yaml index c3208c0ba..4fe2b0647 100644 --- a/tests/fast/stages/s1_resman/checklist.yaml +++ b/tests/fast/stages/s1_resman/checklist.yaml @@ -13,6 +13,671 @@ # limitations under the License. values: + google_storage_bucket_object.providers["2-networking"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-networking-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-networking-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-networking-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory"]: + bucket: test + cache_control: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-dev"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-dev-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-dev-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-dev-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-prod"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-prod-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-prod-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-prod-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-r"]: + bucket: test + cache_control: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-security"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-security-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-security-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-security-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.tfvars: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: tfvars/1-resman.auto.tfvars.json + retention: [] + source: null + temporary_hold: null + timeouts: null + module.branch-network-dev-folder.google_folder.folder[0]: + display_name: Development + timeouts: null + ? module.branch-network-dev-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/gcveNetworkAdmin"] + : condition: [] + members: null + role: organizations/123456789012/roles/gcveNetworkAdmin + ? module.branch-network-dev-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/xpnServiceAdmin"] + : condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: organizations/123456789012/roles/xpnServiceAdmin + module.branch-network-dev-folder.google_folder_iam_binding.authoritative["roles/compute.networkViewer"]: + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.networkViewer + module.branch-network-dev-folder.google_tags_tag_binding.binding["environment"]: + timeouts: null + module.branch-network-folder.google_folder.folder[0]: + display_name: Networking + parent: organizations/123456789012 + timeouts: null + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/compute.xpnAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.xpnAdmin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/editor"]: + condition: [] + members: + - group:gcp-vpc-network-admins@fast.example.com + role: roles/editor + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/logging.admin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/logging.admin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/owner"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/owner + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderAdmin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderViewer + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.projectCreator"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.projectCreator + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/viewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/viewer + module.branch-network-folder.google_tags_tag_binding.binding["context"]: + timeouts: null + module.branch-network-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-net-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-network-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-net-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-network-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-net-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + module.branch-network-prod-folder.google_folder.folder[0]: + display_name: Production + timeouts: null + ? module.branch-network-prod-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/gcveNetworkAdmin"] + : condition: [] + members: null + role: organizations/123456789012/roles/gcveNetworkAdmin + ? module.branch-network-prod-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/xpnServiceAdmin"] + : condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: organizations/123456789012/roles/xpnServiceAdmin + module.branch-network-prod-folder.google_folder_iam_binding.authoritative["roles/compute.networkViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.networkViewer + module.branch-network-prod-folder.google_tags_tag_binding.binding["environment"]: + timeouts: null + ? module.branch-network-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-network-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-net-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman networking service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-network-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-network-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-network-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-network-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-net-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman networking service account. + project: fast-prod-automation + timeouts: null + module.branch-network-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-network-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-pf-dev-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-dev-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-dev-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-dev-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-dev-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-dev-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-pf-dev-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-dev-r-sa.google_service_account.service_account[0]: + account_id: fast2-dev-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory development service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-dev-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-pf-dev-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-dev-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-dev-sa.google_service_account.service_account[0]: + account_id: fast2-dev-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory development service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-dev-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-dev-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-pf-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + module.branch-pf-prod-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-prod-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-prod-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-pf-prod-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-prod-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory production service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-prod-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-pf-prod-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-prod-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-prod-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory production service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-prod-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-prod-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + ? module.branch-pf-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-r-sa.google_service_account.service_account[0]: + account_id: fast2-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory main service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"]: + bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-sa.google_service_account.service_account[0]: + account_id: fast2-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory main service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-security-folder.google_folder.folder[0]: + display_name: Security + parent: organizations/123456789012 + timeouts: null + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/editor"]: + condition: [] + members: + - group:gcp-security-admins@fast.example.com + role: roles/editor + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/logging.admin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/logging.admin + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/owner"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/owner + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderAdmin + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderViewer + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.projectCreator"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.projectCreator + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/viewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/viewer + module.branch-security-folder.google_folder_iam_binding.bindings["tenant_iam_admin_conditional"]: + condition: + - description: Certificate Authority Service delegated grants. + expression: api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/privateca.certificateManager']) + title: security_sa_delegated_grants + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderIamAdmin + module.branch-security-folder.google_tags_tag_binding.binding["context"]: + timeouts: null + module.branch-security-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-sec-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-security-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-sec-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-security-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-sec-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-security-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-security-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-sec-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman security service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-security-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-security-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-security-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-security-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-sec-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman security service account. + project: fast-prod-automation + timeouts: null + module.branch-security-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-security-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin module.checklist-folder-1["Common"].google_folder.folder[0]: display_name: Common parent: organizations/123456789012 @@ -413,10 +1078,194 @@ values: module.checklist-folder-3["Department 3/Team 4/Production"].google_folder.folder[0]: display_name: Production timeouts: null + module.organization[0].google_organization_iam_member.bindings["sa_net_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_net_fw_policy_admin"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/compute.orgFirewallPolicyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_net_xpn_admin"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/compute.xpnAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_billing"]: + condition: [] + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory main. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + ' + title: org_policy_tag_pf_scoped + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_costs_manager"]: + condition: [] + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_billing"]: + condition: [] + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory dev. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + && + + resource.matchTag(''123456789012/environment'', ''development'') + + ' + title: org_policy_tag_pf_scoped_dev + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_costs_manager"]: + condition: [] + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory prod. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + && + + resource.matchTag(''123456789012/environment'', ''production'') + + ' + title: org_policy_tag_pf_scoped_prod + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_costs_manager"]: + condition: [] + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_sec_asset_viewer"]: + condition: [] + member: serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/cloudasset.viewer + module.organization[0].google_organization_iam_member.bindings["sa_sec_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_tags_tag_key.default["context"]: + description: Resource management context. + parent: organizations/123456789012 + purpose: null + purpose_data: null + short_name: context + timeouts: null + module.organization[0].google_tags_tag_key.default["environment"]: + description: Environment definition. + parent: organizations/123456789012 + purpose: null + purpose_data: null + short_name: environment + timeouts: null + module.organization[0].google_tags_tag_value.default["context/data"]: + description: Managed by the Terraform organization module. + short_name: data + timeouts: null + module.organization[0].google_tags_tag_value.default["context/gcve"]: + description: Managed by the Terraform organization module. + short_name: gcve + timeouts: null + module.organization[0].google_tags_tag_value.default["context/gke"]: + description: Managed by the Terraform organization module. + short_name: gke + timeouts: null + module.organization[0].google_tags_tag_value.default["context/networking"]: + description: Managed by the Terraform organization module. + short_name: networking + timeouts: null + module.organization[0].google_tags_tag_value.default["context/project-factory"]: + description: Managed by the Terraform organization module. + short_name: project-factory + timeouts: null + module.organization[0].google_tags_tag_value.default["context/sandbox"]: + description: Managed by the Terraform organization module. + short_name: sandbox + timeouts: null + module.organization[0].google_tags_tag_value.default["context/security"]: + description: Managed by the Terraform organization module. + short_name: security + timeouts: null + module.organization[0].google_tags_tag_value.default["environment/development"]: + description: Managed by the Terraform organization module. + short_name: development + timeouts: null + module.organization[0].google_tags_tag_value.default["environment/production"]: + description: Managed by the Terraform organization module. + short_name: production + timeouts: null + module.organization[0].google_tags_tag_value_iam_binding.bindings["environment/development:pf"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser + module.organization[0].google_tags_tag_value_iam_binding.bindings["environment/production:pf"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser + module.top-level-folder["teams"].google_folder.folder[0]: + display_name: Teams + parent: organizations/123456789012 + timeouts: null + ? module.top-level-folder["teams"].google_folder_iam_binding.authoritative["organizations/123456789012/roles/xpnServiceAdmin"] + : condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: organizations/123456789012/roles/xpnServiceAdmin + module.top-level-folder["teams"].google_folder_iam_binding.authoritative["roles/owner"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/owner + module.top-level-folder["teams"].google_folder_iam_binding.authoritative["roles/resourcemanager.folderAdmin"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderAdmin + module.top-level-folder["teams"].google_folder_iam_binding.authoritative["roles/resourcemanager.projectCreator"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.projectCreator + module.top-level-folder["teams"].google_folder_iam_binding.authoritative["roles/resourcemanager.tagUser"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser + module.top-level-folder["teams"].google_tags_tag_binding.binding["context"]: + timeouts: null counts: google_folder: 57 - google_folder_iam_binding: 74 + google_folder_iam_binding: 75 google_organization_iam_member: 14 google_project_iam_member: 10 google_service_account: 10 @@ -430,4 +1279,4 @@ counts: google_tags_tag_value: 9 google_tags_tag_value_iam_binding: 2 modules: 73 - resources: 229 + resources: 230 diff --git a/tests/fast/stages/s1_resman/simple.tfvars b/tests/fast/stages/s1_resman/simple.tfvars index 046f45fdf..5a999ff8c 100644 --- a/tests/fast/stages/s1_resman/simple.tfvars +++ b/tests/fast/stages/s1_resman/simple.tfvars @@ -13,14 +13,13 @@ billing_account = { } custom_roles = { # organization_iam_admin = "organizations/123456789012/roles/organizationIamAdmin", - gcve_network_admin = "organizations/123456789012/roles/gcveNetworkAdmin" - network_firewall_policies_admin = "organizations/123456789012/roles/networkFirewallPoliciesAdmin" - network_firewall_policies_viewer = "organizations/123456789012/roles/networkFirewallPoliciesViewer" - ngfw_enterprise_admin = "organizations/123456789012/roles/ngfwEnterpriseAdmin" - ngfw_enterprise_viewer = "organizations/123456789012/roles/ngfwEnterpriseViewer" - organization_admin_viewer = "organizations/123456789012/roles/organizationAdminViewer" - service_project_network_admin = "organizations/123456789012/roles/xpnServiceAdmin" - storage_viewer = "organizations/123456789012/roles/storageViewer" + gcve_network_admin = "organizations/123456789012/roles/gcveNetworkAdmin" + network_firewall_policies_admin = "organizations/123456789012/roles/networkFirewallPoliciesAdmin" + ngfw_enterprise_admin = "organizations/123456789012/roles/ngfwEnterpriseAdmin" + ngfw_enterprise_viewer = "organizations/123456789012/roles/ngfwEnterpriseViewer" + organization_admin_viewer = "organizations/123456789012/roles/organizationAdminViewer" + service_project_network_admin = "organizations/123456789012/roles/xpnServiceAdmin" + storage_viewer = "organizations/123456789012/roles/storageViewer" } groups = { gcp-billing-admins = "gcp-billing-admins", diff --git a/tests/fast/stages/s1_resman/simple.yaml b/tests/fast/stages/s1_resman/simple.yaml index 6a2bd8830..8c019e5d0 100644 --- a/tests/fast/stages/s1_resman/simple.yaml +++ b/tests/fast/stages/s1_resman/simple.yaml @@ -13,6 +13,836 @@ # limitations under the License. values: + google_storage_bucket_object.providers["2-networking"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-networking-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-networking-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-networking-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory"]: + bucket: test + cache_control: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-dev"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-dev-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-dev-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-dev-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-prod"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-prod-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-prod-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-prod-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-project-factory-r"]: + bucket: test + cache_control: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-project-factory-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-security"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-security-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.providers["2-security-r"]: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: providers/2-security-r-providers.tf + retention: [] + source: null + temporary_hold: null + timeouts: null + google_storage_bucket_object.tfvars: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: tfvars/1-resman.auto.tfvars.json + retention: [] + source: null + temporary_hold: null + timeouts: null + module.branch-network-dev-folder.google_folder.folder[0]: + display_name: Development + timeouts: null + ? module.branch-network-dev-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/gcveNetworkAdmin"] + : condition: [] + members: null + role: organizations/123456789012/roles/gcveNetworkAdmin + ? module.branch-network-dev-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/xpnServiceAdmin"] + : condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: organizations/123456789012/roles/xpnServiceAdmin + module.branch-network-dev-folder.google_folder_iam_binding.authoritative["roles/compute.networkViewer"]: + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.networkViewer + module.branch-network-dev-folder.google_tags_tag_binding.binding["environment"]: + timeouts: null + module.branch-network-folder.google_folder.folder[0]: + display_name: Networking + parent: organizations/123456789012 + timeouts: null + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/browser"]: + condition: [] + members: + - user:extra-browser@fast.example.com + role: roles/browser + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/compute.xpnAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.xpnAdmin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/editor"]: + condition: [] + members: + - group:gcp-vpc-network-admins@fast.example.com + role: roles/editor + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/logging.admin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/logging.admin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/owner"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + - user:extra-owner@fast.example.com + role: roles/owner + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderAdmin + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderViewer + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.projectCreator"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.projectCreator + module.branch-network-folder.google_folder_iam_binding.authoritative["roles/viewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/viewer + module.branch-network-folder.google_tags_tag_binding.binding["context"]: + timeouts: null + module.branch-network-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-net-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-network-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-net-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-network-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-net-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-net-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + module.branch-network-prod-folder.google_folder.folder[0]: + display_name: Production + timeouts: null + ? module.branch-network-prod-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/gcveNetworkAdmin"] + : condition: [] + members: null + role: organizations/123456789012/roles/gcveNetworkAdmin + ? module.branch-network-prod-folder.google_folder_iam_binding.authoritative["organizations/123456789012/roles/xpnServiceAdmin"] + : condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: organizations/123456789012/roles/xpnServiceAdmin + module.branch-network-prod-folder.google_folder_iam_binding.authoritative["roles/compute.networkViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/compute.networkViewer + module.branch-network-prod-folder.google_tags_tag_binding.binding["environment"]: + timeouts: null + ? module.branch-network-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-network-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-net-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman networking service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-network-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-network-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-network-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-network-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-net-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman networking service account. + project: fast-prod-automation + timeouts: null + module.branch-network-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-network-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-pf-dev-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-dev-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-dev-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-dev-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-dev-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-dev-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-dev-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-pf-dev-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-dev-r-sa.google_service_account.service_account[0]: + account_id: fast2-dev-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory development service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-dev-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-pf-dev-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-dev-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-dev-sa.google_service_account.service_account[0]: + account_id: fast2-dev-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory development service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-dev-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-dev-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-pf-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + module.branch-pf-prod-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-pf-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-pf-prod-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-pf-prod-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-pf-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-pf-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-pf-prod-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-prod-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory production service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-prod-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-pf-prod-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-prod-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-prod-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory production service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-prod-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-prod-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + ? module.branch-pf-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-r-sa.google_service_account.service_account[0]: + account_id: fast2-resman-pf-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory main service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-pf-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"]: + bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-pf-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-pf-sa.google_service_account.service_account[0]: + account_id: fast2-resman-pf-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform project factory main service account. + project: fast-prod-automation + timeouts: null + module.branch-pf-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-pf-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.branch-security-folder.google_folder.folder[0]: + display_name: Security + parent: organizations/123456789012 + timeouts: null + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/browser"]: + condition: [] + members: + - user:extra-browser@fast.example.com + role: roles/browser + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/editor"]: + condition: [] + members: + - group:gcp-security-admins@fast.example.com + role: roles/editor + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/logging.admin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/logging.admin + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/owner"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + - user:extra-owner@fast.example.com + role: roles/owner + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderAdmin"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderAdmin + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.folderViewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderViewer + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/resourcemanager.projectCreator"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.projectCreator + module.branch-security-folder.google_folder_iam_binding.authoritative["roles/viewer"]: + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/viewer + module.branch-security-folder.google_folder_iam_binding.bindings["tenant_iam_admin_conditional"]: + condition: + - description: Certificate Authority Service delegated grants. + expression: api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/privateca.certificateManager']) + title: security_sa_delegated_grants + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.folderIamAdmin + module.branch-security-folder.google_tags_tag_binding.binding["context"]: + timeouts: null + module.branch-security-gcs.google_storage_bucket.bucket: + autoclass: [] + cors: [] + custom_placement_config: [] + default_event_based_hold: null + enable_object_retention: null + encryption: [] + force_destroy: false + labels: null + lifecycle_rule: [] + location: EU + logging: [] + name: fast2-prod-resman-sec-0 + project: fast-prod-automation + requester_pays: null + retention_policy: [] + storage_class: STANDARD + timeouts: null + uniform_bucket_level_access: true + versioning: + - enabled: true + module.branch-security-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectAdmin"]: + bucket: fast2-prod-resman-sec-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectAdmin + module.branch-security-gcs.google_storage_bucket_iam_binding.authoritative["roles/storage.objectViewer"]: + bucket: fast2-prod-resman-sec-0 + condition: [] + members: + - serviceAccount:fast2-prod-resman-sec-0r@fast-prod-automation.iam.gserviceaccount.com + role: roles/storage.objectViewer + ? module.branch-security-r-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-security-r-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-sec-0r + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman security service account (read-only). + project: fast-prod-automation + timeouts: null + module.branch-security-r-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + ? module.branch-security-r-sa.google_storage_bucket_iam_member.bucket-roles["test-organizations/123456789012/roles/storageViewer"] + : bucket: test + condition: [] + role: organizations/123456789012/roles/storageViewer + ? module.branch-security-sa.google_project_iam_member.project-roles["fast-prod-automation-roles/serviceusage.serviceUsageConsumer"] + : condition: [] + project: fast-prod-automation + role: roles/serviceusage.serviceUsageConsumer + module.branch-security-sa.google_service_account.service_account[0]: + account_id: fast2-prod-resman-sec-0 + create_ignore_already_exists: null + description: null + disabled: false + display_name: Terraform resman security service account. + project: fast-prod-automation + timeouts: null + module.branch-security-sa.google_service_account_iam_binding.authoritative["roles/iam.serviceAccountTokenCreator"]: + condition: [] + members: null + role: roles/iam.serviceAccountTokenCreator + module.branch-security-sa.google_storage_bucket_iam_member.bucket-roles["test-roles/storage.objectAdmin"]: + bucket: test + condition: [] + role: roles/storage.objectAdmin + module.organization[0].google_organization_iam_member.bindings["sa_net_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_net_fw_policy_admin"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/compute.orgFirewallPolicyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_net_xpn_admin"]: + condition: [] + member: serviceAccount:fast2-prod-resman-net-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/compute.xpnAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_billing"]: + condition: [] + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory main. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + ' + title: org_policy_tag_pf_scoped + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_costs_manager"]: + condition: [] + member: serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_billing"]: + condition: [] + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory dev. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + && + + resource.matchTag(''123456789012/environment'', ''development'') + + ' + title: org_policy_tag_pf_scoped_dev + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_dev_costs_manager"]: + condition: [] + member: serviceAccount:fast2-dev-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_conditional_org_policy"]: + condition: + - description: Org policy tag scoped grant for project factory prod. + expression: 'resource.matchTag(''123456789012/context'', ''project-factory'') + + && + + resource.matchTag(''123456789012/environment'', ''production'') + + ' + title: org_policy_tag_pf_scoped_prod + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/orgpolicy.policyAdmin + module.organization[0].google_organization_iam_member.bindings["sa_pf_prod_costs_manager"]: + condition: [] + member: serviceAccount:fast2-prod-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.costsManager + module.organization[0].google_organization_iam_member.bindings["sa_sec_asset_viewer"]: + condition: [] + member: serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/cloudasset.viewer + module.organization[0].google_organization_iam_member.bindings["sa_sec_billing"]: + condition: [] + member: serviceAccount:fast2-prod-resman-sec-0@fast-prod-automation.iam.gserviceaccount.com + org_id: '123456789012' + role: roles/billing.user + module.organization[0].google_tags_tag_key.default["context"]: + description: Resource management context. + parent: organizations/123456789012 + purpose: null + purpose_data: null + short_name: context + timeouts: null + module.organization[0].google_tags_tag_key.default["environment"]: + description: Environment definition. + parent: organizations/123456789012 + purpose: null + purpose_data: null + short_name: environment + timeouts: null + module.organization[0].google_tags_tag_value.default["context/data"]: + description: Managed by the Terraform organization module. + short_name: data + timeouts: null + module.organization[0].google_tags_tag_value.default["context/gcve"]: + description: Managed by the Terraform organization module. + short_name: gcve + timeouts: null + module.organization[0].google_tags_tag_value.default["context/gke"]: + description: Managed by the Terraform organization module. + short_name: gke + timeouts: null + module.organization[0].google_tags_tag_value.default["context/networking"]: + description: Managed by the Terraform organization module. + short_name: networking + timeouts: null + module.organization[0].google_tags_tag_value.default["context/project-factory"]: + description: Managed by the Terraform organization module. + short_name: project-factory + timeouts: null + module.organization[0].google_tags_tag_value.default["context/sandbox"]: + description: Managed by the Terraform organization module. + short_name: sandbox + timeouts: null + module.organization[0].google_tags_tag_value.default["context/security"]: + description: Managed by the Terraform organization module. + short_name: security + timeouts: null + module.organization[0].google_tags_tag_value.default["environment/development"]: + description: Managed by the Terraform organization module. + short_name: development + timeouts: null + module.organization[0].google_tags_tag_value.default["environment/production"]: + description: Managed by the Terraform organization module. + short_name: production + timeouts: null + module.organization[0].google_tags_tag_value_iam_binding.bindings["environment/development:pf"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser + module.organization[0].google_tags_tag_value_iam_binding.bindings["environment/production:pf"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser module.top-level-folder["teams"].google_folder.folder[0]: display_name: Teams parent: organizations/123456789012 @@ -37,12 +867,17 @@ values: members: - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com role: roles/resourcemanager.projectCreator + module.top-level-folder["teams"].google_folder_iam_binding.authoritative["roles/resourcemanager.tagUser"]: + condition: [] + members: + - serviceAccount:fast2-resman-pf-0@fast-prod-automation.iam.gserviceaccount.com + role: roles/resourcemanager.tagUser module.top-level-folder["teams"].google_tags_tag_binding.binding["context"]: timeouts: null counts: google_folder: 5 - google_folder_iam_binding: 28 + google_folder_iam_binding: 29 google_organization_iam_member: 14 google_project_iam_member: 10 google_service_account: 10 @@ -56,4 +891,4 @@ counts: google_tags_tag_value: 9 google_tags_tag_value_iam_binding: 2 modules: 21 - resources: 131 + resources: 132 diff --git a/tests/fast/stages/s2_security/simple.tfvars b/tests/fast/stages/s2_security/simple.tfvars index 8d7dbab28..0dff49037 100644 --- a/tests/fast/stages/s2_security/simple.tfvars +++ b/tests/fast/stages/s2_security/simple.tfvars @@ -28,6 +28,8 @@ service_accounts = { security = "foobar@iam.gserviceaccount.com" data-platform-dev = "foobar@iam.gserviceaccount.com" data-platform-prod = "foobar@iam.gserviceaccount.com" + nsec = "foobar@iam.gserviceaccount.com" + nsec-r = "foobar@iam.gserviceaccount.com" project-factory = "foobar@iam.gserviceaccount.com" project-factory-dev = "foobar@iam.gserviceaccount.com" project-factory-prod = "foobar@iam.gserviceaccount.com" diff --git a/tests/fast/stages/s2_security/simple.yaml b/tests/fast/stages/s2_security/simple.yaml index 21d05e8bb..e98ac3805 100644 --- a/tests/fast/stages/s2_security/simple.yaml +++ b/tests/fast/stages/s2_security/simple.yaml @@ -12,6 +12,439 @@ # See the License for the specific language governing permissions and # limitations under the License. +values: + google_storage_bucket_object.tfvars: + bucket: test + cache_control: null + content_disposition: null + content_encoding: null + content_language: null + customer_encryption: [] + detect_md5hash: different hash + event_based_hold: null + metadata: null + name: tfvars/2-security.auto.tfvars.json + retention: [] + source: null + temporary_hold: null + timeouts: null + module.dev-sec-kms["europe"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.dev-sec-kms["europe"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.dev-sec-kms["europe"].google_kms_key_ring.default[0]: + location: europe + name: dev-europe + project: fast-dev-sec-core-0 + timeouts: null + module.dev-sec-kms["europe-west1"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.dev-sec-kms["europe-west1"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.dev-sec-kms["europe-west1"].google_kms_key_ring.default[0]: + location: europe-west1 + name: dev-europe-west1 + project: fast-dev-sec-core-0 + timeouts: null + module.dev-sec-kms["europe-west3"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.dev-sec-kms["europe-west3"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.dev-sec-kms["europe-west3"].google_kms_key_ring.default[0]: + location: europe-west3 + name: dev-europe-west3 + project: fast-dev-sec-core-0 + timeouts: null + module.dev-sec-kms["global"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.dev-sec-kms["global"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.dev-sec-kms["global"].google_kms_key_ring.default[0]: + location: global + name: dev-global + project: fast-dev-sec-core-0 + timeouts: null + module.dev-sec-project.google_project.project[0]: + auto_create_network: false + billing_account: 000000-111111-222222 + deletion_policy: DELETE + effective_labels: + environment: dev + team: security + folder_id: null + labels: + environment: dev + team: security + name: fast-dev-sec-core-0 + org_id: null + project_id: fast-dev-sec-core-0 + terraform_labels: + environment: dev + team: security + timeouts: null + module.dev-sec-project.google_project_iam_binding.authoritative["roles/cloudkms.viewer"]: + condition: [] + members: + - serviceAccount:foobar@iam.gserviceaccount.com + project: fast-dev-sec-core-0 + role: roles/cloudkms.viewer + ? module.dev-sec-project.google_project_iam_member.bindings["kms_restricted_admin.serviceAccount:foobar@iam.gserviceaccount.com"] + : condition: + - description: Automation service account delegated grants. + expression: 'api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''roles/cloudkms.cryptoKeyEncrypterDecrypter'',''roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation'']) + && + + resource.type == ''cloudkms.googleapis.com/CryptoKey'' + + ' + title: kms_sa_delegated_grants + member: serviceAccount:foobar@iam.gserviceaccount.com + project: fast-dev-sec-core-0 + role: roles/cloudkms.admin + module.dev-sec-project.google_project_iam_member.service_agents["certificatemanager"]: + condition: [] + project: fast-dev-sec-core-0 + role: roles/certificatemanager.serviceAgent + module.dev-sec-project.google_project_iam_member.service_agents["cloudkms"]: + condition: [] + project: fast-dev-sec-core-0 + role: roles/cloudkms.serviceAgent + module.dev-sec-project.google_project_iam_member.service_agents["networkmanagement"]: + condition: [] + project: fast-dev-sec-core-0 + role: roles/networkmanagement.serviceAgent + module.dev-sec-project.google_project_service.project_services["certificatemanager.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: certificatemanager.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["cloudkms.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: cloudkms.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["networkmanagement.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: networkmanagement.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["networksecurity.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: networksecurity.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["privateca.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: privateca.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["secretmanager.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: secretmanager.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service.project_services["stackdriver.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-dev-sec-core-0 + service: stackdriver.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["certificatemanager.googleapis.com"]: + project: fast-dev-sec-core-0 + service: certificatemanager.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["cloudkms.googleapis.com"]: + project: fast-dev-sec-core-0 + service: cloudkms.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["networkmanagement.googleapis.com"]: + project: fast-dev-sec-core-0 + service: networkmanagement.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["networksecurity.googleapis.com"]: + project: fast-dev-sec-core-0 + service: networksecurity.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["privateca.googleapis.com"]: + project: fast-dev-sec-core-0 + service: privateca.googleapis.com + timeouts: null + module.dev-sec-project.google_project_service_identity.default["secretmanager.googleapis.com"]: + project: fast-dev-sec-core-0 + service: secretmanager.googleapis.com + timeouts: null + module.folder.google_essential_contacts_contact.contact["gcp-security-admins@fast.example.com"]: + email: gcp-security-admins@fast.example.com + language_tag: en + notification_category_subscriptions: + - ALL + timeouts: null + module.folder.google_folder.folder[0]: + display_name: Security + parent: organizations/123456789012 + timeouts: null + module.prod-sec-kms["europe"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.prod-sec-kms["europe"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.prod-sec-kms["europe"].google_kms_key_ring.default[0]: + location: europe + name: prod-europe + project: fast-prod-sec-core-0 + timeouts: null + module.prod-sec-kms["europe-west1"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.prod-sec-kms["europe-west1"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.prod-sec-kms["europe-west1"].google_kms_key_ring.default[0]: + location: europe-west1 + name: prod-europe-west1 + project: fast-prod-sec-core-0 + timeouts: null + module.prod-sec-kms["europe-west3"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.prod-sec-kms["europe-west3"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.prod-sec-kms["europe-west3"].google_kms_key_ring.default[0]: + location: europe-west3 + name: prod-europe-west3 + project: fast-prod-sec-core-0 + timeouts: null + module.prod-sec-kms["global"].google_kms_crypto_key.default["compute"]: + effective_labels: + service: compute + labels: + service: compute + name: compute + purpose: ENCRYPT_DECRYPT + rotation_period: 7776000s + skip_initial_version_creation: false + terraform_labels: + service: compute + timeouts: null + module.prod-sec-kms["global"].google_kms_crypto_key_iam_binding.authoritative["compute.roles/cloudkms.admin"]: + condition: [] + members: + - user:user1@example.com + role: roles/cloudkms.admin + module.prod-sec-kms["global"].google_kms_key_ring.default[0]: + location: global + name: prod-global + project: fast-prod-sec-core-0 + timeouts: null + module.prod-sec-project.google_project.project[0]: + auto_create_network: false + billing_account: 000000-111111-222222 + deletion_policy: DELETE + effective_labels: + environment: prod + team: security + folder_id: null + labels: + environment: prod + team: security + name: fast-prod-sec-core-0 + org_id: null + project_id: fast-prod-sec-core-0 + terraform_labels: + environment: prod + team: security + timeouts: null + module.prod-sec-project.google_project_iam_binding.authoritative["roles/cloudkms.viewer"]: + condition: [] + members: + - serviceAccount:foobar@iam.gserviceaccount.com + project: fast-prod-sec-core-0 + role: roles/cloudkms.viewer + ? module.prod-sec-project.google_project_iam_member.bindings["kms_restricted_admin.serviceAccount:foobar@iam.gserviceaccount.com"] + : condition: + - description: Automation service account delegated grants. + expression: 'api.getAttribute(''iam.googleapis.com/modifiedGrantsByRole'', []).hasOnly([''roles/cloudkms.cryptoKeyEncrypterDecrypter'',''roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation'']) + && + + resource.type == ''cloudkms.googleapis.com/CryptoKey'' + + ' + title: kms_sa_delegated_grants + member: serviceAccount:foobar@iam.gserviceaccount.com + project: fast-prod-sec-core-0 + role: roles/cloudkms.admin + module.prod-sec-project.google_project_iam_member.service_agents["certificatemanager"]: + condition: [] + project: fast-prod-sec-core-0 + role: roles/certificatemanager.serviceAgent + module.prod-sec-project.google_project_iam_member.service_agents["cloudkms"]: + condition: [] + project: fast-prod-sec-core-0 + role: roles/cloudkms.serviceAgent + module.prod-sec-project.google_project_iam_member.service_agents["networkmanagement"]: + condition: [] + project: fast-prod-sec-core-0 + role: roles/networkmanagement.serviceAgent + module.prod-sec-project.google_project_service.project_services["certificatemanager.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: certificatemanager.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["cloudkms.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: cloudkms.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["networkmanagement.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: networkmanagement.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["networksecurity.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: networksecurity.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["privateca.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: privateca.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["secretmanager.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: secretmanager.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service.project_services["stackdriver.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast-prod-sec-core-0 + service: stackdriver.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["certificatemanager.googleapis.com"]: + project: fast-prod-sec-core-0 + service: certificatemanager.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["cloudkms.googleapis.com"]: + project: fast-prod-sec-core-0 + service: cloudkms.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["networkmanagement.googleapis.com"]: + project: fast-prod-sec-core-0 + service: networkmanagement.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["networksecurity.googleapis.com"]: + project: fast-prod-sec-core-0 + service: networksecurity.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["privateca.googleapis.com"]: + project: fast-prod-sec-core-0 + service: privateca.googleapis.com + timeouts: null + module.prod-sec-project.google_project_service_identity.default["secretmanager.googleapis.com"]: + project: fast-prod-sec-core-0 + service: secretmanager.googleapis.com + timeouts: null + counts: google_essential_contacts_contact: 1 google_folder: 1 @@ -20,9 +453,24 @@ counts: google_kms_key_ring: 8 google_project: 2 google_project_iam_binding: 2 - google_project_iam_member: 4 - google_project_service: 6 - google_project_service_identity: 4 + google_project_iam_member: 8 + google_project_service: 14 + google_project_service_identity: 12 google_storage_bucket_object: 1 modules: 11 - resources: 45 + resources: 65 + +outputs: + cas_configs: + dev: {} + prod: {} + kms_keys: __missing__ + ngfw_tls_configs: + tls_enabled: false + tls_ip_ids_by_region: + dev: {} + prod: {} + tfvars: __missing__ + trust_config_ids: + dev: {} + prod: {} diff --git a/fast/stages/0-bootstrap/data/custom-roles/network_firewall_policies_viewer.yaml b/tests/fast/stages/s3_network_security/tftest.yaml similarity index 71% rename from fast/stages/0-bootstrap/data/custom-roles/network_firewall_policies_viewer.yaml rename to tests/fast/stages/s3_network_security/tftest.yaml index 6f0ab59e9..5f6eafbb3 100644 --- a/fast/stages/0-bootstrap/data/custom-roles/network_firewall_policies_viewer.yaml +++ b/tests/fast/stages/s3_network_security/tftest.yaml @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -# yaml-language-server: $schema=../../schemas/custom-role.schema.json +module: fast/stages/3-network-security/ -name: networkFirewallPoliciesViewer -includedPermissions: - - networksecurity.firewallEndpointAssociations.get - - networksecurity.firewallEndpointAssociations.list +tests: + simple: + tls: diff --git a/tests/fast/stages/s3_network_security/tls.tfvars b/tests/fast/stages/s3_network_security/tls.tfvars new file mode 100644 index 000000000..72f88d660 --- /dev/null +++ b/tests/fast/stages/s3_network_security/tls.tfvars @@ -0,0 +1,40 @@ +billing_account = { + id = "000000-111111-222222" +} +folder_ids = { + networking = "folders/12345678900" + networking-dev = "folders/12345678901" + networking-prod = "folders/12345678902" +} +host_project_ids = { + dev-spoke-0 = "dev-project" + prod-spoke-0 = "prod-project" +} +ngfw_enterprise_config = { + endpoint_zones = [ + "europe-west1-b", + "europe-west1-c", + "europe-west1-d" + ] +} +ngfw_tls_configs = { + tls_enabled = true + tls_ip_ids_by_region = { + dev = { + europe-west1 = "projects/project1/locations/europe-west1/tlsInspectionPolicies/dev-tls-ip-0" + } + prod = { + europe-west1 = "projects/project1/locations/europe-west1/tlsInspectionPolicies/prod-tls-ip-0" + } + } +} +organization = { + domain = "fast.example.com" + id = 123456789012 + customer_id = "C00000000" +} +prefix = "fast2" +vpc_self_links = { + dev-spoke-0 = "https://www.googleapis.com/compute/v1/projects/123456789/networks/vpc-1" + prod-spoke-0 = "https://www.googleapis.com/compute/v1/projects/123456789/networks/vpc-2" +} diff --git a/tests/fast/stages/s3_network_security/tls.yaml b/tests/fast/stages/s3_network_security/tls.yaml new file mode 100644 index 000000000..83431eac8 --- /dev/null +++ b/tests/fast/stages/s3_network_security/tls.yaml @@ -0,0 +1,309 @@ +# 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. + +values: + google_network_security_firewall_endpoint.firewall_endpoint["europe-west1-b"]: + billing_project_id: fast2-net-ngfw-0 + labels: null + location: europe-west1-b + name: fast2-ngfw-endpoint-europe-west1-b + parent: organizations/123456789012 + timeouts: null + google_network_security_firewall_endpoint.firewall_endpoint["europe-west1-c"]: + billing_project_id: fast2-net-ngfw-0 + labels: null + location: europe-west1-c + name: fast2-ngfw-endpoint-europe-west1-c + parent: organizations/123456789012 + timeouts: null + google_network_security_firewall_endpoint.firewall_endpoint["europe-west1-d"]: + billing_project_id: fast2-net-ngfw-0 + labels: null + location: europe-west1-d + name: fast2-ngfw-endpoint-europe-west1-d + parent: organizations/123456789012 + timeouts: null + google_network_security_firewall_endpoint_association.dev_fw_ep_association["europe-west1-b"]: + disabled: false + labels: null + location: europe-west1-b + name: fast2-dev-epa-europe-west1-b + network: projects/123456789/networks/vpc-1 + parent: projects/dev-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/dev-tls-ip-0 + google_network_security_firewall_endpoint_association.dev_fw_ep_association["europe-west1-c"]: + disabled: false + labels: null + location: europe-west1-c + name: fast2-dev-epa-europe-west1-c + network: projects/123456789/networks/vpc-1 + parent: projects/dev-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/dev-tls-ip-0 + google_network_security_firewall_endpoint_association.dev_fw_ep_association["europe-west1-d"]: + disabled: false + labels: null + location: europe-west1-d + name: fast2-dev-epa-europe-west1-d + network: projects/123456789/networks/vpc-1 + parent: projects/dev-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/dev-tls-ip-0 + google_network_security_firewall_endpoint_association.prod_fw_ep_association["europe-west1-b"]: + disabled: false + labels: null + location: europe-west1-b + name: fast2-prod-epa-europe-west1-b + network: projects/123456789/networks/vpc-2 + parent: projects/prod-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/prod-tls-ip-0 + google_network_security_firewall_endpoint_association.prod_fw_ep_association["europe-west1-c"]: + disabled: false + labels: null + location: europe-west1-c + name: fast2-prod-epa-europe-west1-c + network: projects/123456789/networks/vpc-2 + parent: projects/prod-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/prod-tls-ip-0 + google_network_security_firewall_endpoint_association.prod_fw_ep_association["europe-west1-d"]: + disabled: false + labels: null + location: europe-west1-d + name: fast2-prod-epa-europe-west1-d + network: projects/123456789/networks/vpc-2 + parent: projects/prod-project + timeouts: null + tls_inspection_policy: projects/project1/locations/europe-west1/tlsInspectionPolicies/prod-tls-ip-0 + google_network_security_security_profile.dev_sec_profile: + description: null + labels: null + location: global + name: fast2-dev-sp-0 + parent: organizations/123456789012 + threat_prevention_profile: [] + timeouts: null + type: THREAT_PREVENTION + google_network_security_security_profile.prod_sec_profile: + description: null + labels: null + location: global + name: fast2-prod-sp-0 + parent: organizations/123456789012 + threat_prevention_profile: [] + timeouts: null + type: THREAT_PREVENTION + google_network_security_security_profile_group.dev_sec_profile_group: + description: Dev security profile group. + labels: null + location: global + name: fast2-dev-spg-0 + parent: organizations/123456789012 + timeouts: null + google_network_security_security_profile_group.prod_sec_profile_group: + description: prod security profile group. + labels: null + location: global + name: fast2-prod-spg-0 + parent: organizations/123456789012 + timeouts: null + module.dev-spoke-firewall-policy.google_compute_network_firewall_policy.net-global[0]: + description: null + name: fast2-dev-fw-policy + project: dev-project + timeouts: null + module.dev-spoke-firewall-policy.google_compute_network_firewall_policy_association.net-global["dev-spoke"]: + attachment_target: https://www.googleapis.com/compute/v1/projects/123456789/networks/vpc-1 + firewall_policy: fast2-dev-fw-policy + name: fast2-dev-fw-policy-dev-spoke + project: dev-project + timeouts: null + module.dev-spoke-firewall-policy.google_compute_network_firewall_policy_rule.net-global["egress/egress-allow-rfc1918"]: + action: allow + description: Allow all hosts to RFC-1918 + direction: EGRESS + disabled: false + enable_logging: null + firewall_policy: fast2-dev-fw-policy + match: + - dest_address_groups: null + dest_fqdns: null + dest_ip_ranges: + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + dest_region_codes: null + dest_threat_intelligences: null + layer4_configs: + - ip_protocol: all + ports: null + src_address_groups: null + src_fqdns: null + src_ip_ranges: null + src_region_codes: null + src_secure_tags: [] + src_threat_intelligences: null + priority: 2147483546 + project: dev-project + rule_name: egress-allow-rfc1918 + security_profile_group: null + target_secure_tags: [] + target_service_accounts: null + timeouts: null + tls_inspect: null + module.dev-spoke-firewall-policy.google_compute_network_firewall_policy_rule.net-global["egress/egress-inspect-internet"]: + action: apply_security_profile_group + description: Inspect egress traffic from all dev hosts to Internet + direction: EGRESS + disabled: false + enable_logging: null + firewall_policy: fast2-dev-fw-policy + match: + - dest_address_groups: null + dest_fqdns: null + dest_ip_ranges: + - 0.0.0.0/0 + dest_region_codes: null + dest_threat_intelligences: null + layer4_configs: + - ip_protocol: all + ports: null + src_address_groups: null + src_fqdns: null + src_ip_ranges: null + src_region_codes: null + src_secure_tags: [] + src_threat_intelligences: null + priority: 2147483547 + project: dev-project + rule_name: egress-inspect-internet + target_secure_tags: [] + target_service_accounts: null + timeouts: null + tls_inspect: null + module.ngfw-quota-project.google_project.project[0]: + auto_create_network: false + billing_account: 000000-111111-222222 + deletion_policy: DELETE + folder_id: '12345678900' + labels: null + name: fast2-net-ngfw-0 + org_id: null + project_id: fast2-net-ngfw-0 + timeouts: null + module.ngfw-quota-project.google_project_service.project_services["networksecurity.googleapis.com"]: + disable_dependent_services: false + disable_on_destroy: false + project: fast2-net-ngfw-0 + service: networksecurity.googleapis.com + timeouts: null + module.ngfw-quota-project.google_project_service_identity.default["networksecurity.googleapis.com"]: + project: fast2-net-ngfw-0 + service: networksecurity.googleapis.com + timeouts: null + module.prod-spoke-firewall-policy.google_compute_network_firewall_policy.net-global[0]: + description: null + name: fast2-prod-fw-policy + project: prod-project + timeouts: null + module.prod-spoke-firewall-policy.google_compute_network_firewall_policy_association.net-global["prod-spoke"]: + attachment_target: https://www.googleapis.com/compute/v1/projects/123456789/networks/vpc-2 + firewall_policy: fast2-prod-fw-policy + name: fast2-prod-fw-policy-prod-spoke + project: prod-project + timeouts: null + module.prod-spoke-firewall-policy.google_compute_network_firewall_policy_rule.net-global["egress/egress-allow-rfc1918"]: + action: allow + description: Allow all hosts to RFC-1918 + direction: EGRESS + disabled: false + enable_logging: null + firewall_policy: fast2-prod-fw-policy + match: + - dest_address_groups: null + dest_fqdns: null + dest_ip_ranges: + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + dest_region_codes: null + dest_threat_intelligences: null + layer4_configs: + - ip_protocol: all + ports: null + src_address_groups: null + src_fqdns: null + src_ip_ranges: null + src_region_codes: null + src_secure_tags: [] + src_threat_intelligences: null + priority: 2147483546 + project: prod-project + rule_name: egress-allow-rfc1918 + security_profile_group: null + target_secure_tags: [] + target_service_accounts: null + timeouts: null + tls_inspect: null + module.prod-spoke-firewall-policy.google_compute_network_firewall_policy_rule.net-global["egress/egress-inspect-internet"]: + action: apply_security_profile_group + description: Inspect egress traffic from all prod hosts to Internet + direction: EGRESS + disabled: false + enable_logging: null + firewall_policy: fast2-prod-fw-policy + match: + - dest_address_groups: null + dest_fqdns: null + dest_ip_ranges: + - 0.0.0.0/0 + dest_region_codes: null + dest_threat_intelligences: null + layer4_configs: + - ip_protocol: all + ports: null + src_address_groups: null + src_fqdns: null + src_ip_ranges: null + src_region_codes: null + src_secure_tags: [] + src_threat_intelligences: null + priority: 2147483547 + project: prod-project + rule_name: egress-inspect-internet + target_secure_tags: [] + target_service_accounts: null + timeouts: null + tls_inspect: null + +counts: + google_compute_network_firewall_policy: 2 + google_compute_network_firewall_policy_association: 2 + google_compute_network_firewall_policy_rule: 4 + google_network_security_firewall_endpoint: 3 + google_network_security_firewall_endpoint_association: 6 + google_network_security_security_profile: 2 + google_network_security_security_profile_group: 2 + google_project: 1 + google_project_service: 1 + google_project_service_identity: 1 + modules: 3 + resources: 24 + +outputs: + ngfw_enterprise_endpoint_ids: __missing__ + ngfw_enterprise_endpoints_quota_project: fast2-net-ngfw-0 +