modules/secure-cd/iam.tf (103 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 {
attestor_iam_config = flatten([
for env_key, env in var.deploy_branch_clusters : [
for attestor in env.required_attestations : {
env = env_key
attestor = split("/", attestor)[3]
}
]
])
cd_sa_required_roles = [
"roles/clouddeploy.jobRunner",
]
}
# Cloud Deploy Execution Service Account
# https://cloud.google.com/deploy/docs/cloud-deploy-service-account#execution_service_account
resource "google_service_account" "clouddeploy_execution_sa" {
project = var.project_id
account_id = "clouddeploy-execution-sa"
display_name = "clouddeploy-execution-sa"
}
resource "google_project_iam_member" "cd_sa_iam" {
for_each = toset(local.cd_sa_required_roles)
project = var.project_id
role = each.value
member = "serviceAccount:${google_service_account.clouddeploy_execution_sa.email}"
}
# Cloud Deploy Service Agent
resource "google_project_service_identity" "clouddeploy_service_agent" {
provider = google-beta
project = var.project_id
service = "clouddeploy.googleapis.com"
}
resource "google_project_iam_member" "clouddeploy_service_agent_role" {
project = var.project_id
role = "roles/clouddeploy.serviceAgent"
member = "serviceAccount:${google_project_service_identity.clouddeploy_service_agent.email}"
}
# IAM membership for Cloud Build SA to act as Cloud Deploy Execution SA
resource "google_service_account_iam_member" "cloudbuild_clouddeploy_impersonation" {
service_account_id = google_service_account.clouddeploy_execution_sa.name
role = "roles/iam.serviceAccountUser"
member = "serviceAccount:${var.cloudbuild_service_account}"
}
# IAM membership for Cloud Deploy Execution SA deploy to GKE
resource "google_project_iam_member" "clouddeploy_gke_dev" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/container.developer"
member = "serviceAccount:${google_service_account.clouddeploy_execution_sa.email}"
}
# IAM membership for Cloud Build SA to deploy to GKE
resource "google_project_iam_member" "cloudbuild_gke_dev" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/container.developer"
member = "serviceAccount:${var.cloudbuild_service_account}"
}
# IAM grants for deploying to GKE via Connect Gateway
# https://cloud.google.com/anthos/multicluster-management/gateway/setup#grant_roles_for_access_through_kubectl
# Cloud Deploy Execution SA deploy to cluster
resource "google_project_iam_member" "clouddeploy_gkehub_viewer" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/gkehub.viewer"
member = "serviceAccount:${google_service_account.clouddeploy_execution_sa.email}"
}
resource "google_project_iam_member" "clouddeploy_gkehub_gatewayadmin" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/gkehub.gatewayAdmin"
member = "serviceAccount:${google_service_account.clouddeploy_execution_sa.email}"
}
# Cloud Build SA to deploy to cluster
resource "google_project_iam_member" "cloudbuild_gkehub_viewer" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/gkehub.viewer"
member = "serviceAccount:${var.cloudbuild_service_account}"
}
resource "google_project_iam_member" "cloudbuild_gkehub_gatewayadmin" {
for_each = var.deploy_branch_clusters
project = each.value.project_id
role = "roles/gkehub.gatewayAdmin"
member = "serviceAccount:${var.cloudbuild_service_account}"
}
# IAM membership for Binary Authorization service agents in GKE projects on attestors
resource "google_project_service_identity" "binauth_service_agent" {
provider = google-beta
for_each = var.deploy_branch_clusters
project = each.value.project_id
service = "binaryauthorization.googleapis.com"
}
resource "google_binary_authorization_attestor_iam_member" "binauthz_verifier" {
for_each = { for entry in local.attestor_iam_config : "${entry.env}.${entry.attestor}" => entry } # turn into a map
project = var.project_id
attestor = each.value.attestor
role = "roles/binaryauthorization.attestorsVerifier"
member = "serviceAccount:${google_project_service_identity.binauth_service_agent[each.value.env].email}"
}