Skip to content
This repository was archived by the owner on Jan 16, 2025. It is now read-only.

Commit 38ed5be

Browse files
npalmJulius Adamek
and
Julius Adamek
committed
feat: Improve syncer s3 kms encryption
manual merge of https://github.com/philips-labs/terraform-aws-github-runner/pull/1915 Co-authored-by: Julius Adamek <[email protected]>
1 parent cfb6da2 commit 38ed5be

File tree

5 files changed

+65
-1
lines changed

5 files changed

+65
-1
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*id_rsa*
99

1010
# other
11+
node_modules/
1112
.idea
1213
.DS_Store
1314
*.out

Diff for: modules/runner-binaries-syncer/lambdas/runner-binaries-syncer/src/syncer/syncer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ async function uploadToS3(s3: S3, cacheObject: CacheObject, actionRunnerReleaseA
7878
Key: cacheObject.key,
7979
Tagging: versionKey + '=' + actionRunnerReleaseAsset.name,
8080
Body: writeStream,
81+
ServerSideEncryption: process.env.S3_SSE_ALGORITHM,
82+
SSEKMSKeyId: process.env.S3_SSE_KMS_KEY_ID,
8183
})
8284
.promise();
8385

Diff for: modules/runner-binaries-syncer/main.tf

+39-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ resource "aws_s3_bucket_lifecycle_configuration" "bucket-config" {
3535

3636
resource "aws_s3_bucket_server_side_encryption_configuration" "action_dist" {
3737
bucket = aws_s3_bucket.action_dist.id
38-
count = length(keys(lookup(var.server_side_encryption_configuration, "rule", {}))) == 0 ? 0 : 1
38+
count = try(var.server_side_encryption_configuration, null) != null ? 1 : 0
3939

4040
dynamic "rule" {
4141
for_each = [lookup(var.server_side_encryption_configuration, "rule", {})]
@@ -63,3 +63,41 @@ resource "aws_s3_bucket_public_access_block" "action_dist" {
6363
ignore_public_acls = true
6464
restrict_public_buckets = true
6565
}
66+
67+
68+
69+
data "aws_iam_policy_document" "action_dist_sse_policy" {
70+
count = try(var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default, null) != null ? 1 : 0
71+
72+
statement {
73+
effect = "Deny"
74+
75+
principals {
76+
type = "AWS"
77+
78+
identifiers = [
79+
"*",
80+
]
81+
}
82+
83+
actions = [
84+
"s3:PutObject",
85+
]
86+
87+
resources = [
88+
"${aws_s3_bucket.action_dist.arn}/*",
89+
]
90+
91+
condition {
92+
test = "StringNotEquals"
93+
variable = "s3:x-amz-server-side-encryption"
94+
values = [var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.sse_algorithm]
95+
}
96+
}
97+
}
98+
99+
resource "aws_s3_bucket_policy" "action_dist_sse_policy" {
100+
count = try(var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default, null) != null ? 1 : 0
101+
bucket = aws_s3_bucket.action_dist.id
102+
policy = data.aws_iam_policy_document.action_dist_sse_policy[0].json
103+
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"Version": "2012-10-17",
3+
"Statement": [
4+
{
5+
"Effect": "Allow",
6+
"Action": ["kms:GenerateDataKey", "kms:Decrypt"],
7+
"Resource": "${kms_key_arn}"
8+
}
9+
]
10+
}

Diff for: modules/runner-binaries-syncer/runner-binaries-syncer.tf

+13
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ resource "aws_lambda_function" "syncer" {
2929
LOG_TYPE = var.log_type
3030
S3_BUCKET_NAME = aws_s3_bucket.action_dist.id
3131
S3_OBJECT_KEY = local.action_runner_distribution_object_key
32+
S3_SSE_ALGORITHM = try(var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.sse_algorithm, null)
33+
S3_SSE_KMS_KEY_ID = try(var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.kms_master_key_id, null)
3234
}
3335
}
36+
3437
dynamic "vpc_config" {
3538
for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : []
3639
content {
@@ -42,6 +45,16 @@ resource "aws_lambda_function" "syncer" {
4245
tags = var.tags
4346
}
4447

48+
resource "aws_iam_role_policy" "lambda_kms" {
49+
count = try(var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.kms_master_key_id, null) != null ? 1 : 0
50+
name = "${var.environment}-lambda-kms-policy-syncer"
51+
role = aws_iam_role.syncer_lambda.id
52+
53+
policy = templatefile("${path.module}/policies/lambda-kms.json", {
54+
kms_key_arn = var.server_side_encryption_configuration.rule.apply_server_side_encryption_by_default.kms_master_key_id
55+
})
56+
}
57+
4558
resource "aws_cloudwatch_log_group" "syncer" {
4659
name = "/aws/lambda/${aws_lambda_function.syncer.function_name}"
4760
retention_in_days = var.logging_retention_in_days

0 commit comments

Comments
 (0)