Blog

Wie Sie die S3-Standardverschlüsselung durchsetzen

Laurens Knoll

Aktualisiert Oktober 21, 2025
3 Minuten

Die Amazon S3-Standardverschlüsselung legt Verschlüsselungseinstellungen für alle Objekt-Uploads fest, aber diese Einstellungen werden nicht erzwungen. Dies kann dazu führen, dass unverschlüsselte Objekte in den Bucket hochgeladen werden. In diesem Blog finden Sie eine Bucket-Richtlinie, die die Verschlüsselung aller Objekt-Uploads erzwingt.

Die folgende CloudFormation-Vorlage erzwingt die Verwendung der KMS-Verschlüsselung mit einer Bucket-Richtlinie.

  Resources:
    Bucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketEncryption:
          ServerSideEncryptionConfiguration:
            - ServerSideEncryptionByDefault:
                SSEAlgorithm: aws:kms
                KMSMasterKeyID: !GetAtt EncryptionKey.Arn

    BucketPolicy:
      Type: AWS::S3::BucketPolicy
      Properties:
        Bucket: !Ref Bucket
        PolicyDocument:
          Statement:
            - Sid: Restrict to Default- or KMS-encryption
              Effect: Deny
              Principal: '*'
              Action: 's3:PutObject'
              Resource: !Sub
                - '${BucketArn}/*'
                - BucketArn: !GetAtt Bucket.Arn
              Condition:
                'Null':
                  s3:x-amz-server-side-encryption: false
                StringNotEquals:
                  s3:x-amz-server-side-encryption: 'aws:kms'
            - Sid: Restrict KMS-key
              Effect: Deny
              Principal: '*'
              Action: 's3:PutObject'
              Resource: !Sub
                - '${BucketArn}/*'
                - BucketArn: !GetAtt Bucket.Arn
              Condition:
                StringNotEquals:
                  s3:x-amz-server-side-encryption: 'aws:kms'
                StringNotEqualsIfExists:
                  s3:x-amz-server-side-encryption-aws-kms-key-id: !GetAtt EncryptionKey.Arn

    EncryptionKey:
      Type: AWS::KMS::Key
      Properties:
        KeyPolicy:
          Version: '2012-10-17'
          Statement:
            - Sid: Enable IAM User Permissions
              Effect: Allow
              Principal:
                AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
              Action: 'kms:*'
              Resource: '*'

In den Zeilen 7 bis 9 aktivieren Sie die Standardverschlüsselung, um alle hochgeladenen Objekte ohne Verschlüsselungsinformationen automatisch zu verschlüsseln. Die Standardverschlüsselung ist auf den Algorithmus KMS und den Schlüssel EncryptionKey eingestellt.

  - ServerSideEncryptionByDefault:
      SSEAlgorithm: aws:kms
      KMSMasterKeyID: !GetAtt EncryptionKey.Arn

Die Bucket-Richtlinie erzwingt die Standardverschlüsselungseinstellungen, indem Uploads mit ungültigen Verschlüsselungsinformationen verweigert werden. Zur Durchsetzung der KMS-Verschlüsselung werden Uploads mit ungültigen Verschlüsselungsalgorithmen unter Verwendung des Schlüssels s3:x-amz-server-side-encryption-condition verweigert. Um KMS-key EncryptionKey zu erzwingen, verweigern wir Uploads mit einem ungültigen Verschlüsselungsschlüssel unter Verwendung des Schlüssels s3:x-amz-server-side-encryption-aws-kms-key-id-condition.

KMS-Verschlüsselung erzwingen

  - Sid: Restrict to Default- or KMS-encryption
    Effect: Deny
    Principal: '*'
    Action: 's3:PutObject'
    Resource: !Sub
      - '${BucketArn}/*'
      - BucketArn: !GetAtt Bucket.Arn
    Condition:
      'Null':
        s3:x-amz-server-side-encryption: false
      StringNotEquals:
        s3:x-amz-server-side-encryption: 'aws:kms'

Die Null-Bedingung erlaubt Uploads ohne Verschlüsselungsinformationen und die StringNotEquals-Bedingung verweigert Uploads mit ungültigen Verschlüsselungsinformationen. Beachten Sie, dass die Verwendung von StringNotEqualsIfExists für Uploads ohne Verschlüsselungsinformationen nicht funktioniert. Die Bedingung wird als wahr ausgewertet und verweigert den Upload aufgrund des Deny-Effekts.

KMS-Schlüssel erzwingen

  - Sid: Restrict KMS-key
    Effect: Deny
    Principal: '*'
    Action: 's3:PutObject'
    Resource: !Sub
      - '${BucketArn}/*'
      - BucketArn: !GetAtt Bucket.Arn
    Condition:
      StringNotEquals:
        s3:x-amz-server-side-encryption: 'aws:kms'
      StringNotEqualsIfExists:
        s3:x-amz-server-side-encryption-aws-kms-key-id: !GetAtt EncryptionKey.Arn

Die StringNotEquals-Bedingung beschränkt die Richtlinie auf KMS-verschlüsselte Uploads. Zusätzlich verweigert die StringNotEqualsIfExists-Bedingung Uploads mit ungültigen Verschlüsselungsschlüsseln. Beachten Sie, dass die Überprüfung des Verschlüsselungsschlüssels nicht ausreicht. S3 verwendet den von AWS verwalteten CMK, wenn der Algorithmus festgelegt ist, der Schlüssel jedoch nicht.

Wenn Sie x-amz-server-side-encryption:aws:kms angeben, aber keine x-amz-server-side-encryption-aws-kms-key-id zur Verfügung stellen, verwendet Amazon S3 den von AWS verwalteten CMK in AWS KMS zum Schutz der Daten.

Quelle: PutObject API-Referenz

Verfasst von

Laurens Knoll

As a cloud consultant I enjoy improving what your company does best. I enable your business using cloud technology and enable your engineers by applying software engineering practices to your infrastructure domain.

Contact

Let’s discuss how we can support your journey.