11# ------------------------------------------------------------------#
2- # Fetch and compute required data for Service Account Key #
2+ # Fetch and compute required data for Workload Identity Federation #
33# ------------------------------------------------------------------#
44
5+ data "sysdig_secure_trusted_cloud_identity" "trusted_identity" {
6+ cloud_provider = " gcp"
7+ }
8+
9+ data "sysdig_secure_tenant_external_id" "external_id" {}
10+
511data "google_project" "project" {
612 project_id = var. project_id
713}
@@ -14,6 +20,7 @@ resource "random_id" "suffix" {
1420
1521locals {
1622 suffix = var. suffix == null ? random_id. suffix [0 ]. hex : var. suffix
23+ # account_id = time_sleep.wait_for_apply_google_permissions[0].
1724}
1825
1926resource "google_service_account" "onboarding_auth" {
@@ -23,9 +30,39 @@ resource "google_service_account" "onboarding_auth" {
2330 project = var. project_id
2431}
2532
26- # ---------------------------------
27- # role permissions for onboarding
28- # ---------------------------------
33+ # ------------------------------------------------------------#
34+ # Configure Workload Identity Federation for auth #
35+ # See https://cloud.google.com/iam/docs/access-resources-aws #
36+ # ------------------------------------------------------------#
37+
38+ resource "google_iam_workload_identity_pool" "onboarding_auth_pool" {
39+ project = var. project_id
40+ workload_identity_pool_id = " sysdig-secure-onboarding-${ local . suffix } "
41+ }
42+
43+ resource "google_iam_workload_identity_pool_provider" "onboarding_auth_pool_provider" {
44+ project = var. project_id
45+ workload_identity_pool_id = google_iam_workload_identity_pool. onboarding_auth_pool . workload_identity_pool_id
46+ workload_identity_pool_provider_id = " sysdig-onboarding-${ local . suffix } "
47+ display_name = " Sysdigcloud onboarding auth"
48+ description = " AWS based pool provider for Sysdig Secure Data Onboarding resources"
49+ disabled = false
50+
51+ attribute_condition = " attribute.aws_role==\" arn:aws:sts::${ data . sysdig_secure_trusted_cloud_identity . trusted_identity . aws_account_id } :assumed-role/${ data . sysdig_secure_trusted_cloud_identity . trusted_identity . aws_role_name } /${ data . sysdig_secure_tenant_external_id . external_id . external_id } \" "
52+
53+ attribute_mapping = {
54+ " google.subject" = " assertion.arn" ,
55+ " attribute.aws_role" = " assertion.arn"
56+ }
57+
58+ aws {
59+ account_id = data. sysdig_secure_trusted_cloud_identity . trusted_identity . aws_account_id
60+ }
61+ }
62+
63+ # ---------------------------------------------------------------------------------------------
64+ # role permissions for Onboarding (GCP Predefined Roles for Sysdig Cloud Onboarding)
65+ # ---------------------------------------------------------------------------------------------
2966resource "google_project_iam_member" "browser" {
3067 count = var. is_organizational ? 0 : 1
3168
@@ -34,12 +71,18 @@ resource "google_project_iam_member" "browser" {
3471 member = " serviceAccount:${ google_service_account . onboarding_auth . email } "
3572}
3673
37- # --------------------------------
38- # service account private key
39-
40- # --------------------------------
41- resource "google_service_account_key" "onboarding_service_account_key" {
74+ # attaching WIF as a member to the service account for auth
75+ resource "google_service_account_iam_member" "custom_onboarding_auth" {
4276 service_account_id = google_service_account. onboarding_auth . name
77+ role = " roles/iam.workloadIdentityUser"
78+ member = " principalSet://iam.googleapis.com/projects/${ data . google_project . project . number } /locations/global/workloadIdentityPools/${ google_iam_workload_identity_pool . onboarding_auth_pool . workload_identity_pool_id } /attribute.aws_role/arn:aws:sts::${ data . sysdig_secure_trusted_cloud_identity . trusted_identity . aws_account_id } :assumed-role/${ data . sysdig_secure_trusted_cloud_identity . trusted_identity . aws_role_name } /${ data . sysdig_secure_tenant_external_id . external_id . external_id } "
79+ }
80+
81+ # add some timing for SA and permissions to be completely ready before calling Sysdig Backend, ensure that onboarding will pass first time
82+ resource "time_sleep" "wait_for_apply_google_permissions" {
83+ depends_on = [google_organization_iam_member . browser , google_project_iam_member . browser ]
84+
85+ create_duration = " 30s"
4386}
4487
4588# ---------------------------------------------------------------------------------------------
@@ -60,15 +103,23 @@ resource "sysdig_secure_cloud_auth_account" "google_account" {
60103 version = " v0.1.0"
61104 service_principal_metadata = jsonencode ({
62105 gcp = {
63- key = google_service_account_key.onboarding_service_account_key.private_key
106+ workload_identity_federation = {
107+ pool_id = google_iam_workload_identity_pool.onboarding_auth_pool.workload_identity_pool_id
108+ pool_provider_id = google_iam_workload_identity_pool_provider.onboarding_auth_pool_provider.workload_identity_pool_provider_id
109+ project_number = data.google_project.project.number
110+ }
111+ email = google_service_account.onboarding_auth.email
64112 }
65113 })
66114 }
67115
68116 depends_on = [
69117 google_service_account . onboarding_auth ,
118+ google_iam_workload_identity_pool . onboarding_auth_pool ,
119+ google_iam_workload_identity_pool_provider . onboarding_auth_pool_provider ,
70120 google_project_iam_member . browser ,
71- google_service_account_key . onboarding_service_account_key
121+ google_service_account_iam_member . custom_onboarding_auth ,
122+ time_sleep . wait_for_apply_google_permissions
72123 ]
73124
74125 lifecycle {
0 commit comments