fast/addons/2-networking-ngfw/variables.tf (239 lines of code) (raw):

/** * Copyright 2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ variable "certificate_authorities" { description = "Certificate Authority Service pool and CAs. If host project ids is null identical pools and CAs are created in every host project." type = map(object({ 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)), {}) 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 = optional(object({ create_pool = optional(object({ name = optional(string) tier = optional(string, "DEVOPS") })) use_pool = optional(object({ id = string })) })) })) nullable = false default = {} } variable "enable_services" { description = "Configure project by enabling services required for this add-on." type = bool nullable = false default = true } variable "names" { description = "Configuration for names used for output files." type = object({ output_files_prefix = optional(string, "2-networking-ngfw") }) nullable = false default = {} } variable "ngfw_config" { description = "Configuration for NGFW Enterprise endpoints. Billing project defaults to the automation project. Network and TLS inspection policy ids support interpolation." type = object({ endpoint_zones = list(string) name = optional(string, "ngfw-0") network_associations = optional(map(object({ vpc_id = string disabled = optional(bool) tls_inspection_policy = optional(string) zones = optional(list(string)) })), {}) }) nullable = false } variable "outputs_location" { description = "Path where providers and tfvars files for the following stages are written. Leave empty to disable." type = string default = null } variable "project_id" { description = "Project where the network security resources will be created." type = string nullable = false } variable "security_profiles" { description = "Security profile groups for Layer 7 inspection. Null environment list means all environments." type = map(object({ description = optional(string) threat_prevention_profile = optional(object({ severity_overrides = optional(map(object({ action = string severity = string }))) threat_overrides = optional(map(object({ action = string threat_id = string }))) }), {}) })) nullable = false default = { ngfw-default = {} } validation { condition = alltrue(flatten([ for _, v in var.security_profiles : [ for _, sv in coalesce(v.threat_prevention_profile.severity_overrides, {}) : ( contains(["ALERT", "ALLOW", "DEFAULT_ACTION", "DENY"], sv.action) && contains(["CRITICAL", "HIGH", "INFORMATIONAL", "LOW", "MEDIUM"], sv.severity) ) ] ])) error_message = "Incorrect severity override token." } validation { condition = alltrue(flatten([ for _, v in var.security_profiles : [ for _, sv in coalesce(v.threat_prevention_profile.threat_overrides, {}) : ( contains(["ALERT", "ALLOW", "DEFAULT_ACTION", "DENY"], sv.action) ) ] ])) error_message = "Incorrect threat override token." } } variable "tls_inspection_policies" { description = "TLS inspection policies configuration. CA pools, trust configs and host project ids support interpolation." type = map(object({ ca_pool_id = string location = string exclude_public_ca_set = optional(bool) trust_config = optional(string) tls = optional(object({ custom_features = optional(list(string)) feature_profile = optional(string) min_version = optional(string) }), {}) })) nullable = false default = {} validation { condition = alltrue([ for k, v in var.tls_inspection_policies : v.tls.min_version == null || contains( ["TLS_VERSION_UNSPECIFIED", "TLS_1_0", "TLS_1_1", "TLS_1_2", "TLS_1_3"], coalesce(v.tls.min_version, "-") ) ]) error_message = "Invalid min TLS version." } validation { condition = alltrue([ for k, v in var.tls_inspection_policies : v.tls.feature_profile == null || contains( ["PROFILE_UNSPECIFIED", "PROFILE_COMPATIBLE", "PROFILE_MODERN", "PROFILE_RESTRICTED", "PROFILE_CUSTOM"], coalesce(v.tls.feature_profile, "-") ) ]) error_message = "Invalid TLS feature profile." } validation { condition = alltrue([ for k, v in var.tls_inspection_policies : v.tls.custom_features == null || v.tls.feature_profile == "PROFILE_CUSTOM" ]) error_message = "TLS custom features can only be used with custom profile." } } variable "trust_configs" { description = "Certificate Manager trust configurations for TLS inspection policies. Project ids and region can reference keys in the relevant FAST variables." type = map(object({ location = string description = optional(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-ngfw-default = { # location = "primary" # project_id = "dev-spoke-0" # } # prod-ngfw-default = { # location = "primary" # project_id = "prod-spoke-0" # } } validation { condition = alltrue([ for k, v in var.trust_configs : ( v.allowlisted_certificates != null || try(v.trust_stores.intermediate_cas, null) != null || try(v.trust_stores.trust_anchors, null) != null ) ]) error_message = "a trust configuration needs at least one set of allowlisted certificates, or a valid trust store." } }