More Info:
Bedrock Custom Models should use Customer Managed Keys for EncryptionRisk Level
HighAddress
SecurityCompliance Standards
- APRA CPS 234 (Australia)
- BSI C5 (Germany)
- Brazil LGPD
- CCPA / CPRA (California)
- CIS Critical Security Controls v8
- CMMC 2.0
- CSA Cloud Controls Matrix v4
- DPDPA
- Digital Operational Resilience Act (EU)
- ISO/IEC 27018
- ISO/IEC 27701
- MAS Technology Risk Management (Singapore)
- MITRE ATT&CK (Cloud)
- NIST SP 800-171
- NYDFS 23 NYCRR 500
- SOC2
- SWIFT Customer Security Controls Framework
- Sarbanes-Oxley IT General Controls
- StateRAMP
- UK NCSC Cyber Assessment Framework
Triage and Remediation
- Remediation
Remediation
Using Console
Using Console
Below are console-based steps to ensure Amazon Bedrock custom models use customer managed KMS keys (CMKs) for encryption.
1. Create a Customer Managed KMS Key
- Sign in to the AWS Management Console.
- Go to AWS Key Management Service (KMS):
Services → search “Key Management Service”. - In the left pane, choose Customer managed keys → Create key.
- Key type: select Symmetric and Encrypt and decrypt.
- Click Next.
- Key alias: give a clear name (e.g.,
alias/bedrock-custom-models). - (Optional) Add description and tags → Next.
- Key administrators:
- Add IAM roles/users who can manage the key (e.g., your security/admin role).
- Click Next.
- Key usage permissions:
- Under “Other AWS accounts and IAM principals,” add:
- The IAM role(s) or user(s) you use for Bedrock customization.
- Optionally, the Bedrock service principal for your Region if required:
- Format:
bedrock.amazonaws.com
- Format:
- Ensure they have
kms:Encrypt,kms:Decrypt,kms:GenerateDataKey*,kms:DescribeKey. - Click Next.
- Under “Other AWS accounts and IAM principals,” add:
- Review and click Finish to create the key.
2. Ensure IAM Role for Bedrock Can Use the KMS Key
- Still in KMS, click your new key (alias).
- Go to the Key policy tab.
- Confirm the IAM role used by Bedrock (e.g., training/inference role) is listed under “Key users” or in the policy JSON with at least these actions:
kms:Encryptkms:Decryptkms:ReEncrypt*kms:GenerateDataKey*kms:DescribeKey
- If missing, edit the key policy to include that role.
3. Use the CMK When Creating a Custom Model in Bedrock
Note: For existing custom models, the KMS key typically cannot be changed. You’ll need to create a new custom model configured with the CMK and then migrate usage.
- Go to Amazon Bedrock console.
- In the left menu, choose Custom models.
- Click Customize model (or Create custom model).
- Choose:
- Base model provider (e.g., Anthropic, Amazon).
- Specific model to fine-tune.
- In the configuration steps, look for Encryption or KMS key options. Typically you’ll find:
- KMS key for training artifacts / model artifacts / output.
- From the KMS key dropdown:
- Select your customer managed key (
alias/bedrock-custom-models), not the AWS-managed default.
- Select your customer managed key (
- Complete the rest of the customization wizard:
- Upload or point to training data (S3).
- Select IAM role that has access to S3 and your KMS key.
- Configure other training parameters.
- Review and Create / Start customization.
4. (If Needed) Recreate Existing Custom Models
If you already have custom models using AWS-managed keys:- Identify them in Bedrock → Custom models.
- For each:
- Document configuration (base model, hyperparameters, data location).
- Re-run the customization process as in Step 3, but this time selecting your customer managed KMS key.
- Update any applications/clients to use the new custom model ARN.
- Once migrated, delete old custom models if no longer needed.
5. Optional: Validate Encryption Configuration
- In Bedrock → Custom models, open the details page of your new custom model.
- Confirm:
- The listed KMS key ARN matches your CMK (not an
aws/bedrockor other AWS-managed key).
- The listed KMS key ARN matches your CMK (not an
- In KMS → Key usage, verify that your CMK shows use by the Bedrock principal/role.
Using CLI
Using CLI
Below are AWS CLI–focused steps to ensure Amazon Bedrock custom models use customer managed KMS keys instead of AWS‑owned keys.
Note the You can then use either the
Create a key policy file Replace Attach the policy:
Check the Bedrock API version you use; some regions/APIs also take a
If
If you share your region and current Bedrock API version/CLI output of
1. Create a customer managed KMS key
KeyId in the output.Optionally create an alias:KeyId or the alias ARN.2. Add a key policy that allows Bedrock to use the key
Get your account ID:bedrock-kms-policy.json like:ACCOUNT_ID with your account ID or use sed:3. Use the CMK when creating a custom model (model customization job)
When you start a model customization job, specify the KMS key in the output data config and (where supported) for the model artifacts.Example (skeleton):customModelKmsKeyId or similar field in the job request for encrypting the resulting model. If available, set it to your CMK ARN or alias ARN as well.4. Use the CMK when provisioning throughput for the custom model
When you create provisioned throughput for the resulting custom model, specifykmsKeyId:create-provisioned-model-throughput in your region/API variant supports an explicit KMS field (e.g. kmsKeyId), always set it. For existing throughput that does not use your CMK, you typically must:- Create new provisioned throughput with the CMK.
- Update clients to use the new provisioned model ARN.
- Delete the old provisioned throughput.
5. Ensure Bedrock logging (optional but related) also uses CMK
If you use model invocation logging, configure it with your CMK:6. Migrating existing custom models that don’t use CMK
If an existing custom model or job was created without a CMK (using AWS‑owned keys), KMS settings are generally not mutable. To remediate:- Start a new model customization job (step 3) using the CMK.
- Provision new throughput using the CMK (step 4).
- Point applications to the new model/provisioned ARN.
- Decommission the old model resources.
If you share your region and current Bedrock API version/CLI output of
aws bedrock help, I can adjust the exact field names (kmsKeyId vs customModelKmsKeyId, etc.) to match your environment.Using Python
Using Python
To fix this, you must (a) use a customer-managed KMS key (CMK) and (b) ensure every new Bedrock custom model is created with that key. Existing models can’t be “retrofitted”; you have to recreate them with a CMK, then delete the old ones.Below are step‑by‑step instructions and Python examples.
If you use an execution role for Bedrock jobs, also allow that role to use the key (Principal = that role ARN).
If you’re using the
1. Create or choose a customer-managed KMS key
You can create a CMK via console or Python. Example with Python (boto3):2. Update the KMS key policy to allow Bedrock to use it
Add a statement like this to the key policy (via console orput_key_policy) so Bedrock can use the key. Replace:REGIONwith your regionACCOUNT_IDwith your AWS account IDKEY_IDwith the key ID or ARN- Principals as appropriate for your org
3. Ensure S3 buckets used by Bedrock are also using CMK (optional but recommended)
If you store training/output data in S3, configure bucket default encryption with the same CMK or another CMK:4. Create a new custom model with a CMK (Python)
Use the Bedrock client and specify:customModelKmsKeyId– for the model artifactsoutputDataConfig["kmsKeyId"]– for training job outputs in S3 (optional but recommended)
boto3 (Bedrock “control plane” client):CreateCustomModel API directly (for some feature sets), the pattern is similar: include customModelKmsKeyId and outputDataConfig.kmsKeyId.5. Migrate from existing non‑CMK models
- Identify misconfigured models (created without
customModelKmsKeyIdor using AWS‑owned keys). - Re‑run your customization/creation process using the CMK as shown above.
- Test the new custom model.
- Update any applications to use the new model ARN.
- Delete the old model and its associated S3 data if no longer needed.
6. Enforce CMK usage going forward
- Wrap your model‑creation logic in a Python function that always passes
customModelKmsKeyIdandoutputDataConfig.kmsKeyId. - Optionally, use organization/CI checks (e.g., IaC scanning or custom config rules) to block non‑CMK Bedrock model creations.

