Skip to content

feat: add support for S3 SSE-C (customer-provided encryption keys)#284

Open
schaurian wants to merge 1 commit into
cloudnative-pg:mainfrom
schaurian:feat/s3-sse-c
Open

feat: add support for S3 SSE-C (customer-provided encryption keys)#284
schaurian wants to merge 1 commit into
cloudnative-pg:mainfrom
schaurian:feat/s3-sse-c

Conversation

@schaurian

Copy link
Copy Markdown

Summary

Adds support for S3 Server-Side Encryption with Customer-provided keys (SSE-C) to the barman-cloud library.

A new optional sseCustomerKey field on S3Credentials references a secret holding a base64-encoded 256-bit AES key. When set, the key is materialized to a file and passed to every barman-cloud command via the --sse-customer-key file:// option.

This is the library-side change needed to close cloudnative-pg/plugin-barman-cloud#646 — S3-compatible providers such as Hetzner Object Storage only support SSE-C for encryption at rest, so the existing bucket-managed encryption field (SSE-S3 / SSE-KMS) cannot be used with them.

What changed

File Change
pkg/api/config.go New SSECustomerKey *SecretKeySelector field on S3Credentials (+ generated deepcopy)
pkg/utils/constants.go SSECustomerKeyFileLocation — the on-disk path for the materialized key
pkg/credentials/env.go Materialize/remove the key file from the referenced secret (same pattern as the Google credentials file)
pkg/command/commandbuilder.go Inject --sse-customer-key file://… in the shared appendCloudProviderOptions
pkg/command/commandbuilder_test.go Unit tests for the AWS SSE-C option

Design notes

  • Single injection point. The flag is added in appendCloudProviderOptions, through which every command builder already routes (barman-cloud-backup, -wal-archive, -wal-restore, -restore, -backup-list, -backup-delete, -check-wal-archive). SSE-C requires the key on every read and write, so covering the shared chokepoint avoids the classic "backups succeed but restores fail because a read path was missed" footgun.
  • Key materialization mirrors the existing Google credentials handling (reconcileGoogleCredentials → a /controller/... file written atomically with 0600), so no new volume-mount plumbing is needed in consumers; the same code path serves both the operator and the plugin sidecar.
  • Orthogonal to encryption. SSE-C (customer key) and SSE-S3/SSE-KMS (bucket-managed) are independent mechanisms; this field does not touch the existing encryption option.
  • Auth-method independent. The key is materialized before the auth branching in envSetAWSCredentials, so it works with explicit keys, session tokens, and inheritFromIAMRole.

Dependency / rollout

Runtime use requires a barman release that ships the --sse-customer-key option (EnterpriseDB/barman#973, merged to master). This Go change is valid and tested independently of that release; the plugin can adopt it once both are released. A follow-up PR wires the field into plugin-barman-cloud.

Testing

  • go build ./..., go vet ./pkg/... — clean
  • go test ./pkg/... — passing (new AWS SSE-C option specs added)
  • gofmt / gofumpt / gci — clean

🤖 Generated with Claude Code

Add an `sseCustomerKey` field to the S3 credentials that references a
secret holding a base64-encoded 256-bit AES key. When set, the key is
materialized to a file and passed to every barman-cloud command through
the `--sse-customer-key file://` option, enabling Server-Side Encryption
with Customer-provided keys (SSE-C).

This is required by S3-compatible providers that only support SSE-C for
encryption at rest (e.g. Hetzner Object Storage). The option is injected
in the shared `appendCloudProviderOptions` chokepoint, so it applies to
all barman-cloud-* commands (backup, wal-archive, wal-restore, restore,
backup-list, backup-delete, check-wal-archive), and is orthogonal to the
existing bucket-managed `encryption` (SSE-S3/SSE-KMS) option. The key is
materialized before the auth-method branching so it works with every
authentication method, including inheritFromIAMRole.

Requires a barman release that ships the `--sse-customer-key` option
(EnterpriseDB/barman#973).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Florian Schauer <florian@schauer.to>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature request] Support for S3 SSE-C - Server-Side Encryption with Customer-provided keys

1 participant