Encrypt a bring-your-own-bucket database with a key you own and control in your own cloud KMS — AWS KMS, Google Cloud KMS, or Azure Key Vault — so you can revoke Infino’s access to the data at any time, independently of Infino.
Customer-managed encryption keys (CMEK, also called BYOK) let you encrypt a
bring-your-own-bucket (BYOB) database with a key
you own and control in your own cloud KMS. Because the key is yours, you can
revoke Infino’s ability to read the data at any time, independently of Infino.CMEK applies only to BYOB databases — databases whose data lives in your cloud
bucket. The key is configured on your bucket, in your KMS, and Infino is
only ever granted use of it. Infino never holds your key material.
CMEK, like BYOB, is an enterprise feature enabled per account by Infino —
contact your Infino representative to turn it on. Set up
the BYOB database first (see Bring Your Own Bucket);
CMEK adds a key to that same storage binding.
CMEK is available for BYOB on Amazon S3 (AWS KMS), Google Cloud Storage
(Cloud KMS), and Azure Blob Storage (Key Vault). One Azure-specific note:
revoking a key takes effect on a delay, because the storage service caches the
key for a time — see What revocation does.
Three things make a CMEK-encrypted BYOB database work, and they are the same on
every cloud:
Your bucket encrypts with your key. You configure your bucket’s default
encryption to use your customer-managed key, so every object written into it is
encrypted under that key — including everything Infino writes.
You grant Infino’s identity use of the key. The same role or grant Infino
already uses to read and write your bucket is additionally allowed to encrypt
and decrypt with the key — nothing more. It can never export the key, change
it, or use it for anything but your bucket.
Infino verifies the key before serving. When you create the database (or on
an explicit re-verify), Infino confirms your bucket’s default encryption is the
key you named and that it can write and read under it. On each later access
refresh it re-checks only that the key is still usable. If the key cannot be
used, Infino refuses to serve the database rather than fall back to a weaker key.
Because the key lives in your KMS, disabling, deleting, or un-granting it is your
lever: it makes the database unavailable to Infino within one access-refresh
interval, and deleting the key makes the data permanently unreadable by anyone.
Name the key by its key ARN, not an alias ARN. An alias
(arn:aws:kms:...:alias/...) can be repointed to a different key later, so Infino
scopes access to the key itself and rejects an alias ARN at setup. The key and
the bucket must also be in the same region — S3 SSE-KMS requires it, and Infino
checks the key ARN’s region against the bucket’s when you create the database.
2
Set the bucket's default encryption to SSE-KMS
On the BYOB bucket, set default encryption to SSE-KMS and select the key
from step 1. Every object Infino writes then lands encrypted under your key
automatically.S3 Bucket Keys collapse per-object key derivations to roughly one per bucket
and substantially cut your KMS request cost for a write-heavy workload like an
index, so we recommend enabling them. The tradeoff: with a bucket key, S3 caches a
bucket-level data key for a short window, so a key disable can take effect a
little later than with per-object derivation. If you need the tightest revocation,
leave Bucket Keys off and set bucket_key to false when you create the database;
Infino honours that choice on every write.Infino confirms the bucket default at setup by reading your bucket’s encryption
configuration, so the BYOB role also needs s3:GetEncryptionConfiguration on
the bucket. This is a configuration read, not an object write.
3
Grant Infino's role use of the key
The role Infino assumes for your bucket must be allowed to encrypt and decrypt with
your key. Add a statement to the KMS key policy (or an equivalent grant):
kms:GenerateDataKey wraps a data key on write; kms:Decrypt unwraps it on
read. Those two actions are all Infino needs, and all you should grant.
"Resource": "*" in a key policy means this key — the policy is attached to
the key itself and grants no access to any other key.
Recommended: the kms:ViaService condition (set to your bucket’s region). It
confines the grant to calls S3 makes on the role’s behalf, so a leaked role
credential still cannot call KMS outside S3.
4
Add the key to the database's storage binding
Create the BYOB database as in
Bring Your Own Bucket, adding an encryption block
to the storage object:
key_arn — the key ARN from step 1 (not an alias), in the bucket’s region.
bucket_key — true if you enabled S3 Bucket Keys in step 2.
Infino verifies the key during setup by writing and reading back a probe object and
confirming it is encrypted under exactly this key. If the grant is missing or the
key is unusable, verification fails — restore the grant and re-verify.
Create a Cloud KMS key and set it as the bucket default
Create a Cloud KMS key in the same location as your bucket and set it as the
bucket’s default encryption key.
2
Grant the Cloud Storage service agent use of the key
Grant the Cloud Storage service agent of the bucket’s project the role
roles/cloudkms.cryptoKeyEncrypterDecrypter on that key. On GCS, encryption
happens service-side — the storage service’s own service agent calls KMS, not
Infino — so this grant is what lets your bucket encrypt and decrypt with your key.
Infino verifies by reading a probe object’s reported KMS key name back and
confirming it matches the key you named — version-agnostically, so key rotation
needs no action.
On Azure, the storage service caches your key, so a revocation (disable or delete)
takes effect on a delay of roughly 7–30 minutes, not the near-immediate effect
on AWS and GCP — see What revocation does.
Azure CMEK requires a container default encryption scope backed by your Key
Vault key — a storage-account key with no scope is not supported, because Infino
verifies the key by reading the scope back off the data.
1
Create a default encryption scope on the container
Create a default encryption scope on the container, backed by your Key Vault
key, and deny per-blob encryption-scope override so every blob is forced onto
the scope’s key.
2
Grant the storage account's identity access to the key
Grant the storage account’s identity access to the key in Key Vault (via an access
policy or Azure RBAC) so the storage service can wrap and unwrap with it. Encryption
is service-side on Azure, as on GCP.
3
Name the key and scope when you create the database
Your key is a control you hold. The mechanism is the same on every cloud; the
timing differs: on AWS and GCP a disable or deletion bites on the next access
refresh (about five minutes), while on Azure the storage service caches your
key, so a revocation takes roughly 7–30 minutes to take effect.
Any of the following makes the database unavailable to Infino within roughly one
access-refresh interval — about five minutes on AWS and GCP, roughly 7–30 minutes
on Azure — plus a brief eviction:
Disabling the key,
Scheduling the key for deletion (while still within the KMS waiting period), or
Revoking Infino’s access to the key (AWS/GCP: remove the key-policy statement
or grant; Azure: remove the storage account identity’s Key Vault access).
When this happens, Infino’s periodic access refresh exercises your key — it
reads a byte of an object your database already holds, which forces a decrypt (it
writes nothing). Finding the key can no longer decrypt, it takes the safe path: it
stops serving the database and clears its cached data from Infino’s compute —
including any cache left behind after the database scaled to zero — so nothing the
key once protected keeps being served from a local copy. Your data in your bucket
is untouched, and so is the database’s record in Infino.
Two honest limits. The timing is bounded by the refresh cadence, not
instantaneous — a database serving entirely from its local cache does not touch
your key until the next refresh (plus, on Azure, the storage service’s key-cache
delay). And the refresh checks that the key still works, not that it is still the
same key: key identity is verified at create time and on an explicit
re-verify, not on every refresh.
To restore service: re-enable the key (or restore the grant), then re-verify. A
reserved (always-on) database re-verifies itself on its next refresh. A non-reserved
database that was evicted is not running, so a plain request to it is refused while
it is marked unreachable — call
POST /v1/databases/{name}/storage/verify to heal it, and serving resumes. No data
was lost.
Deleting the key (the hard kill switch — irreversible)
If you let the key’s deletion complete — past the KMS waiting period — the data
encrypted under it becomes permanently unreadable by everyone, Infino included.
There is no recovery, by design, because the key material that could decrypt the
objects no longer exists. Use the waiting period as your window to change your mind.
Key rotation needs no action. Objects already written stay readable because each
was wrapped under the key version in effect when it was written, and that version
continues to decrypt it. New writes use the current version. You do not need to tell
Infino, re-verify, or re-create anything when you rotate.