Skip to content

Commit 66f2093

Browse files
EZIOJQJieqing(Jay) Chen
authored andcommitted
Support X509 Federation (GoogleCloudPlatform#11493)
Co-authored-by: Jieqing(Jay) Chen <[email protected]>
1 parent bded9ab commit 66f2093

7 files changed

+206
-0
lines changed

mmv1/products/iambeta/WorkloadIdentityPoolProvider.yaml

+63
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,18 @@ examples:
7171
vars:
7272
workload_identity_pool_id: 'example-pool'
7373
workload_identity_pool_provider_id: 'example-prvdr'
74+
- !ruby/object:Provider::Terraform::Examples
75+
name: 'iam_workload_identity_pool_provider_x509_basic'
76+
primary_resource_id: 'example'
77+
vars:
78+
workload_identity_pool_id: 'example-pool'
79+
workload_identity_pool_provider_id: 'example-prvdr'
80+
- !ruby/object:Provider::Terraform::Examples
81+
name: 'iam_workload_identity_pool_provider_x509_full'
82+
primary_resource_id: 'example'
83+
vars:
84+
workload_identity_pool_id: 'example-pool'
85+
workload_identity_pool_provider_id: 'example-prvdr'
7486
custom_code: !ruby/object:Provider::Terraform::CustomCode
7587
constants: templates/terraform/constants/iam_workload_identity_pool_provider.go.erb
7688
decoder: templates/terraform/decoders/treat_deleted_state_as_gone.go.erb
@@ -222,6 +234,7 @@ properties:
222234
- aws
223235
- oidc
224236
- saml
237+
- x509
225238
properties:
226239
- !ruby/object:Api::Type::String
227240
name: accountId
@@ -236,6 +249,7 @@ properties:
236249
- aws
237250
- oidc
238251
- saml
252+
- x509
239253
update_mask_fields:
240254
- 'oidc.allowed_audiences'
241255
- 'oidc.issuer_uri'
@@ -297,8 +311,57 @@ properties:
297311
- aws
298312
- oidc
299313
- saml
314+
- x509
300315
properties:
301316
- !ruby/object:Api::Type::String
302317
name: idpMetadataXml
303318
description: SAML Identity provider configuration metadata xml doc.
304319
required: true
320+
- !ruby/object:Api::Type::NestedObject
321+
name: x509
322+
description: |
323+
An X.509-type identity provider represents a CA. It is trusted to assert a
324+
client identity if the client has a certificate that chains up to this CA.
325+
exactly_one_of:
326+
- aws
327+
- oidc
328+
- saml
329+
- x509
330+
properties:
331+
- !ruby/object:Api::Type::NestedObject
332+
name: trustStore
333+
description: |
334+
A Trust store, use this trust store as a wrapper to config the trust
335+
anchor and optional intermediate cas to help build the trust chain for
336+
the incoming end entity certificate. Follow the x509 guidelines to
337+
define those PEM encoded certs. Only 1 trust store is currently
338+
supported.
339+
required: true
340+
properties:
341+
- !ruby/object:Api::Type::Array
342+
name: trustAnchors
343+
description: |
344+
List of Trust Anchors to be used while performing validation
345+
against a given TrustStore. The incoming end entity's certificate
346+
must be chained up to one of the trust anchors here.
347+
required: true
348+
item_type: !ruby/object:Api::Type::NestedObject
349+
properties:
350+
- !ruby/object:Api::Type::String
351+
name: pemCertificate
352+
description: |
353+
PEM certificate of the PKI used for validation. Must only contain one
354+
ca certificate(either root or intermediate cert).
355+
- !ruby/object:Api::Type::Array
356+
name: intermediateCas
357+
description: |
358+
Set of intermediate CA certificates used for building the trust chain to
359+
trust anchor.
360+
IMPORTANT: Intermediate CAs are only supported when configuring x509 federation.
361+
item_type: !ruby/object:Api::Type::NestedObject
362+
properties:
363+
- !ruby/object:Api::Type::String
364+
name: pemCertificate
365+
description: |
366+
PEM certificate of the PKI used for validation. Must only contain one
367+
ca certificate(either root or intermediate cert).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
resource "google_iam_workload_identity_pool" "pool" {
2+
workload_identity_pool_id = "<%= ctx[:vars]["workload_identity_pool_id"] %>"
3+
}
4+
5+
resource "google_iam_workload_identity_pool_provider" "<%= ctx[:primary_resource_id] %>" {
6+
workload_identity_pool_id = google_iam_workload_identity_pool.pool.workload_identity_pool_id
7+
workload_identity_pool_provider_id = "<%= ctx[:vars]["workload_identity_pool_provider_id"] %>"
8+
attribute_mapping = {
9+
"google.subject" = "assertion.subject.dn.cn"
10+
}
11+
x509 {
12+
trust_store {
13+
trust_anchors {
14+
pem_certificate = file("test-fixtures/trust_anchor.pem")
15+
}
16+
}
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
resource "google_iam_workload_identity_pool" "pool" {
2+
workload_identity_pool_id = "<%= ctx[:vars]["workload_identity_pool_id"] %>"
3+
}
4+
5+
resource "google_iam_workload_identity_pool_provider" "<%= ctx[:primary_resource_id] %>" {
6+
workload_identity_pool_id = google_iam_workload_identity_pool.pool.workload_identity_pool_id
7+
workload_identity_pool_provider_id = "<%= ctx[:vars]["workload_identity_pool_provider_id"] %>"
8+
display_name = "Name of provider"
9+
description = "X.509 identity pool provider for automated test"
10+
disabled = true
11+
attribute_mapping = {
12+
"google.subject" = "assertion.subject.dn.cn"
13+
}
14+
x509 {
15+
trust_store {
16+
trust_anchors {
17+
pem_certificate = file("test-fixtures/trust_anchor.pem")
18+
}
19+
intermediate_cas {
20+
pem_certificate = file("test-fixtures/intermediate_ca.pem")
21+
}
22+
}
23+
}
24+
}

mmv1/third_party/terraform/services/iambeta/resource_iam_workload_identity_pool_provider_test.go.erb

+92
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,96 @@ resource "google_iam_workload_identity_pool_provider" "my_provider" {
240240
`, context)
241241
}
242242

243+
func TestAccIAMBetaWorkloadIdentityPoolProvider_x509(t *testing.T) {
244+
t.Parallel()
245+
246+
context := map[string]interface{}{
247+
"random_suffix": acctest.RandString(t, 10),
248+
}
249+
250+
acctest.VcrTest(t, resource.TestCase{
251+
PreCheck: func() { acctest.AccTestPreCheck(t) },
252+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
253+
CheckDestroy: testAccCheckIAMBetaWorkloadIdentityPoolProviderDestroyProducer(t),
254+
Steps: []resource.TestStep{
255+
{
256+
Config: testAccIAMBetaWorkloadIdentityPoolProvider_x509_full(context),
257+
},
258+
{
259+
ResourceName: "google_iam_workload_identity_pool_provider.example",
260+
ImportState: true,
261+
ImportStateVerify: true,
262+
ImportStateVerifyIgnore: []string{"workload_identity_pool_id", "workload_identity_pool_provider_id"},
263+
},
264+
{
265+
Config: testAccIAMBetaWorkloadIdentityPoolProvider_x509_update(context),
266+
},
267+
{
268+
ResourceName: "google_iam_workload_identity_pool_provider.example",
269+
ImportState: true,
270+
ImportStateVerify: true,
271+
ImportStateVerifyIgnore: []string{"workload_identity_pool_id", "workload_identity_pool_provider_id"},
272+
},
273+
},
274+
})
275+
}
276+
277+
func testAccIAMBetaWorkloadIdentityPoolProvider_x509_full(context map[string]interface{}) string {
278+
return acctest.Nprintf(`
279+
resource "google_iam_workload_identity_pool" "pool" {
280+
workload_identity_pool_id = "tf-test-example-pool%{random_suffix}"
281+
}
282+
283+
resource "google_iam_workload_identity_pool_provider" "example" {
284+
workload_identity_pool_id = google_iam_workload_identity_pool.pool.workload_identity_pool_id
285+
workload_identity_pool_provider_id = "tf-test-example-prvdr%{random_suffix}"
286+
display_name = "Name of provider"
287+
description = "X.509 identity pool provider for automated test"
288+
disabled = true
289+
attribute_mapping = {
290+
"google.subject" = "assertion.subject.dn.cn"
291+
}
292+
x509 {
293+
trust_store {
294+
trust_anchors {
295+
pem_certificate = file("test-fixtures/trust_anchor.pem")
296+
}
297+
intermediate_cas {
298+
pem_certificate = file("test-fixtures/intermediate_ca.pem")
299+
}
300+
}
301+
}
302+
}
303+
`, context)
304+
}
305+
306+
func testAccIAMBetaWorkloadIdentityPoolProvider_x509_update(context map[string]interface{}) string {
307+
return acctest.Nprintf(`
308+
resource "google_iam_workload_identity_pool" "pool" {
309+
workload_identity_pool_id = "tf-test-example-pool%{random_suffix}"
310+
}
311+
312+
resource "google_iam_workload_identity_pool_provider" "example" {
313+
workload_identity_pool_id = google_iam_workload_identity_pool.pool.workload_identity_pool_id
314+
workload_identity_pool_provider_id = "tf-test-example-prvdr%{random_suffix}"
315+
display_name = "Name of provider"
316+
description = "X.509 identity pool provider for automated test"
317+
disabled = true
318+
attribute_mapping = {
319+
"google.subject" = "assertion.subject.dn.cn"
320+
}
321+
x509 {
322+
trust_store {
323+
trust_anchors {
324+
pem_certificate = file("test-fixtures/trust_anchor_updated.pem")
325+
}
326+
trust_anchors {
327+
pem_certificate = file("test-fixtures/intermediate_ca.pem")
328+
}
329+
}
330+
}
331+
}
332+
`, context)
333+
}
334+
243335
<% end -%>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDvjCCAqagAwIBAgIIXHIdYNfGCLMwDQYJKoZIhvcNAQELBQAwXDEXMBUGA1UEChMOR29vZ2xlIFRFU1RJTkcxHDAaBgNVBAsTE0dvb2dsZSBURVNUSU5HIHVuaXQxIzAhBgNVBAMMGkdvb2dsZSAqKlRlc3RpbmcqKiBSb290IENBMCAXDTIwMDEwMTAwMDAwMFoYDzIxMzAwMTAxMDAwMDAwWjBkMRcwFQYDVQQKEw5Hb29nbGUgVEVTVElORzEcMBoGA1UECxMTR29vZ2xlIFRFU1RJTkcgdW5pdDErMCkGA1UEAwwiR29vZ2xlICoqVGVzdGluZyoqIEludGVybWVkaWF0ZSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALVSyoOVAMfOYf10VxNwmRs/afgbkYJ5gPXzn3aetEtFrcqDiG8LdgniLhHcp3c/O1U0EKANMLWyMlHP0KC4wjMrYXS8doQ7B6kGXj070hRSHN7acF0ImSRw3i9idiiSgOIJzlbYXeh8NLqDAYESyWFht7RRdbCJx1v2U9T8F5QVeT96Dw3exSKQAIdL2J8ol9kgJNINimd7GxOQ3f1+vDOBiAtAj4zWCjjqdNqh5ivyrTu28J/umM35wtHS6iX6GvnwqTsRy8zS/KeN+Dq6PEk/j04mrOG3w82SFp+IvTNH6S/DxRyiE5yoAfgfunKotV34JVr/INH2RsEgbWtwK5ECAwEAAaN6MHgwDgYDVR0PAQH/BAQDAgIEMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAPBgNVHRMBAf8EBTADAQH/MBkGA1UdDgQSBBB0QukRw23faHpDoa0xl+L+MBsGA1UdIwQUMBKAEMRB36Doz2ZXloHKRyZ8hN0wDQYJKoZIhvcNAQELBQADggEBAIPBiuirnZbv4JWDiAIXvCE5pbwej0aKFWEDV2Z8lY0RFPt1CXrDJJL91MXHZ1yviUSJINJErJn7wyGV2bm/N7DUpRE0g9IMgEank64UUl+OyQTXd0LIsjlqWA6Sj/hDZUdw6mi9a98ENUr6CiECtOxpGF9kj4G4WcnyvPP/phs1b8cAfQ+tPurrDRBAdeoQIj756QL7fvMijKNdG5KeCURu9L4BZmCeuy/3v2C2XjiFZHx4cZDOHJizrx04GqzV5PSXw5OYZiXfn5WPGMsyh7ufkQJKJcpv2t3M0gyc1omD0xWkxCl4dTdVef9HrboJnZkUrma509fpVL6F8I2Jkt8=
3+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDtjCCAp6gAwIBAgIIMu9pvsFWIUcwDQYJKoZIhvcNAQELBQAwXDEXMBUGA1UEChMOR29vZ2xlIFRFU1RJTkcxHDAaBgNVBAsTE0dvb2dsZSBURVNUSU5HIHVuaXQxIzAhBgNVBAMMGkdvb2dsZSAqKlRlc3RpbmcqKiBSb290IENBMCAXDTIwMDEwMTAwMDAwMFoYDzIxMzAwMTAxMDAwMDAwWjBcMRcwFQYDVQQKEw5Hb29nbGUgVEVTVElORzEcMBoGA1UECxMTR29vZ2xlIFRFU1RJTkcgdW5pdDEjMCEGA1UEAwwaR29vZ2xlICoqVGVzdGluZyoqIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDHqdf17AA4iwl+HGtTD/qJJv9XZTjzjHiaRYWuGQ3iddf1LhYklLqHvpqOCBlhkg6NIZmoDPKicEi8pfGSzp6btcElyrr1ekECk5jEBcdl6tX/gTSYv7v1h9DkSJDHBAnoSsVW0/PNwI+YGEE2kizGMeg1moXlTHEB+yeGCik/+4eVRas/+wrlrTE5lMFMq8WhdnBx6udcc/BEauvlTybHaN3rJUVpVrJWeVoPGGtXR6MJrdbVScn9GYOLP6sXMPTr+pTY6ebrjs7K/wTVQqLJ1zArCvAEH8FvuAhiI19yM1uBRAds/fJbSUvFsEiIlDC4y7DAK7yWHUAjQIBV1xhDAgMBAAGjejB4MA4GA1UdDwEB/wQEAwICBDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAZBgNVHQ4EEgQQxEHfoOjPZleWgcpHJnyE3TAbBgNVHSMEFDASgBDEQd+g6M9mV5aBykcmfITdMA0GCSqGSIb3DQEBCwUAA4IBAQBcECwxgaK4ZgYO7guayK5QRpTb3Y6zpkmSOkj9h1+HF5Ch/o5FiweJi8k28h9Mfz//gKU2cXXWfXuY81CFEBstjw7jYt3+d4owS5sYKu5WswGj4jsQXRrt0tO0+0UngP560eggFCyLChG75lp54r92hTPk4fY4varURZH7X0jg9W7MO6E6/HmKdMIxanuWdkbpPe6kj5I7SNvVhqsncoga8iZJ6QK/rsC2LTax4dxUUSkP5vmwwiYbgXYbk9JcXI+OyVcMvVxN/akI9/JgYHOol6NdChTBwU0yjNb9B5TrgtP1/fs+LugINrN1R1hgVHDVlE4mwHej+5XL6m9xAxkc
3+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDtzCCAp+gAwIBAgIJAJbcoF4dvsxvMA0GCSqGSIb3DQEBCwUAMFwxFzAVBgNVBAoTDkdvb2dsZSBURVNUSU5HMRwwGgYDVQQLExNHb29nbGUgVEVTVElORyB1bml0MSMwIQYDVQQDDBpHb29nbGUgKipUZXN0aW5nKiogUm9vdCBDQTAgFw0yMDAxMDEwMDAwMDBaGA8yMTMwMDEwMTAwMDAwMFowXDEXMBUGA1UEChMOR29vZ2xlIFRFU1RJTkcxHDAaBgNVBAsTE0dvb2dsZSBURVNUSU5HIHVuaXQxIzAhBgNVBAMMGkdvb2dsZSAqKlRlc3RpbmcqKiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzVxH5w07E7O649oZHElZEyMGpYW1rS/yU58AYp9UgDjgNZchDCByn96uUdKiwzQRyFg+Nu/DifcpKbB8rzQtJoDqqpdPqmd2uxw13UNGeScsFGFoqIdOeU/l+SCAB1GvNHpMNoeFFzH9Ly1fFWRHXa/Upw1WYtKxMKM8pVLqodowTKuVMQHVMpVILhb1nlpZvsFR5i2LhG1U4jxVOVGC7OHTsUHNlFo547kM5MNnArl6vPx2LOZgA+2JeOM0zbiMk4DK+ks5eaXXapy5QMQ16PUIlq1oTgAYMRXk31TrmdMwu79FeIz3vHXgJnGhdmLqse3rE05cWuoEsuao01NpYwIDAQABo3oweDAOBgNVHQ8BAf8EBAMCAgQwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEwEB/wQFMAMBAf8wGQYDVR0OBBIEEMRB36Doz2ZXloHKRyZ8hN0wGwYDVR0jBBQwEoAQxEHfoOjPZleWgcpHJnyE3TANBgkqhkiG9w0BAQsFAAOCAQEAiim4OoNHHskwK1etk1Xswb+pB1OweUFD9iSHvkgnTw+RLuep+OYsKciz5GeZIWiKkWZMnJYTd41bX29fdIdcd1b3MjFVQ8jqKVkblb1NjYWLIwZshimtbIEZTDb/sxalQiwSH/SE2fi/8E8P8jxbntCeOyDw1/lce3tkYrJHlTNDZLNnr5Od+stpYi8EaPSnilEgLIMTsBwyaxUp8yWbxT8+M0JhJYmpHnSkC0vc2aLTYmgyv7URl14XIK2aumSISAuaCXYGj0hx8Wz0YNn1uydnZw7kmzn4ncZqfwoJuHJl/5kWq0nycgcieUNg65VxEhqHTnC6NXKjyBZKVXQaxQ==
3+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)