Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 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
1 change: 1 addition & 0 deletions infrastructure/modules/secrets_manager/data.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
data "aws_caller_identity" "current" {}
59 changes: 59 additions & 0 deletions infrastructure/modules/secrets_manager/kms.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# KMS CMK to encrypt/decrypt secrets
resource "aws_kms_key" "secrets_cmk" {
#checkov:skip=CKV_AWS_111: Root user needs full KMS key management
#checkov:skip=CKV_AWS_356: Root user needs full KMS key management
#checkov:skip=CKV_AWS_109: Root user needs full KMS key management
description = "CMK for Secrets Manager - ${var.project_name}-${var.environment}"
enable_key_rotation = true
deletion_window_in_days = 30
policy = jsonencode({
Version = "2012-10-17"
Statement = [
# Allow your account root full control
{
Sid = "AllowAccountAdminsFullAccess"
Effect = "Allow"
Principal = { AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root" }
actions = ["kms:*"]
resources = ["*"]
},
# Allow Secrets Manager service to use the key
{
Sid = "AllowSecretsManagerServiceUse"
Effect = "Allow"
Principal = { Service = "secretsmanager.amazonaws.com" }
Action = [
"kms:Encrypt",
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:GenerateDataKeyWithoutPlaintext",
"kms:DescribeKey"
]
Resource = "*"
},
# Allow external role to decrypt for reading the secret
{
Sid = "AllowExternalRoleDecrypt"
Effect = "Allow"
Principal = { AWS = var.external_write_access_role_arn }
Action = [
"kms:Decrypt",
"kms:DescribeKey"
]
Resource = "*"
},
# Allow Lambda role to decrypt for reading the secret
{
Sid = "AllowLambdaRoleDecrypt"
Effect = "Allow"
Principal = { AWS = var.eligibility_lambda_role_arn }
Action = [
"kms:Decrypt",
"kms:DescribeKey"
]
Resource = "*"
}
]
})
tags = var.tags
}
49 changes: 49 additions & 0 deletions infrastructure/modules/secrets_manager/secrets_manager.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Secret definition in your account
resource "aws_secretsmanager_secret" "hashing_secret" {
#checkov:skip=CKV2_AWS_57: Secret rotations are handled manually
name = "${var.project_name}-${var.environment}/hashing_secret"
description = "cross account hashing secrets"
kms_key_id = aws_kms_key.secrets_cmk.arn
tags = {
Environment = var.environment
ManagedBy = "terraform"
}
}

# Initial secrets
resource "aws_secretsmanager_secret_version" "hashing_secrets_test" {
secret_id = aws_secretsmanager_secret.hashing_secret.id
secret_string = "this_is_a_test_secret"
}

# Resource-based policy attached to the secret
resource "aws_secretsmanager_secret_policy" "hashing_secret_policy" {
secret_arn = aws_secretsmanager_secret.hashing_secret.arn

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Sid = "CrossAccountAccess",
Effect = "Allow",
Principal = { AWS = var.external_write_access_role_arn },
Action = [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
Resource = "*"
},
{
Sid = "LambdaAccess",
Effect = "Allow",
Principal = { AWS = var.eligibility_lambda_role_arn },
Action = [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
Resource = "*"
}
]
})
}

9 changes: 9 additions & 0 deletions infrastructure/modules/secrets_manager/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
variable "external_write_access_role_arn" {
description = "Arn of the external write access role to provide secret manager access"
type = string
}

variable "eligibility_lambda_role_arn" {
description = "Arn of the lambda role to provide secret manager access"
type = string
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ data "aws_iam_policy_document" "assumed_role_permissions_boundary" {

# X-Ray - Lambda tracing
"xray:PutTraceSegments",
"xray:PutTelemetryRecords"
"xray:PutTelemetryRecords",

# Secret Manager
"secretsmanager:GetSecretValue"
]

resources = ["*"]
Expand Down
2 changes: 2 additions & 0 deletions infrastructure/stacks/api-layer/iam_policies.tf
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,8 @@ resource "aws_kms_key_policy" "s3_rules_kms_key" {
}

resource "aws_iam_role_policy" "splunk_firehose_policy" {
#checkov:skip=CKV_AWS_290: Firehose requires write access to dynamic log streams without static constraints
#checkov:skip=CKV_AWS_355: Firehose logging requires wildcard resource for CloudWatch log groups/streams
name = "splunk-firehose-policy"
role = aws_iam_role.splunk_firehose_assume_role.id

Expand Down
9 changes: 9 additions & 0 deletions infrastructure/stacks/api-layer/secrets_manager.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module "secrets_manager" {
source = "../../modules/secrets_manager"
count = length(aws_iam_role.write_access_role)
external_write_access_role_arn = aws_iam_role.write_access_role[count.index].arn
environment = var.environment
stack_name = local.stack_name
workspace = terraform.workspace
eligibility_lambda_role_arn = aws_iam_role.eligibility_lambda_role.arn
}
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,12 @@ data "aws_iam_policy_document" "permissions_boundary" {
"wafv2:DisassociateWebACL",
"wafv2:PutLoggingConfiguration",
"wafv2:GetLoggingConfiguration",
"wafv2:DeleteLoggingConfiguration"
"wafv2:DeleteLoggingConfiguration",

# Secret Manager
"secretsmanager:CreateSecret",
"secretsmanager:DeleteSecret",
"secretsmanager:PutSecretValue"
]

resources = ["*"]
Expand Down
Loading