SSE Reference Documentation¶
Encryption Key Ownership¶
When configuring encryption using the PutBucketEncryption or
PutObject S3 API calls, the SSEAlgorithm parameter controls the
ownership of the master encryption keys – by the platform or by the user
– and correspondingly the way the API behaves.
AES256¶
With SSEAlgorithm=AES256, ARTESCA owns and manages the master encryption
keys. Users have no control over these keys. ARTESCA handles the key
lifecycle, creating a key per bucket when encryption is first used.
The master key ID is never exposed to S3 users in API responses when using AES256.
aws:kms¶
With SSEAlgorithm=aws:kms, the account owns the master encryption keys.
Users can either:
Provide a specific key ID using the
KMSMasterKeyIDparameter (referred to as a “customer-configured master key”). The key must already exist in the KMS.Omit the key ID, in which case ARTESCA uses the bucket’s existing default master key, or requests the KMS to generate a new one if no key exists yet.
When using aws:kms, the master key ID (or its ARN) is returned in S3 API
responses (PutObject, HeadObject, GetObject, CopyObject).
Customer-Configured Master Key¶
When using the aws:kms SSEAlgorithm, provide the ID of the master
encryption key to use for a specific object or bucket through the
KMSMasterKeyID parameter.
At bucket level (PutBucketEncryption): the specified key becomes the
default for all objects uploaded to that bucket without their own key ID.
At object level (PutObject): the specified key overrides any
bucket-level default for that specific object.
If no KMSMasterKeyID is provided:
If the bucket has a configured default key, that key is used.
Otherwise, ARTESCA creates a new master key in the KMS for the bucket.
Important
Regardless of the SSEAlgorithm chosen (AES256 or aws:kms),
encryption keys are always stored in the configured backend: metadata for
internal SSE, or the external KMS for external SSE. This differs from
AWS, where SSEAlgorithm implicitly selects the backend (AES256
uses S3-managed storage and aws:kms uses AWS KMS), whereas ARTESCA
uses the single pre-configured backend for both algorithms.
Encryption Behavior Matrix¶
The following table describes what happens for all 16 combinations of bucket-level and object-level encryption settings. This is the actual behavior verified against ARTESCA.
Column definitions:
Bucket SSE Algo – the
SSEAlgorithmvalue configured on the bucket usingPutBucketEncryption. This is the bucket’s default encryption algorithm.Bucket Key ID – the
KMSMasterKeyIDvalue configured on the bucket usingPutBucketEncryption. This is the bucket’s default master key.Object SSE Algo – the
x-amz-server-side-encryptionheader sent with thePutObjectrequest. This is per-object and overrides the bucket default.Object Key ID – the
x-amz-server-side-encryption-aws-kms-key-idheader sent with thePutObjectrequest.Result – the encryption actually applied to the stored object:
No encryption – object stored unencrypted
AES256 – encrypted with ARTESCA-managed key
aws:kms (auto) – encrypted with aws:kms, using a key auto-created on first use
aws:kms (bucket) – encrypted with aws:kms, using the bucket’s configured key
aws:kms (custom) – encrypted with aws:kms, using the key specified in the request
# |
Bucket SSE Algo |
Bucket Key ID |
Object SSE Algo |
Object Key ID |
Result |
|---|---|---|---|---|---|
1 |
(none) |
|
(none) |
|
No encryption |
2 |
(none) |
|
AES256 |
|
AES256 |
3 |
(none) |
|
aws:kms |
|
aws:kms (auto) |
4 |
(none) |
|
aws:kms |
custom-key-1 |
aws:kms (custom) |
5 |
AES256 |
|
(none) |
|
AES256 |
6 |
AES256 |
|
AES256 |
|
AES256 |
7 |
AES256 |
|
aws:kms |
|
aws:kms (auto) |
8 |
AES256 |
|
aws:kms |
custom-key-1 |
aws:kms (custom) |
9 |
aws:kms |
|
(none) |
|
aws:kms (auto) |
10 |
aws:kms |
|
AES256 |
|
AES256 |
11 |
aws:kms |
|
aws:kms |
|
aws:kms (auto) |
12 |
aws:kms |
|
aws:kms |
custom-key-1 |
aws:kms (custom) |
13 |
aws:kms |
bucket-key |
(none) |
|
aws:kms (bucket) |
14 |
aws:kms |
bucket-key |
AES256 |
|
AES256 |
15 |
aws:kms |
bucket-key |
aws:kms |
|
aws:kms (bucket) |
16 |
aws:kms |
bucket-key |
aws:kms |
custom-key-2 |
aws:kms (custom) |
Key rules:
Object-level headers always override bucket defaults (rows 7-8, 10, 12, 14, 16)
When no object-level header is set, the bucket default applies (rows 5, 9, 13)
Providing a
KMSMasterKeyIDwithAES256is an error (InvalidArgument)When no encryption is configured at any level, objects are stored unencrypted (row 1)
Master Encryption Key ID Format¶
ARTESCA stores the master key ID in the object metadata using a Scality-specific ARN format that encodes which KMS was used to generate and store the key:
arn:scality:kms:<type>:<protocol>:<provider>:key/<keyId>
Component |
Description |
|---|---|
|
|
|
The protocol used to interface with the KMS:
|
|
The configured |
|
The key identifier from the KMS. For KMIP, this is typically a numeric ID assigned by the server. For AWS KMS, this may be an ARN itself. |
Examples:
Internal:
arn:scality:kms:internal:file:scality:key/a1b2c3d4e5f6...KMIP (Thales):
arn:scality:kms:external:kmip:thales:key/14KMIP (Thales preprod):
arn:scality:kms:external:kmip:thalespreprod:key/14KMIP (Hashicorp):
arn:scality:kms:external:kmip:hashicorp:key/27AWS KMS:
arn:scality:kms:external:aws_kms:awsprod:key/arn:aws:kms:us-east-1:123456:key/abc
Provider Name Requirements¶
For KMIP, the providerName must use one of the following prefixes:
thales– for Thales CipherTrust Manager (for example,thales,thalespreprod)hashicorp– for Hashicorp Vault (for example,hashicorp,hashicorpstaging)hytrust– for Hytrust KeyControl (for example,hytrust,hytrustprod)
The suffix after the prefix is a free-form alphanumeric string chosen by the
administrator to distinguish environments (for example, thalesprod,
thalespreprod). The suffix can also be omitted (for example, thales).
For AWS KMS, the providerName is an open lowercase alphanumeric string
chosen by the administrator (for example, awsprod, awstest).
Warning
The providerName is embedded in every encrypted object’s metadata. If
you change the providerName, all objects encrypted with the original
name become unreadable until the original value is restored. ARTESCA
matches the providerName in the stored ARN against the currently
configured provider, and rejects the request if they do not match.
Controlling the ARN Format in API Responses¶
By default (noAwsArn: false), S3 API responses return the key ID in
AWS-native format, which avoids confusion with third-party applications that
expect standard AWS-style key identifiers. Setting noAwsArn: true makes
ARTESCA return the full Scality-internal ARN
(arn:scality:kms:external:aws_kms:...) instead, which can be useful to
identify which KMS backend encrypted a given object after a migration.
For KMIP, the Scality ARN is always used because there is no native KMIP ARN format.
SSE and Access Control¶
SSE is transparent to IAM and access control. Encryption and decryption happen automatically inside ARTESCA – the S3 API behaves identically whether objects are encrypted or not.
Any user with
s3:GetObjectpermission receives the decrypted data. There is no per-user or per-key access control on encryption keys. This differs from AWS, where IAM policies can grant or deny access to specific KMS keys.Root users and IAM users experience the same encryption behavior. Keys are associated with buckets (or accounts), not with individual users.
Cross-user access: if User B has permission to read objects in User A’s encrypted bucket, User B receives the decrypted content. Encryption does not add an authorization layer.
Service accounts (used internally by ARTESCA for replication, lifecycle, and so on) can also read encrypted objects – they follow the same transparent decryption path.
Bucket Policy SSE Condition Keys¶
ARTESCA does not currently support SSE condition keys in bucket policies:
s3:x-amz-server-side-encryptions3:x-amz-server-side-encryption-aws-kms-key-id
Attempting to use these condition keys in a PutBucketPolicy call is
rejected with a MalformedPolicy error. This means bucket policies
cannot currently be used to enforce that uploads must use encryption.
Replication of SSE-Encrypted Objects¶
Warning
The SourceSelectionCriteria.SseKmsEncryptedObjects field in
replication configuration is accepted but not enforced: both
encrypted and unencrypted objects matching the replication rule are
replicated, regardless of the value of this field. This differs from
AWS S3 behavior.

