Skip to content

Commit 4fb725a

Browse files
authored
Merge pull request hashicorp#45105 from hashicorp/f-s3lockout
s3lockout
2 parents 3e61156 + ef3f441 commit 4fb725a

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed

.changelog/45105.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:enhancement
2+
resource/aws_s3_bucket_server_side_encryption_configuration: Add `rule.blocked_encryption_types` argument
3+
```
4+
5+
```release-note:note
6+
resource/aws_s3_bucket_server_side_encryption_configuration: Starting in March 2026, Amazon S3 will introduce a new default bucket security setting by automatically disabling server-side encryption with customer-provided keys (SSE-C) for all new buckets. Use the `blocked_encryption_types` argument to manage this behavior for specific buckets.
7+
```

internal/service/s3/bucket_server_side_encryption_configuration.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ func resourceBucketServerSideEncryptionConfiguration() *schema.Resource {
7474
},
7575
},
7676
},
77+
"blocked_encryption_types": {
78+
Type: schema.TypeList,
79+
Optional: true,
80+
Elem: &schema.Schema{
81+
Type: schema.TypeString,
82+
ValidateDiagFunc: enum.Validate[types.EncryptionType](),
83+
},
84+
},
7785
"bucket_key_enabled": {
7886
Type: schema.TypeBool,
7987
Optional: true,
@@ -294,6 +302,10 @@ func expandServerSideEncryptionRules(l []any) []types.ServerSideEncryptionRule {
294302
rule.ApplyServerSideEncryptionByDefault = expandServerSideEncryptionByDefault(v)
295303
}
296304

305+
if v, ok := tfMap["blocked_encryption_types"].([]any); ok && len(v) > 0 {
306+
rule.BlockedEncryptionTypes = expandBlockedEncryptionTypes(v)
307+
}
308+
297309
if v, ok := tfMap["bucket_key_enabled"].(bool); ok {
298310
rule.BucketKeyEnabled = aws.Bool(v)
299311
}
@@ -314,6 +326,12 @@ func flattenServerSideEncryptionRules(rules []types.ServerSideEncryptionRule) []
314326
m["apply_server_side_encryption_by_default"] = flattenServerSideEncryptionByDefault(rule.ApplyServerSideEncryptionByDefault)
315327
}
316328

329+
if rule.BlockedEncryptionTypes != nil {
330+
if flattened := flattenBlockedEncryptionTypes(rule.BlockedEncryptionTypes); flattened != nil {
331+
m["blocked_encryption_types"] = flattened
332+
}
333+
}
334+
317335
if rule.BucketKeyEnabled != nil {
318336
m["bucket_key_enabled"] = aws.ToBool(rule.BucketKeyEnabled)
319337
}
@@ -339,3 +357,31 @@ func flattenServerSideEncryptionByDefault(sse *types.ServerSideEncryptionByDefau
339357

340358
return []any{m}
341359
}
360+
361+
func expandBlockedEncryptionTypes(l []any) *types.BlockedEncryptionTypes {
362+
if len(l) == 0 {
363+
return nil
364+
}
365+
366+
var encryptionTypes []types.EncryptionType
367+
for _, v := range l {
368+
encryptionTypes = append(encryptionTypes, types.EncryptionType(v.(string)))
369+
}
370+
371+
return &types.BlockedEncryptionTypes{
372+
EncryptionType: encryptionTypes,
373+
}
374+
}
375+
376+
func flattenBlockedEncryptionTypes(bet *types.BlockedEncryptionTypes) []any {
377+
if bet == nil || len(bet.EncryptionType) == 0 {
378+
return nil
379+
}
380+
381+
var result []any
382+
for _, et := range bet.EncryptionType {
383+
result = append(result, string(et))
384+
}
385+
386+
return result
387+
}

internal/service/s3/bucket_server_side_encryption_configuration_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,47 @@ func TestAccS3BucketServerSideEncryptionConfiguration_basic(t *testing.T) {
5353
})
5454
}
5555

56+
func TestAccS3BucketServerSideEncryptionConfiguration_blockedEncryptionTypes(t *testing.T) {
57+
ctx := acctest.Context(t)
58+
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
59+
resourceName := "aws_s3_bucket_server_side_encryption_configuration.test"
60+
61+
resource.ParallelTest(t, resource.TestCase{
62+
PreCheck: func() { acctest.PreCheck(ctx, t) },
63+
ErrorCheck: acctest.ErrorCheck(t, names.S3ServiceID),
64+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
65+
CheckDestroy: acctest.CheckDestroyNoop,
66+
Steps: []resource.TestStep{
67+
{
68+
Config: testAccBucketServerSideEncryptionConfigurationConfig_blockedEncryptionTypes(rName, `["SSE-C"]`),
69+
Check: resource.ComposeAggregateTestCheckFunc(
70+
testAccCheckBucketServerSideEncryptionConfigurationExists(ctx, resourceName),
71+
resource.TestCheckResourceAttr(resourceName, acctest.CtRulePound, "1"),
72+
resource.TestCheckResourceAttr(resourceName, "rule.0.blocked_encryption_types.#", "1"),
73+
resource.TestCheckResourceAttr(resourceName, "rule.0.blocked_encryption_types.0", "SSE-C"),
74+
),
75+
},
76+
{
77+
ResourceName: resourceName,
78+
ImportState: true,
79+
ImportStateVerify: true,
80+
ImportStateVerifyIgnore: []string{
81+
"rule.0.bucket_key_enabled",
82+
},
83+
},
84+
{
85+
Config: testAccBucketServerSideEncryptionConfigurationConfig_blockedEncryptionTypes(rName, `["NONE"]`),
86+
Check: resource.ComposeAggregateTestCheckFunc(
87+
testAccCheckBucketServerSideEncryptionConfigurationExists(ctx, resourceName),
88+
resource.TestCheckResourceAttr(resourceName, acctest.CtRulePound, "1"),
89+
resource.TestCheckResourceAttr(resourceName, "rule.0.blocked_encryption_types.#", "1"),
90+
resource.TestCheckResourceAttr(resourceName, "rule.0.blocked_encryption_types.0", "NONE"),
91+
),
92+
},
93+
},
94+
})
95+
}
96+
5697
func TestAccS3BucketServerSideEncryptionConfiguration_ApplySEEByDefault_AES256(t *testing.T) {
5798
ctx := acctest.Context(t)
5899
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)
@@ -634,6 +675,32 @@ resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
634675
`, rName, enabled)
635676
}
636677

678+
func testAccBucketServerSideEncryptionConfigurationConfig_blockedEncryptionTypes(rName, blockedTypes string) string {
679+
return fmt.Sprintf(`
680+
resource "aws_kms_key" "test" {
681+
description = "KMS Key for Bucket %[1]s"
682+
deletion_window_in_days = 10
683+
}
684+
685+
resource "aws_s3_bucket" "test" {
686+
bucket = %[1]q
687+
}
688+
689+
resource "aws_s3_bucket_server_side_encryption_configuration" "test" {
690+
bucket = aws_s3_bucket.test.bucket
691+
692+
rule {
693+
apply_server_side_encryption_by_default {
694+
kms_master_key_id = aws_kms_key.test.id
695+
sse_algorithm = "aws:kms"
696+
}
697+
bucket_key_enabled = true
698+
blocked_encryption_types = %[2]s
699+
}
700+
}
701+
`, rName, blockedTypes)
702+
}
703+
637704
func testAccBucketServerSideEncryptionConfigurationConfig_migrateNoChange(rName string) string {
638705
return fmt.Sprintf(`
639706
resource "aws_s3_bucket" "test" {

website/docs/r/s3_bucket_server_side_encryption_configuration.html.markdown

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,32 @@ resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
3636
}
3737
```
3838

39+
### Blocking SSE-C Uploads
40+
41+
```terraform
42+
resource "aws_kms_key" "mykey" {
43+
description = "This key is used to encrypt bucket objects"
44+
deletion_window_in_days = 10
45+
}
46+
47+
resource "aws_s3_bucket" "mybucket" {
48+
bucket = "mybucket"
49+
}
50+
51+
resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
52+
bucket = aws_s3_bucket.mybucket.id
53+
54+
rule {
55+
apply_server_side_encryption_by_default {
56+
kms_master_key_id = aws_kms_key.mykey.arn
57+
sse_algorithm = "aws:kms"
58+
}
59+
bucket_key_enabled = true
60+
blocked_encryption_types = ["SSE-C"]
61+
}
62+
}
63+
```
64+
3965
## Argument Reference
4066

4167
This resource supports the following arguments:
@@ -50,6 +76,7 @@ This resource supports the following arguments:
5076
The `rule` configuration block supports the following arguments:
5177

5278
* `apply_server_side_encryption_by_default` - (Optional) Single object for setting server-side encryption by default. [See below](#apply_server_side_encryption_by_default).
79+
* `blocked_encryption_types` - (Optional) List of server-side encryption types to block for object uploads. Valid values are `SSE-C` (blocks uploads using server-side encryption with customer-provided keys) and `NONE` (unblocks all encryption types). Starting in March 2026, Amazon S3 will automatically block SSE-C uploads for all new buckets.
5380
* `bucket_key_enabled` - (Optional) Whether or not to use [Amazon S3 Bucket Keys](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html) for SSE-KMS.
5481

5582
### apply_server_side_encryption_by_default

0 commit comments

Comments
 (0)