Skip to content

Commit 02a5b7f

Browse files
authored
feat: Add support for OIDC policy conditions (#480)
1 parent fc799c1 commit 02a5b7f

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

examples/iam-assumable-role-with-oidc/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ No providers.
3232
|------|--------|---------|
3333
| <a name="module_iam_assumable_role_admin"></a> [iam\_assumable\_role\_admin](#module\_iam\_assumable\_role\_admin) | ../../modules/iam-assumable-role-with-oidc | n/a |
3434
| <a name="module_iam_assumable_role_inline_policy"></a> [iam\_assumable\_role\_inline\_policy](#module\_iam\_assumable\_role\_inline\_policy) | ../../modules/iam-assumable-role-with-oidc | n/a |
35+
| <a name="module_iam_assumable_role_provider_trust_policy_conditions"></a> [iam\_assumable\_role\_provider\_trust\_policy\_conditions](#module\_iam\_assumable\_role\_provider\_trust\_policy\_conditions) | ../../modules/iam-assumable-role-with-oidc | n/a |
3536
| <a name="module_iam_assumable_role_self_assume"></a> [iam\_assumable\_role\_self\_assume](#module\_iam\_assumable\_role\_self\_assume) | ../../modules/iam-assumable-role-with-oidc | n/a |
3637

3738
## Resources

examples/iam-assumable-role-with-oidc/main.tf

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,34 @@ module "iam_assumable_role_inline_policy" {
8989
}
9090
]
9191
}
92+
93+
#####################################
94+
# IAM assumable role with policy conditions
95+
#####################################
96+
module "iam_assumable_role_provider_trust_policy_conditions" {
97+
source = "../../modules/iam-assumable-role-with-oidc"
98+
99+
create_role = true
100+
101+
role_name = "role-with-oidc-policy-conditions"
102+
103+
tags = {
104+
Role = "role-with-oidc-policy-conditions"
105+
}
106+
107+
provider_url = "oidc.circleci.com/org/<CIRCLECI_ORG_UUID>"
108+
109+
oidc_fully_qualified_audiences = ["<CIRCLECI_ORG_UUID>"]
110+
111+
role_policy_arns = [
112+
"arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy",
113+
]
114+
115+
provider_trust_policy_conditions = [
116+
{
117+
test = "StringLike"
118+
variable = "aws:RequestTag/Environment"
119+
values = ["example"]
120+
}
121+
]
122+
}

modules/iam-assumable-role-with-oidc/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ No modules.
5050
| <a name="input_oidc_fully_qualified_audiences"></a> [oidc\_fully\_qualified\_audiences](#input\_oidc\_fully\_qualified\_audiences) | The audience to be added to the role policy. Set to sts.amazonaws.com for cross-account assumable role. Leave empty otherwise. | `set(string)` | `[]` | no |
5151
| <a name="input_oidc_fully_qualified_subjects"></a> [oidc\_fully\_qualified\_subjects](#input\_oidc\_fully\_qualified\_subjects) | The fully qualified OIDC subjects to be added to the role policy | `set(string)` | `[]` | no |
5252
| <a name="input_oidc_subjects_with_wildcards"></a> [oidc\_subjects\_with\_wildcards](#input\_oidc\_subjects\_with\_wildcards) | The OIDC subject using wildcards to be added to the role policy | `set(string)` | `[]` | no |
53+
| <a name="input_provider_trust_policy_conditions"></a> [provider\_trust\_policy\_conditions](#input\_provider\_trust\_policy\_conditions) | [Condition constraints](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document#condition) applied to the trust policy | `any` | `[]` | no |
5354
| <a name="input_provider_url"></a> [provider\_url](#input\_provider\_url) | URL of the OIDC Provider. Use provider\_urls to specify several URLs. | `string` | `""` | no |
5455
| <a name="input_provider_urls"></a> [provider\_urls](#input\_provider\_urls) | List of URLs of the OIDC Providers | `list(string)` | `[]` | no |
5556
| <a name="input_role_description"></a> [role\_description](#input\_role\_description) | IAM Role description | `string` | `""` | no |

modules/iam-assumable-role-with-oidc/main.tf

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ data "aws_iam_policy_document" "assume_role_with_oidc" {
4343

4444
content {
4545
effect = "Allow"
46-
actions = ["sts:AssumeRoleWithWebIdentity"]
46+
actions = ["sts:AssumeRoleWithWebIdentity", "sts:TagSession"]
4747

4848
principals {
4949
type = "Federated"
@@ -80,6 +80,16 @@ data "aws_iam_policy_document" "assume_role_with_oidc" {
8080
values = var.oidc_fully_qualified_audiences
8181
}
8282
}
83+
84+
dynamic "condition" {
85+
for_each = var.provider_trust_policy_conditions
86+
87+
content {
88+
test = condition.value.test
89+
values = condition.value.values
90+
variable = condition.value.variable
91+
}
92+
}
8393
}
8494
}
8595
}

modules/iam-assumable-role-with-oidc/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,9 @@ variable "allow_self_assume_role" {
111111
type = bool
112112
default = false
113113
}
114+
115+
variable "provider_trust_policy_conditions" {
116+
description = "[Condition constraints](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document#condition) applied to the trust policy"
117+
type = any
118+
default = []
119+
}

wrappers/iam-assumable-role-with-oidc/main.tf

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ module "wrapper" {
33

44
for_each = var.items
55

6-
allow_self_assume_role = try(each.value.allow_self_assume_role, var.defaults.allow_self_assume_role, false)
7-
aws_account_id = try(each.value.aws_account_id, var.defaults.aws_account_id, "")
8-
create_role = try(each.value.create_role, var.defaults.create_role, false)
9-
force_detach_policies = try(each.value.force_detach_policies, var.defaults.force_detach_policies, false)
10-
inline_policy_statements = try(each.value.inline_policy_statements, var.defaults.inline_policy_statements, [])
11-
max_session_duration = try(each.value.max_session_duration, var.defaults.max_session_duration, 3600)
12-
number_of_role_policy_arns = try(each.value.number_of_role_policy_arns, var.defaults.number_of_role_policy_arns, null)
13-
oidc_fully_qualified_audiences = try(each.value.oidc_fully_qualified_audiences, var.defaults.oidc_fully_qualified_audiences, [])
14-
oidc_fully_qualified_subjects = try(each.value.oidc_fully_qualified_subjects, var.defaults.oidc_fully_qualified_subjects, [])
15-
oidc_subjects_with_wildcards = try(each.value.oidc_subjects_with_wildcards, var.defaults.oidc_subjects_with_wildcards, [])
16-
provider_url = try(each.value.provider_url, var.defaults.provider_url, "")
17-
provider_urls = try(each.value.provider_urls, var.defaults.provider_urls, [])
18-
role_description = try(each.value.role_description, var.defaults.role_description, "")
19-
role_name = try(each.value.role_name, var.defaults.role_name, null)
20-
role_name_prefix = try(each.value.role_name_prefix, var.defaults.role_name_prefix, null)
21-
role_path = try(each.value.role_path, var.defaults.role_path, "/")
22-
role_permissions_boundary_arn = try(each.value.role_permissions_boundary_arn, var.defaults.role_permissions_boundary_arn, "")
23-
role_policy_arns = try(each.value.role_policy_arns, var.defaults.role_policy_arns, [])
24-
tags = try(each.value.tags, var.defaults.tags, {})
6+
allow_self_assume_role = try(each.value.allow_self_assume_role, var.defaults.allow_self_assume_role, false)
7+
aws_account_id = try(each.value.aws_account_id, var.defaults.aws_account_id, "")
8+
create_role = try(each.value.create_role, var.defaults.create_role, false)
9+
force_detach_policies = try(each.value.force_detach_policies, var.defaults.force_detach_policies, false)
10+
inline_policy_statements = try(each.value.inline_policy_statements, var.defaults.inline_policy_statements, [])
11+
max_session_duration = try(each.value.max_session_duration, var.defaults.max_session_duration, 3600)
12+
number_of_role_policy_arns = try(each.value.number_of_role_policy_arns, var.defaults.number_of_role_policy_arns, null)
13+
oidc_fully_qualified_audiences = try(each.value.oidc_fully_qualified_audiences, var.defaults.oidc_fully_qualified_audiences, [])
14+
oidc_fully_qualified_subjects = try(each.value.oidc_fully_qualified_subjects, var.defaults.oidc_fully_qualified_subjects, [])
15+
oidc_subjects_with_wildcards = try(each.value.oidc_subjects_with_wildcards, var.defaults.oidc_subjects_with_wildcards, [])
16+
provider_trust_policy_conditions = try(each.value.provider_trust_policy_conditions, var.defaults.provider_trust_policy_conditions, [])
17+
provider_url = try(each.value.provider_url, var.defaults.provider_url, "")
18+
provider_urls = try(each.value.provider_urls, var.defaults.provider_urls, [])
19+
role_description = try(each.value.role_description, var.defaults.role_description, "")
20+
role_name = try(each.value.role_name, var.defaults.role_name, null)
21+
role_name_prefix = try(each.value.role_name_prefix, var.defaults.role_name_prefix, null)
22+
role_path = try(each.value.role_path, var.defaults.role_path, "/")
23+
role_permissions_boundary_arn = try(each.value.role_permissions_boundary_arn, var.defaults.role_permissions_boundary_arn, "")
24+
role_policy_arns = try(each.value.role_policy_arns, var.defaults.role_policy_arns, [])
25+
tags = try(each.value.tags, var.defaults.tags, {})
2526
}

0 commit comments

Comments
 (0)