Skip to content

feature/common policies #2

Merged
merged 8 commits into from
Jan 16, 2026
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,12 @@
* 1.3.2 -- 2025-02-14
- group-assignment
- make ldap_group happen after idc group

* 1.4.0 -- 2026-01-16
- change AWS provider to >= 6
- change region from name to region in locals
- require TF 1.12+
- policies
- create new central policies to be used for permissionsets so they can be consistent across orgs
- created policies
- policies/sc-servicecatalog-t1
2 changes: 1 addition & 1 deletion common/version.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
locals {
_module_version = "1.3.2"
_module_version = "1.4.0"
}
4 changes: 2 additions & 2 deletions common/versions.tf
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
terraform {
required_version = ">= 1.12"
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.66.0"
version = ">= 6.0"
}
}
# required_version = ">= 0.13"
}
8 changes: 4 additions & 4 deletions group-assignment/accounts.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ locals {
active_accounts_map = { for account in data.aws_organizations_organizational_unit_descendant_accounts.accounts.accounts : account.name => account if account.status == "ACTIVE" }
active_accounts = { for k, v in local.active_accounts_map : k => v.id }

_id_1 = ! local.org_all && length(local.org_account_names) > 0 ? [for k in local.org_account_names : lookup(local.active_accounts, k, null)] : []
_id_2 = ! local.org_all && length(local.org_account_ids) > 0 ? [for k in local.org_account_ids : k if contains(values(local.active_accounts), k)] : []
_id_1 = !local.org_all && length(local.org_account_names) > 0 ? [for k in local.org_account_names : lookup(local.active_accounts, k, null)] : []
_id_2 = !local.org_all && length(local.org_account_ids) > 0 ? [for k in local.org_account_ids : k if contains(values(local.active_accounts), k)] : []

organizational_unit_hierarchy = length(var.organizational_unit_hierarchy) > 0 ? { for k, v in var.organizational_unit_hierarchy : k => v.self_id } : {}

# _ou_1 = ! local.org_all && length(local.organizational_unit_names) > 0 && length(var.organizational_unit_hierarchy) > 0 ? [for k, v in local.organizational_unit_names : lookup(local.organizational_unit_hierarchy, k, null)] : []
_ou_1 = ! local.org_all && length(local.organizational_unit_names) > 0 && length(var.organizational_unit_hierarchy) > 0 ? { for k, v in local.organizational_unit_hierarchy : k => v if contains(local.organizational_unit_names, k) } : {}
_ou_2 = ! local.org_all && length(var.organizational_unit_ids) > 0 && length(var.organizational_unit_hierarchy) > 0 ? { for k in var.organizational_unit_ids : k => k } : {}
_ou_1 = !local.org_all && length(local.organizational_unit_names) > 0 && length(var.organizational_unit_hierarchy) > 0 ? { for k, v in local.organizational_unit_hierarchy : k => v if contains(local.organizational_unit_names, k) } : {}
_ou_2 = !local.org_all && length(var.organizational_unit_ids) > 0 && length(var.organizational_unit_hierarchy) > 0 ? { for k in var.organizational_unit_ids : k => k } : {}

# organizational_units = distinct(compact(concat(local._ou_1, local._ou_2)))
organizational_units = merge(local._ou_1, local._ou_2)
Expand Down
2 changes: 1 addition & 1 deletion group-assignment/locals.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
locals {
account_id = var.account_id != "" ? var.account_id : data.aws_caller_identity.current.account_id
account_environment = data.aws_arn.current.partition == "aws-us-gov" ? "gov" : "ew"
region = data.aws_region.current.name
region = data.aws_region.current.region
region_short = join("", [for c in split("-", local.region) : substr(c, 0, 1)])

base_tags = {
Expand Down
2 changes: 1 addition & 1 deletion group-assignment/outputs.tf
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ output "users" {
value = {
users = local.users
valid_ldap_users = { for k, v in local.ldap_user_attributes : k => v.mail if can(v.mail) }
invalid_ldap_users = [for k, v in local.ldap_user_attributes : k if ! can(v.mail)]
invalid_ldap_users = [for k, v in local.ldap_user_attributes : k if !can(v.mail)]
}
}
2 changes: 1 addition & 1 deletion group-assignment/users.tf
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ data "aws_identitystore_user" "users" {

locals {
ldap_groups_base_dn = "o=U.S. Census Bureau,c=US"
ldap_groups_members = distinct(flatten([for k, v in data.ldap_object.ldap_groups : [for m in jsondecode(lookup(v.attributes_json, "memberUid", "")) : m if ! startswith(m, "p-") && (m != "[DynamicDN]")]]))
ldap_groups_members = distinct(flatten([for k, v in data.ldap_object.ldap_groups : [for m in jsondecode(lookup(v.attributes_json, "memberUid", "")) : m if !startswith(m, "p-") && (m != "[DynamicDN]")]]))
}

data "ldap_object" "ldap_groups" {
Expand Down
5 changes: 3 additions & 2 deletions permissionset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

| Name | Version |
|------|---------|
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.66.0 |
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.12 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 6.0 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.66.0 |
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 6.0 |

## Modules

Expand Down
2 changes: 1 addition & 1 deletion permissionset/locals.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
locals {
account_id = var.account_id != "" ? var.account_id : data.aws_caller_identity.current.account_id
account_environment = data.aws_arn.current.partition == "aws-us-gov" ? "gov" : "ew"
region = data.aws_region.current.name
region = data.aws_region.current.region
region_short = join("", [for c in split("-", local.region) : substr(c, 0, 1)])

base_tags = {
Expand Down
44 changes: 44 additions & 0 deletions policies/sc-servicecatalog-t1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
## Requirements

| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.12 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 6.0 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 6.0 |

## Modules

No modules.

## Resources

| Name | Type |
|------|------|
| [aws_arn.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/arn) | data source |
| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |
| [aws_iam_policy_document.inline](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |
| [aws_region.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/region) | data source |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| <a name="input_account_alias"></a> [account\_alias](#input\_account\_alias) | AWS Account Alias | `string` | `""` | no |
| <a name="input_account_id"></a> [account\_id](#input\_account\_id) | AWS Account ID (default will pull from current user) | `string` | `""` | no |
| <a name="input_override_prefixes"></a> [override\_prefixes](#input\_override\_prefixes) | Override built-in prefixes by component. This should be used primarily for common infrastructure things | `map(string)` | `{}` | no |
| <a name="input_tags"></a> [tags](#input\_tags) | AWS Tags to apply to appropriate resources | `map(string)` | `{}` | no |

## Outputs

| Name | Description |
|------|-------------|
| <a name="output_customer_managed_policy_names"></a> [customer\_managed\_policy\_names](#output\_customer\_managed\_policy\_names) | Map of policy name to permission boundary of Customer Managed Policy to attach to the permissionset |
| <a name="output_inline_policy"></a> [inline\_policy](#output\_inline\_policy) | AWS Policy document for the single allowed inline policy (use .json to get policy) |
| <a name="output_managed_policy_names"></a> [managed\_policy\_names](#output\_managed\_policy\_names) | Names of AWS Managed Policy to attach to the permissionset |
| <a name="output_name"></a> [name](#output\_name) | Permission Set Name for which all settings apply |
| <a name="output_relay_state"></a> [relay\_state](#output\_relay\_state) | Relay State to pass along to permissionset |
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/data.tf
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/defaults.tf
12 changes: 12 additions & 0 deletions policies/sc-servicecatalog-t1/locals.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
locals {
account_id = var.account_id != "" ? var.account_id : data.aws_caller_identity.current.account_id
account_environment = data.aws_arn.current.partition == "aws-us-gov" ? "gov" : "ew"
region = data.aws_region.current.region
region_short = join("", [for c in split("-", local.region) : substr(c, 0, 1)])

base_tags = {
"boc:tf_module_version" = local._module_version
"boc:tf_module_name" = local._module_name
"boc:created_by" = "terraform"
}
}
2 changes: 2 additions & 0 deletions policies/sc-servicecatalog-t1/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/*
*/
3 changes: 3 additions & 0 deletions policies/sc-servicecatalog-t1/module_name.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
locals {
_module_name = "aws-sso/policies/sc-servicecatalog-t1"
}
24 changes: 24 additions & 0 deletions policies/sc-servicecatalog-t1/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
output "name" {
description = "Permission Set Name for which all settings apply"
value = local.name
}

output "managed_policy_names" {
description = "Names of AWS Managed Policy to attach to the permissionset"
value = local.managed_policy_names
}

output "customer_managed_policy_names" {
description = "Map of policy name to permission boundary of Customer Managed Policy to attach to the permissionset"
value = local.customer_managed_policy_names
}

output "inline_policy" {
description = "AWS Policy document for the single allowed inline policy (use .json to get policy)"
value = local.inline_policy
}

output "relay_state" {
description = "Relay State to pass along to permissionset"
value = local.relay_state
}
13 changes: 13 additions & 0 deletions policies/sc-servicecatalog-t1/policy.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
data "aws_iam_policy_document" "inline" {
statement {
sid = "OnlyReadOperationsOnOrganizations"
effect = "Allow"
actions = [
"organizations:Describe*",
"organizations:List*",
"account:Get*",
"account:List*"
]
resources = ["*"]
}
}
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/prefixes.tf
10 changes: 10 additions & 0 deletions policies/sc-servicecatalog-t1/settings.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
locals {
name = "servicecatalog-t1"
managed_policy_names = [
"ReadOnlyAccess",
"AWSServiceCatalogEndUserFullAccess"
]
customer_managed_policy_names = {}
relay_state = data.aws_arn.current.partition == "aws-us-gov" ? "https://console.amazonaws-us-gov.com/servicecatalog/home" : "https://console.aws.amazon.com/servicecatalog/home"
inline_policy = data.aws_iam_policy_document.inline
}
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/variables.common.tf
29 changes: 29 additions & 0 deletions policies/sc-servicecatalog-t1/variables.tf.unused
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
variable "name" {
description = "Permission Set Name for which all settings apply"
type = string
default = null
}

variable "managed_policy_names" {
description = "Names of AWS Managed Policy to attach to the permissionset"
type = list(string)
default = []
}

variable "customer_managed_policy_names" {
description = "Map of policy name to permission boundary of Customer Managed Policy to attach to the permissionset"
type = map(string)
default = {}
}

# variable "inline_policy" {
# description = "AWS Policy document for the single allowed inline policy"
# type = string
# default = null
# }

variable "relay_state" {
description = "Relay State to pass along to permissionset"
type = string
default = null
}
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/version.tf
1 change: 1 addition & 0 deletions policies/sc-servicecatalog-t1/versions.tf