Skip to content

Commit 698df7f

Browse files
committed
Fix S3 Bucket logging
* Add the S3 policy to actually allow buckets to log
1 parent 5a8b566 commit 698df7f

File tree

6 files changed

+44
-10
lines changed

6 files changed

+44
-10
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ It can in most cases be used to host any static site, however this module adds s
5656
| [aws_iam_policy.publii_s3_frontend](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |
5757
| [aws_iam_user.publii_s3_frontend](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_user) | resource |
5858
| [aws_iam_user_policy_attachment.publii_s3_frontend](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_user_policy_attachment) | resource |
59-
| [aws_kms_key.logs](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
6059
| [aws_kms_key.s3_bucket_frontend_www_redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
6160
| [aws_lambda_permission.cloudfront_invalidation_frontend_alllow_s3](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource |
6261
| [aws_route53_record.cloudfront_frontend_tls_certificate_dns_validation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_record) | resource |
@@ -87,6 +86,7 @@ It can in most cases be used to host any static site, however this module adds s
8786
| [aws_s3_bucket_website_configuration.frontend_www_redirect](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_website_configuration) | resource |
8887
| [aws_wafv2_web_acl.cloudfront_waf](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl) | resource |
8988
| [random_id.project](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
89+
| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |
9090
| [aws_route53_zone.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/route53_zone) | data source |
9191
| [template_file.cloudfront_frontend_viewer_request_function](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
9292
| [template_file.frontend_bucket_cloudfront_read](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
@@ -97,6 +97,7 @@ It can in most cases be used to host any static site, however this module adds s
9797
| [template_file.frontend_www_redirect_bucket_policy](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
9898
| [template_file.lambda_cloudfront_invalidation_frontend_policy](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
9999
| [template_file.logs_bucket_enforce_tls_statement](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
100+
| [template_file.logs_bucket_log_delivery_access_statement](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
100101
| [template_file.logs_bucket_policy](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
101102
| [template_file.publii_s3_frontend_policy](https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file) | data source |
102103

data.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ data "aws_route53_zone" "default" {
33

44
zone_id = local.route53_hosted_zone_options.id
55
}
6+
7+
data "aws_caller_identity" "current" {}

kms.tf

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,3 @@ resource "aws_kms_key" "s3_bucket_frontend_www_redirect" {
55
deletion_window_in_days = 10
66
enable_key_rotation = true
77
}
8-
9-
resource "aws_kms_key" "logs" {
10-
description = "This key is used to encrypt bucket objects within ${aws_s3_bucket.logs.id}"
11-
deletion_window_in_days = 10
12-
enable_key_rotation = true
13-
}

locals.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
locals {
2+
account_id = data.aws_caller_identity.current.account_id
23
site_url = var.site_url
34
project_random_id = random_id.project.dec
45
project_name = "${replace(local.site_url, ".", "-")}-${local.project_random_id}"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"Principal": {
3+
"Service": "logging.s3.amazonaws.com"
4+
},
5+
"Action": [
6+
"s3:PutObject"
7+
],
8+
"Effect": "Allow",
9+
"Resource": "${log_bucket_arn}/*",
10+
"Condition": {
11+
"ArnLike": {
12+
"aws:SourceArn": ${source_bucket_arns}
13+
},
14+
"StringEquals": {
15+
"aws:SourceAccount": "${account_id}"
16+
}
17+
}
18+
}

s3-logs.tf

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@ resource "aws_s3_bucket_public_access_block" "logs" {
2323
restrict_public_buckets = true
2424
}
2525

26+
# If default encryption is enabled on the target bucket, AES256 (SSE-S3) must be selected as the encryption key
27+
# https://aws.amazon.com/premiumsupport/knowledge-center/s3-server-access-log-not-delivered/
28+
#tfsec:ignore:aws-s3-encryption-customer-key
2629
resource "aws_s3_bucket_server_side_encryption_configuration" "logs" {
2730
bucket = aws_s3_bucket.logs.bucket
2831

2932
rule {
3033
apply_server_side_encryption_by_default {
31-
kms_master_key_id = aws_kms_key.logs.arn
32-
sse_algorithm = "aws:kms"
34+
sse_algorithm = "AES256"
3335
}
3436
}
3537
}
@@ -42,13 +44,29 @@ data "template_file" "logs_bucket_enforce_tls_statement" {
4244
}
4345
}
4446

47+
data "template_file" "logs_bucket_log_delivery_access_statement" {
48+
template = file("${path.module}/policies/s3-bucket-policy-statements/log-delivery-access.json.tpl")
49+
50+
vars = {
51+
log_bucket_arn = aws_s3_bucket.logs.arn
52+
source_bucket_arns = local.cloudfront_enable_apex_to_www_redirect ? jsonencode([
53+
aws_s3_bucket.frontend.arn,
54+
aws_s3_bucket.frontend_www_redirect.0.arn,
55+
]) : jsonencode([
56+
aws_s3_bucket.frontend.arn,
57+
])
58+
account_id = local.account_id
59+
}
60+
}
61+
4562
data "template_file" "logs_bucket_policy" {
4663
template = file("${path.module}/policies/s3-bucket-policy.json.tpl")
4764

4865
vars = {
4966
statement = <<EOT
5067
[
51-
${data.template_file.logs_bucket_enforce_tls_statement.rendered}
68+
${data.template_file.logs_bucket_enforce_tls_statement.rendered},
69+
${data.template_file.logs_bucket_log_delivery_access_statement.rendered}
5270
]
5371
EOT
5472
}

0 commit comments

Comments
 (0)