modules/secure-serverless-harness/service_perimeter.tf (227 lines of code) (raw):
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
locals {
prefix = "secure_cloud_run"
access_level_name = "alp_${local.prefix}_members_${random_string.random_access_level_suffix.result}"
perimeter_name = "sp_${local.prefix}_perimeter_${random_string.random_access_level_suffix.result}"
access_context_manager_policy_id = var.create_access_context_manager_access_policy ? google_access_context_manager_access_policy.access_policy[0].id : var.access_context_manager_policy_id
access_level_members = concat(var.access_level_members,
[for project in module.serverless_project : "serviceAccount:${project.services_identities["cloudbuild"]}"],
[for project in module.serverless_project : "serviceAccount:${project.services_identities["gcs"]}"],
[for project in module.serverless_project : "serviceAccount:${project.services_identities["cloudservices"]}"]
)
}
resource "random_string" "random_access_level_suffix" {
length = 4
lower = true
numeric = true
upper = false
special = false
}
/******************************************
Access Context Manager Policy
*******************************************/
resource "google_access_context_manager_access_policy" "access_policy" {
count = var.create_access_context_manager_access_policy ? 1 : 0
parent = "organizations/${var.org_id}"
title = "default policy"
}
module "access_level_members" {
source = "terraform-google-modules/vpc-service-controls/google//modules/access_level"
version = "~> 6.0"
description = "${local.prefix} Access Level"
policy = local.access_context_manager_policy_id
name = local.access_level_name
members = local.access_level_members
}
module "regular_service_perimeter" {
source = "terraform-google-modules/vpc-service-controls/google//modules/regular_service_perimeter"
version = "~> 6.0"
policy = local.access_context_manager_policy_id
perimeter_name = local.perimeter_name
description = "Serverless VPC Service Controls perimeter"
access_levels = [module.access_level_members.name]
egress_policies = var.egress_policies
ingress_policies = var.ingress_policies
vpc_accessible_services = ["RESTRICTED-SERVICES"]
restricted_services = [
"accessapproval.googleapis.com",
"adsdatahub.googleapis.com",
"aiplatform.googleapis.com",
"alloydb.googleapis.com",
"alpha-documentai.googleapis.com",
"analyticshub.googleapis.com",
"apigee.googleapis.com",
"apigeeconnect.googleapis.com",
"artifactregistry.googleapis.com",
"assuredworkloads.googleapis.com",
"automl.googleapis.com",
"baremetalsolution.googleapis.com",
"batch.googleapis.com",
"bigquery.googleapis.com",
"bigquerydatapolicy.googleapis.com",
"bigquerydatatransfer.googleapis.com",
"bigquerymigration.googleapis.com",
"bigqueryreservation.googleapis.com",
"bigtable.googleapis.com",
"binaryauthorization.googleapis.com",
"cloud.googleapis.com",
"cloudasset.googleapis.com",
"cloudbuild.googleapis.com",
"clouddebugger.googleapis.com",
"clouddeploy.googleapis.com",
"clouderrorreporting.googleapis.com",
"cloudfunctions.googleapis.com",
"cloudkms.googleapis.com",
"cloudprofiler.googleapis.com",
"cloudresourcemanager.googleapis.com",
"cloudscheduler.googleapis.com",
"cloudsearch.googleapis.com",
"cloudtrace.googleapis.com",
"composer.googleapis.com",
"compute.googleapis.com",
"connectgateway.googleapis.com",
"contactcenterinsights.googleapis.com",
"container.googleapis.com",
"containeranalysis.googleapis.com",
"containerfilesystem.googleapis.com",
"containerregistry.googleapis.com",
"containerthreatdetection.googleapis.com",
"datacatalog.googleapis.com",
"dataflow.googleapis.com",
"datafusion.googleapis.com",
"datamigration.googleapis.com",
"dataplex.googleapis.com",
"dataproc.googleapis.com",
"datastream.googleapis.com",
"dialogflow.googleapis.com",
"dlp.googleapis.com",
"dns.googleapis.com",
"documentai.googleapis.com",
"domains.googleapis.com",
"eventarc.googleapis.com",
"file.googleapis.com",
"firebaseappcheck.googleapis.com",
"firebaserules.googleapis.com",
"firestore.googleapis.com",
"gameservices.googleapis.com",
"gkebackup.googleapis.com",
"gkeconnect.googleapis.com",
"gkehub.googleapis.com",
"healthcare.googleapis.com",
"iam.googleapis.com",
"iamcredentials.googleapis.com",
"iaptunnel.googleapis.com",
"ids.googleapis.com",
"integrations.googleapis.com",
"kmsinventory.googleapis.com",
"krmapihosting.googleapis.com",
"language.googleapis.com",
"lifesciences.googleapis.com",
"logging.googleapis.com",
"managedidentities.googleapis.com",
"memcache.googleapis.com",
"meshca.googleapis.com",
"meshconfig.googleapis.com",
"metastore.googleapis.com",
"ml.googleapis.com",
"monitoring.googleapis.com",
"networkconnectivity.googleapis.com",
"networkmanagement.googleapis.com",
"networksecurity.googleapis.com",
"networkservices.googleapis.com",
"notebooks.googleapis.com",
"opsconfigmonitoring.googleapis.com",
"orgpolicy.googleapis.com",
"osconfig.googleapis.com",
"oslogin.googleapis.com",
"privateca.googleapis.com",
"pubsub.googleapis.com",
"pubsublite.googleapis.com",
"recaptchaenterprise.googleapis.com",
"recommender.googleapis.com",
"redis.googleapis.com",
"retail.googleapis.com",
"run.googleapis.com",
"secretmanager.googleapis.com",
"servicecontrol.googleapis.com",
"servicedirectory.googleapis.com",
"spanner.googleapis.com",
"speakerid.googleapis.com",
"speech.googleapis.com",
"sqladmin.googleapis.com",
"storage.googleapis.com",
"storagetransfer.googleapis.com",
"sts.googleapis.com",
"texttospeech.googleapis.com",
"timeseriesinsights.googleapis.com",
"tpu.googleapis.com",
"trafficdirector.googleapis.com",
"transcoder.googleapis.com",
"translate.googleapis.com",
"videointelligence.googleapis.com",
"vision.googleapis.com",
"visionai.googleapis.com",
"vmmigration.googleapis.com",
"vpcaccess.googleapis.com",
"webrisk.googleapis.com",
"workflows.googleapis.com",
"workstations.googleapis.com",
]
}
resource "google_access_context_manager_service_perimeter_resource" "service_perimeter_serverless_resource" {
for_each = module.serverless_project
perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${module.regular_service_perimeter.perimeter_name}"
resource = "projects/${each.value.project_number}"
depends_on = [
module.serverless_project,
module.security_project,
module.network_project,
module.regular_service_perimeter
]
}
resource "google_access_context_manager_service_perimeter_resource" "service_perimeter_security_resource" {
perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${module.regular_service_perimeter.perimeter_name}"
resource = "projects/${module.security_project.project_number}"
depends_on = [
module.serverless_project,
module.security_project,
module.network_project,
module.regular_service_perimeter
]
}
resource "google_access_context_manager_service_perimeter_resource" "service_perimeter_network_resource" {
count = var.use_shared_vpc ? 1 : 0
perimeter_name = "accessPolicies/${local.access_context_manager_policy_id}/servicePerimeters/${module.regular_service_perimeter.perimeter_name}"
resource = "projects/${module.network_project[0].project_number}"
depends_on = [
module.serverless_project,
module.security_project,
module.network_project,
module.regular_service_perimeter
]
}
resource "time_sleep" "wait_vpc_sc_propagation" {
depends_on = [
google_access_context_manager_service_perimeter_resource.service_perimeter_security_resource,
google_access_context_manager_service_perimeter_resource.service_perimeter_serverless_resource,
google_access_context_manager_service_perimeter_resource.service_perimeter_network_resource,
module.access_level_members,
module.regular_service_perimeter
]
create_duration = var.time_to_wait_vpc_sc_propagation
destroy_duration = var.time_to_wait_vpc_sc_propagation
}