Domain 1 of 4 · Chapter 3 of 3

Data Security Controls

KMS key policies: cross-account grants, condition keys, ViaService restriction

KMS key access is governed by a key policy (the resource policy on the key) combined with IAM identity policies. The key policy is the authoritative grant — IAM alone is never enough.

Key policy basics: a default key policy grants the AWS account root user full key access; from there, IAM policies can grant key actions to other principals (but only because the root grant exists). To remove this, scope the key policy to specific principals.

Cross-account access pattern:

{
  "Sid": "AllowCrossAccount",
  "Effect": "Allow",
  "Principal": { "AWS": "arn:aws:iam::CONSUMER_ACCOUNT:root" },
  "Action": ["kms:Decrypt", "kms:DescribeKey", "kms:CreateGrant"],
  "Resource": "*"
}

The consumer account's role still needs kms:Decrypt in its identity policy — this is two-layer (resource + identity) authorization, like S3 cross-account access.

Condition keys worth memorising:

  • kms:ViaService — restricts the key to be used only through a specific AWS service. E.g. "kms:ViaService": "s3.us-east-1.amazonaws.com" means this key can only encrypt/decrypt via S3 in us-east-1. Defends against credentials being misused to decrypt the key through unintended services.
  • kms:CallerAccount — restricts to a specific account. Combined with ViaService for fine-grained scoping.
  • aws:SourceArn — restricts to a specific resource (e.g. only requests from one specific Lambda function or RDS instance).
  • kms:EncryptionContext — requires a specific encryption-context dict to be passed; the same context must be supplied at decrypt time. Used as a sub-key for envelope encryption scenarios.

Grants vs key policy:

  • Key policies are static — edit them and you change permanent permissions.
  • Grants are temporary, programmatic — created via kms:CreateGrant, can be revoked or expire. AWS services (e.g. RDS encryption, EBS encryption) create grants automatically when they need temporary access.

For short-lived workloads needing temporary key access, grants are the pattern. For permanent integration, key policy.

ViaService restriction example (a common SAA scenario):

{
  "Effect": "Allow",
  "Principal": { "AWS": "arn:aws:iam::ACCOUNT:role/AppRole" },
  "Action": ["kms:Encrypt", "kms:Decrypt"],
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "s3.us-east-1.amazonaws.com",
      "kms:CallerAccount": "123456789012"
    }
  }
}

This role can encrypt/decrypt via this key — but only when the request comes through S3 in us-east-1 from account 123456789012. Misuse via SQS / Lambda / direct KMS API is denied.

S3 encryption options: SSE-S3 vs SSE-KMS vs SSE-C vs DSSE-KMS — when each applies

S3 supports four server-side encryption options. Since January 2023, SSE-S3 is enabled by default on every new bucket. The exam tests when to upgrade to a more controlled option.

SSE-S3 (AES-256 with AWS-managed keys):

  • AWS manages key creation, rotation, and storage entirely.
  • Free; no KMS API charges.
  • NO CloudTrail audit of individual encrypt/decrypt operations.
  • Use for: default for non-sensitive data, public marketing content.

SSE-KMS with AWS-managed key (aws/s3):

  • AWS-managed key per region; free.
  • Adds KMS API charges per encrypt/decrypt request.
  • CloudTrail logs every key use (full audit trail).
  • Key policy not editable — fine for general compliance, not for cross-account.
  • Use for: compliance audit needs without cross-account complexity.

SSE-KMS with customer-managed key:

  • You create the key; ~$1/key/month + per-request charges.
  • Full key policy control: cross-account, conditions, ViaService.
  • Auto rotation (yearly) opt-in.
  • Use for: multi-tenant isolation (key-per-tenant), cross-account encrypted access, regulatory compliance.

SSE-C (Customer-Supplied Key):

  • Caller provides the encryption key in every PUT/GET request (HTTPS only).
  • AWS doesn't store the key — caller responsible for key management.
  • No KMS API costs (KMS is bypassed entirely).
  • No CloudTrail of key use.
  • Use for: rare scenarios where customer MUST hold the key entirely outside AWS.

DSSE-KMS (Dual-layer SSE-KMS):

  • Each object encrypted twice with two independent KMS calls.
  • ~2× KMS request cost.
  • Required for FedRAMP High workloads.
  • Use for: government / defense workloads with explicit dual-layer requirement.

Decision pattern:

  • 'Default encryption / public marketing content' → SSE-S3 (auto-on).
  • 'Compliance audit / who decrypted what' → SSE-KMS (any flavour).
  • 'Cross-account encrypted access' → SSE-KMS with customer-managed key.
  • 'Multi-tenant data isolation' → SSE-KMS with separate customer-managed key per tenant.
  • 'FedRAMP High / dual-layer' → DSSE-KMS.
  • 'Customer must hold the key' → SSE-C.

Bucket-level enforcement — combine with a bucket policy denying non-encrypted uploads:

{
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::our-bucket/*",
  "Condition": {
    "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" }
  }
}

This denies any PUT that doesn't specify SSE-KMS — guarantees no plaintext ever lands in the bucket.

ACM certificate provisioning: DNS vs email validation, auto-renewal lifecycle

AWS Certificate Manager (ACM) issues free TLS/SSL certificates for AWS services. The exam tests when ACM works, where the certificate must live, and how validation + renewal happen.

Where ACM-issued certificates can be used:

  • CloudFront — certificate MUST be in us-east-1 (regardless of where your origin is).
  • ALB / NLB / API Gateway / App Runner — certificate must be in the SAME region as the resource.
  • Route 53 — used for ACM-issued certs validated via DNS in the hosted zone.

Issuance and validation:

  1. Request certificate: list domain names (FQDN + optional wildcards like *.example.com).
  2. Pick validation method:
    • DNS validation (preferred): ACM gives you a CNAME record to add to your domain's DNS. Once propagated, ACM auto-validates and issues. Auto-renewal happens automatically every year as long as the CNAME stays in place.
    • Email validation: ACM sends approval emails to standard addresses (admin@, hostmaster@, webmaster@) for the domain. Requires manual click to approve, every renewal (every year). Don't use unless you have to.
  3. Certificate issued → install on the AWS resource.

Auto-renewal:

  • DNS-validated certificates renew automatically 60 days before expiry. ACM checks the CNAME, validates, reissues. Zero downtime if the certificate is attached to a managed AWS resource (CloudFront, ALB).
  • Email-validated certificates DON'T auto-renew — you must respond to a new email approval every year. Exam common trap: 'why did my ALB stop accepting HTTPS?' → email validation expired.

Private CA (ACM Private CA):

  • ACM also offers a managed private CA for internal certificates (services that talk to each other internally over TLS).
  • ~$400/month per CA hierarchy + per-certificate fee.
  • Used for mutual-TLS (mTLS) on internal services.

Importing third-party certificates:

  • You can import certs from external CAs (DigiCert, Let's Encrypt, etc.). Stored in ACM, usable on AWS services.
  • Imported certs DON'T auto-renew — you must re-import the renewed cert. ACM sends expiry notifications via CloudWatch.

Public vs private certificates:

  • ACM public certs (from Amazon Trust Services) are trusted by browsers worldwide. Free.
  • ACM private certs (from your ACM Private CA) are trusted only by clients that trust the private CA. For internal mTLS.

Exam patterns:

  • 'CloudFront with custom domain' → ACM cert in us-east-1.
  • 'ALB HTTPS in us-west-2' → ACM cert in us-west-2.
  • 'Internal microservices mTLS' → ACM Private CA + per-service private certs.
  • 'Imported cert from Let's Encrypt' → no auto-renewal; CloudWatch alarm on expiry.

Block Public Access semantics: account vs bucket vs object level overrides

S3 Block Public Access (BPA) is the strongest defense against accidental public bucket exposure. It applies at three levels and uses an explicit override hierarchy.

Four settings, each toggle-able:

  1. BlockPublicAcls — prevents new public ACLs from being applied. Existing public ACLs remain (unless setting #2 is also on).
  2. IgnorePublicAcls — ignores all public ACLs (existing or new). The bucket / object isn't removed; ACLs are just not honored.
  3. BlockPublicPolicy — prevents new bucket policies that grant public access.
  4. RestrictPublicBuckets — even if a bucket policy somehow grants public access, only AWS principals + AWS services can access; anonymous internet requests are blocked.

Level hierarchy (most restrictive wins):

  1. Organization level (S3 Block Public Access at the Organizations level) — applies to every account in every member account. Cannot be overridden by member account admins.
  2. Account level — per-account setting. Overrides bucket-level if more restrictive.
  3. Bucket level — per-bucket setting. Applies to that bucket only.
  4. Object level — individual object ACLs (still subject to all the above).

Trap the exam loves: a bucket policy that allows s3:GetObject from "Principal": "*" and BPA is on at the account level. Outcome: BPA wins; bucket is not public. The policy is evaluated but the public-access result is suppressed by BPA. This is correct — BPA was designed exactly to override misconfigurations.

Organization-wide enforcement pattern:

To enforce 'no S3 bucket can ever be public anywhere in our Organization':

  1. AWS Organizations → S3 BPA at root level → all four settings enabled.
  2. Optional SCP at root denying s3:PutPublicAccessBlock so member account admins can't disable BPA.
  3. AWS Config rule s3-bucket-public-access-prohibited to detect any drift.

When to disable BPA: only for intentional public static-website hosting. Even then, prefer CloudFront in front of a private bucket (with Origin Access Control) to expose content while keeping the bucket itself private.

SCPs vs BPA: SCPs can deny S3 actions (PutBucketPolicy, PutObjectAcl) but cannot inspect bucket policy content. BPA inspects content — it's the only way to enforce 'no public exposure' regardless of how a bucket policy is written. The exam answer for organizational guarantee is BPA at the org level, not SCP.

Macie job tuning: managed identifiers vs custom regex, cost-control patterns

Amazon Macie scans S3 buckets for PII, PHI, financial data, and credentials. It's S3-only — no other data sources. Cost is per-GB scanned + per-object analyzed; petabyte-scale buckets are expensive to scan fully.

Two finding types:

  1. Policy findings — public buckets, unencrypted buckets, ACL grants to anonymous. Discovered continuously, free.
  2. Sensitive data findings — actual PII detected in objects. Requires running a discovery job; costs per GB.

Managed identifiers (built-in regex + dictionary patterns):

  • PII: Social Security numbers (US), passport numbers (many countries), driver's licenses, credit card numbers, IBANs, bank account numbers.
  • PHI: medical record numbers, NPI, diagnosis codes.
  • Credentials: AWS access keys, OAuth tokens, SSH keys, X.509 private keys.
  • Country-specific: tax IDs, national IDs for ~30+ countries.

Managed identifiers are accurate (high precision, low false-positive rate). Use them by default.

Custom data identifiers — your own regex + keywords:

Regex: ^[A-Z]{2}\d{6}$  (e.g. employee ID format)
Keywords: ["employee", "emp_id"]
Maximum match distance: 50 characters
Ignore words: ["test", "sample"]

Use for: company-specific identifiers (employee IDs, internal codes), regulated data formats unique to your domain.

Cost-control patterns:

  1. Bucket inclusions / exclusions: scope a job to specific buckets only. Don't scan obvious-non-PII buckets (build artifacts, log archives older than 90 days).
  2. Object filtering: include only specific file extensions / prefixes / tags. E.g. scan only s3://uploads/ prefix where users put data, not s3://thumbnails/.
  3. Sampling depth: Macie samples a percentage of objects rather than scanning every one. Set sampling depth to balance cost vs coverage.
  4. One-time vs scheduled jobs: full one-time scan after migration; then monthly incremental scans on critical buckets.
  5. Findings aggregation: route Macie findings to Security Hub via EventBridge for cross-account visibility.

Multi-account deployment:

  • Enable Macie at the Organizations level via the delegated administrator account.
  • Designate one account (typically security tooling account) as the Macie administrator; it gets visibility into all member accounts' findings.

Common exam scenario:

'After migration, audit S3 buckets across all accounts for PII without disrupting workloads' → Macie via Organizations + delegated administrator + one-time discovery job + scope to migration buckets + custom data identifier for company-specific employee IDs.

CloudHSM cluster setup: cross-AZ, client SDK, key replication

AWS CloudHSM provides dedicated, FIPS 140-2 Level 3 validated Hardware Security Modules in your VPC. You control the keys entirely; AWS provides the hardware. Required for workloads with strict regulatory requirements like 'must store keys in a dedicated HSM', FedRAMP Moderate/High with HSM mandate, or government/defense.

Cluster topology:

A CloudHSM cluster = 1+ HSM instances in your VPC. Each HSM is ~$1.45/hr = ~$1 000/month. For production HA, run 2+ HSMs in different AZs (otherwise AZ failure = key loss).

Keys are replicated synchronously across HSMs in the same cluster. Operations are load-balanced.

Setup steps (mechanical, but the exam may test the sequence):

  1. Create cluster — choose VPC + 2+ subnets in different AZs.
  2. Initialize cluster — generate the cluster's CA certificate; sign it.
  3. Activate HSMs — set the Crypto Officer (CO) credentials. CO administrates the HSM; can't perform crypto operations (separation of duties).
  4. Create Crypto Users (CU) — application identities that do encrypt/decrypt/sign/verify. Each CU has its own keys.
  5. Connect clients — install the CloudHSM Client SDK on EC2 instances, configure cluster endpoint, authenticate as a CU.

Client SDK options:

  • PKCS #11 — standard cryptographic API; works with most languages.
  • JCE (Java Cryptography Extension) — Java apps.
  • CNG (Cryptography Next Generation) — Windows / .NET.
  • OpenSSL Dynamic Engine — for apps using OpenSSL APIs.

Common integration patterns:

  1. TLS offload: nginx/Apache uses CloudHSM via OpenSSL engine to sign TLS handshakes. Private key never leaves the HSM.
  2. Code signing: build pipeline signs releases with a CloudHSM-stored signing key. Compliance-required for signed software.
  3. Database encryption: Oracle TDE / SQL Server TDE encrypts at the database engine layer using CloudHSM-stored keys.
  4. Custom AWS KMS Custom Key Store: bridge CloudHSM + KMS — KMS API on top of HSM-stored keys. Lets AWS services (S3, EBS) use HSM-backed keys transparently while you retain key custody.

Backup:

CloudHSM auto-backs up the cluster to S3 (encrypted, AWS-managed). Backups are tied to your cluster's CA certificate — restoring requires the original CA.

vs KMS:

  • KMS = FIPS 140-2 Level 2 (Level 3 for some operations); shared-tenancy under the hood; AWS controls the hardware. Cheaper, simpler.
  • CloudHSM = FIPS 140-2 Level 3; single-tenant hardware in YOUR VPC; you control. Required only when the spec explicitly mandates HSM custody.

Exam triggers for CloudHSM:

  • 'FIPS 140-2 Level 3' → CloudHSM.
  • 'Customer must control key material entirely' → CloudHSM (or imported key material in KMS, depending on context).
  • 'Dedicated hardware' → CloudHSM.
  • Otherwise → KMS is the default.

S3 server-side encryption options

TypeKey custodyPer-request costAuditable in CloudTrailUse when
SSE-S3AWS-managedNoNoDefault; non-sensitive data
SSE-KMS (AWS-managed key)AWS-managedYes (KMS request)YesCompliance audit needs
SSE-KMS (customer-managed key)You manage policy + rotationYesYesMulti-tenant or fine-grained access
SSE-CYou provide key per requestNo KMS costNoRare; specific compliance needs
DSSE-KMSAWS + customerYes (2x KMS)YesDefense-in-depth dual layer (FedRAMP High)

Decision tree

FIPS 140-2 Level 3 / dedicated HSM?YesNoCloudHSM(hourly per HSM,cluster across AZs)Need key policy / rotation control?YesNoCustomer-managed KMS($1/key/mo + per-request,full audit + cross-account)AWS-managed(free, opaquekey policy)Multi-region replication?YesMulti-Region KMS Key(replicated; same key ID region-to-region)NoFedRAMP High?→ DSSE-KMS (2× cost, dual layer)

Sharp facts the exam loves — give these one last read before exam day.

Cheat sheet

Sharp facts the exam loves — scan these before test day.

Encrypt by default — at rest AND in transit

Compliance (HIPAA, PCI, GDPR) requires both: SSE or KMS at rest, TLS in transit. S3 default encryption is SSE-S3 since Jan 2023; enable bucket policy that requires aws:SecureTransport=true to enforce TLS for clients.

2 questions test this
KMS four-tier hierarchy: AWS-owned → AWS-managed → customer-managed → CloudHSM

AWS-owned: free, no visibility. AWS-managed: free, audit trail. Customer-managed: ~$1/key/month + per-request, full control + cross-account share + rotation. CloudHSM: dedicated FIPS 140-2 Level 3, highest cost.

4 questions test this
Bucket-level controls before object-level

Block Public Access at account + bucket level kills ACL footguns. Default encryption applies to all objects. Object-level ACLs and per-object policies should be the exception, not the pattern — they're hard to audit at scale.

3 questions test this
Macie discovers + classifies S3 PII / PHI

Macie scans S3 buckets for PII, PHI, financial data, and credentials using managed identifiers + custom regex. Findings route via EventBridge for auto-remediation. Cost is ~$1/GB scanned — scope by bucket selectively, not org-wide blind.

10 questions test this
S3 default encryption is SSE-S3, on by default since Jan 2023

Every new S3 bucket gets SSE-S3 enabled automatically[1]. You can upgrade to SSE-KMS at any time. Pre-2023 buckets may still be unencrypted — audit with AWS Config rule s3-bucket-server-side-encryption-enabled.

KMS automatic rotation: yearly (CMKs only)

Customer-managed KMS keys support automatic yearly rotation[18] — opt-in via EnableKeyRotation API. AWS-managed keys rotate every year automatically with no opt-in. Imported key material doesn't auto-rotate; you must re-import.

2 questions test this
KMS deletion has a 7–30 day pending window

ScheduleKeyDeletion[19] requires a 7–30 day waiting period — there's no instant delete. Within that window, you can CancelKeyDeletion. Use for accidental-deletion protection. CloudHSM, by contrast, allows immediate key destruction.

Macie cost: ~$1/GB scanned + per-object analysis

Initial discovery scan can be expensive on petabyte-scale buckets. Common pattern: full scan once after migration, then scheduled monthly scans on critical buckets only. Use excludes[15] filters to skip large non-sensitive prefixes.

2 questions test this
KMS grants vs key policies — use grants for ephemeral access

Key policies are static — edit them and you change permanent permissions. Grants[20] are temporary, programmatic permissions issued via kms:CreateGrant — perfect for short-lived workloads that need temporary access to a key. AWS services (e.g. RDS encryption) create grants automatically.

4 questions test this
KMS ViaService condition restricts a key to one service

Add Condition: { StringEquals: { kms:ViaService: "s3.us-east-1.amazonaws.com" } }[21] to a key policy → that key can only be used via S3 in us-east-1. Defense against credentials being misused to decrypt the key elsewhere.

6 questions test this
S3 Object Lock: write-once compliance retention

Two modes: Governance (admin can override) vs Compliance (no one, not even root, can shorten retention or delete during the window). Required for SEC 17a-4(f) / FINRA / CFTC compliance[22]. Set per-object or via default retention policy on the bucket. Versioning must be on.

ACM certificate for CloudFront must be in us-east-1

AWS Certificate Manager certificates used with Amazon CloudFront must be requested or imported in the US East (N. Virginia) Region (us-east-1), regardless of where the origin or end users are located. CloudFront is a global service, and certificates in us-east-1 are automatically distributed to all edge locations configured for the distribution. A certificate in any other region will not appear in the CloudFront console.

11 questions test this
S3 Object Ownership — Bucket owner enforced disables ACLs

Setting S3 Object Ownership to Bucket owner enforced disables all ACLs on the bucket and makes the bucket owner the automatic owner of every object, including objects uploaded by other AWS accounts. Access is then controlled exclusively through bucket policies and IAM policies. This is the AWS-recommended default for new buckets and resolves cross-account upload scenarios where the uploader would otherwise retain object ownership.

11 questions test this
S3 Block Public Access at org level overrides account and bucket settings

S3 Block Public Access can be enforced at the AWS Organizations level by attaching the policy at the root or OU. This setting propagates to all member accounts, including newly joined accounts, and overrides account-level and bucket-level Block Public Access settings. Individual account administrators cannot remove it. To allow a specific account to host a public bucket, the org administrator must exclude that account from the policy.

6 questions test this
S3 Bucket Keys reduce SSE-KMS request costs by up to 99%

When S3 Bucket Keys are enabled on a bucket configured with SSE-KMS, AWS KMS generates a bucket-level key that S3 uses to create data keys for individual objects, dramatically reducing the number of direct calls to AWS KMS. This can cut KMS request costs by up to 99% on high-traffic buckets while keeping all objects encrypted with the customer managed key.

6 questions test this
Cross-account KMS access requires both a key policy and an IAM policy

Granting cross-account access to a customer managed KMS key requires two configurations: the key policy in the key-owning account must grant permissions to the external account (or specific principal), and an IAM policy in the external account must explicitly allow the principals to use that specific key ARN. The key policy determines who can have access; the IAM policy determines who does have access. Neither alone is sufficient.

8 questions test this
S3 Batch Operations re-encrypts existing objects in place

Changing a bucket's default encryption configuration only affects newly uploaded objects; existing objects retain their original encryption. To re-encrypt billions of existing objects with a new SSE-KMS customer managed key, use S3 Batch Operations with the Copy operation, which copies objects back to the same bucket while applying the new encryption settings.

4 questions test this
KMS keys are Region-specific — cross-Region replicas need a key in the target Region

AWS KMS keys are Regional resources and cannot be used across AWS Regions. When creating an encrypted cross-Region RDS read replica, you must specify a customer managed key (or AWS managed key) that exists in the destination Region. Similarly, an S3 bucket can only use a KMS key from the same Region for SSE-KMS encryption.

5 questions test this
Macie delegated admin manages org-wide discovery without using the management account

In an AWS Organizations environment, the management account designates a dedicated security account as the Macie delegated administrator. The delegated administrator can enable Macie in member accounts, run sensitive data discovery jobs across the organization, and aggregate findings centrally. AWS best practice is to use a separate security account rather than the management account for day-to-day Macie operations. Automated sensitive data discovery uses sampling to assign sensitivity scores to every S3 bucket, providing broad visibility cost-efficiently.

6 questions test this
CloudFront SNI-only SSL is cost-free and supports all modern browsers

Server Name Indication (SNI) allows CloudFront to serve HTTPS requests with custom SSL certificates without requiring a dedicated IP address per certificate, incurring no additional monthly charge. All modern browsers released after 2010 support SNI. The alternative, Dedicated IP SSL, incurs an additional monthly fee per distribution and is only needed for legacy clients that do not support SNI.

6 questions test this
Set Origin Protocol Policy to HTTPS Only and minimum TLS 1.2 for encrypted CloudFront-to-origin traffic

To enforce HTTPS between CloudFront and a custom origin, set the Origin Protocol Policy to HTTPS Only and configure the minimum origin SSL protocol to TLSv1.2. CloudFront returns HTTP 502 (Bad Gateway) if the origin presents a self-signed certificate or an untrusted certificate chain when HTTPS Only is active — the origin certificate must be signed by a trusted CA.

3 questions test this
SSE-KMS upload requires kms:GenerateDataKey; download requires kms:Decrypt

When uploading objects to an S3 bucket configured with SSE-KMS, Amazon S3 calls AWS KMS to generate a data key, requiring kms:GenerateDataKey on the key. When downloading, S3 must decrypt the data key, requiring kms:Decrypt. Both permissions are needed for an application that both uploads and downloads. An IAM policy missing either permission will cause the corresponding S3 operation to fail with an AccessDenied error.

6 questions test this
Cross-account Secrets Manager access requires a resource policy on the secret AND KMS key policy

Accessing a Secrets Manager secret from a different AWS account requires both a resource-based policy on the secret (granting secretsmanager:GetSecretValue) and a key policy on the encrypting KMS key (granting kms:Decrypt). The AWS managed key aws/secretsmanager cannot be used for cross-account access because its key policy cannot be modified; a customer managed key is required.

8 questions test this
Use kms:EncryptionContext:SecretARN to scope Lambda rotation function's KMS decrypt to one secret

When a Secrets Manager secret is encrypted with a customer managed KMS key, the Lambda rotation function's execution role needs kms:Decrypt on that key. Adding a condition using the kms:EncryptionContext:SecretARN key restricts the function to decrypt only the specific secret it is authorized to rotate, following least-privilege. Without this condition, a single KMS permission would allow decryption of any secret encrypted with the same key.

5 questions test this
VPC endpoints can use endpoint policies to scope allowed actions

An Interface or Gateway endpoint can carry its own endpoint policy[23] restricting which API actions and resources are allowed through it. Common pattern: S3 Gateway endpoint allows s3:GetObject on your specific buckets only — anything else through the endpoint is denied.

Also tested in

References

  1. Amazon S3 default encryption now SSE-S3 (AWS News Blog, Jan 2023) Blog
  2. Specifying server-side encryption with AWS KMS (SSE-KMS)
  3. Protecting data using server-side encryption with customer-provided keys (SSE-C)
  4. Using dual-layer server-side encryption with AWS KMS keys (DSSE-KMS)
  5. AWS Certificate Manager User Guide
  6. AWS KMS concepts (key types)
  7. AWS KMS pricing
  8. AWS CloudHSM introduction
  9. Getting started with AWS CloudHSM
  10. AWS KMS multi-region keys overview
  11. Blocking public access to S3 storage
  12. Setting default server-side encryption for an S3 bucket
  13. Controlling ownership of objects (Object Ownership)
  14. What is Amazon Macie
  15. Macie sensitive-data discovery jobs
  16. What is AWS Security Hub
  17. Amazon Macie pricing
  18. Rotating AWS KMS keys
  19. Deleting AWS KMS keys
  20. Using grants in AWS KMS
  21. AWS KMS policy conditions (kms:ViaService)
  22. Locking S3 objects (Object Lock)
  23. https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html