0Pricing
AWS Solutions Architect · 课时

KMS、ACM 与加密模式

使用 AWS KMS 管理加密密钥,使用 ACM 配置和轮换 TLS 证书,并在客户端加密、服务器端加密和传输加密之间进行选择

KMS、ACM 与加密模式 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

AWS 加密概览

即使存储介质遭到破坏或有人通过其他方式获得访问权限,加密这一基础安全控制仍可保护数据机密性。AWS 提供静态数据加密(用于数据库、S3 和 EBS 中存储的数据)以及传输中数据加密(用于在网络中传输的数据)。主要服务包括:AWS Key Management Service(KMS)用于管理静态数据加密密钥;AWS Certificate Manager(ACM)用于为传输中数据加密配置和管理 TLS 证书。对于 SAA-C03 的安全架构领域而言,了解何时以及如何应用这些服务至关重要。

# Encryption coverage on AWS:
# At rest (KMS):
#   S3, EBS, RDS, DynamoDB, EFS, SQS,
#   Lambda env vars, Secrets Manager, SSM Parameter Store

# In transit (ACM/TLS):
#   ALB listeners (HTTPS), API Gateway, CloudFront,
#   Direct Connect, VPN, inter-service communication

# Both:
#   S3 Server-Side Encryption + HTTPS only policy

AWS KMS:密钥管理服务

AWS KMS 是一项用于创建和控制加密密钥的完全托管服务。KMS 使用硬件安全模块(HSM)保护密钥——密钥材料永远不会以未加密形式离开 HSM。KMS 可与大多数 AWS 服务集成,以支持服务器端加密。密钥类型包括:AWS Managed Keys(免费、每年自动轮换,您无法直接控制);Customer Managed Keys(CMK)(每个每月 1 美元,您可以控制密钥轮换、密钥策略和删除)。Custom Key Store 使用您自己的 CloudHSM 集群,以满足必须使用专用 HSM 的合规要求。

# Create a Customer Managed Key (CMK)
aws kms create-key \
  --description 'Production database encryption key' \
  --key-usage ENCRYPT_DECRYPT \
  --origin AWS_KMS \
  --tags TagKey=Purpose,TagValue=RDS-Encryption

# Create an alias for the key
aws kms create-alias \
  --alias-name alias/prod-db-key \
  --target-key-id arn:aws:kms:us-east-1:123:key/abc-def

# CMK costs: $1/month + $0.03 per 10,000 API calls

KMS 密钥策略和授权

每个 KMS 密钥都有一个密钥策略——这是一种基于资源的策略,用于控制谁可以使用和管理该密钥。与基于身份的 IAM 策略不同,密钥策略是必需的:密钥策略必须明确授予访问权限,IAM 策略才能生效。最佳实践是将密钥管理(谁可以管理密钥)与密钥使用(哪些服务和角色可以加密或解密)分开。对于临时委派访问权限,请使用密钥授权——例如,可以授予 EMR 集群临时使用 KMS 密钥的权限,以便完成某项任务,而无需修改密钥策略。

# KMS key policy: grant RDS and admin access
{
  'Statement': [
    {
      'Sid': 'Enable root account full access',
      'Principal': {'AWS': 'arn:aws:iam::123:root'},
      'Action': 'kms:*',
      'Effect': 'Allow'
    },
    {
      'Sid': 'Allow RDS to use this key',
      'Principal': {'Service': 'rds.amazonaws.com'},
      'Action': ['kms:Encrypt','kms:Decrypt','kms:GenerateDataKey'],
      'Effect': 'Allow'
    }
  ]
}

KMS 信封加密

KMS 使用信封加密高效保护大量数据。您无法直接使用 KMS 密钥加密超过 4 KB 的数据。具体过程如下:KMS 生成一个数据加密密钥(DEK)——这是一个用于在本地加密实际数据的随机密钥。然后,使用 KMS 密钥(即密钥加密密钥)对 DEK 进行加密。您可以将加密后的 DEK 与加密数据一同存储。解密时,首先调用 KMS 解密 DEK,然后在本地使用明文 DEK 解密数据。S3、EBS 和 RDS 的加密机制就是以此为基础运行的。

# Generate a Data Key (for envelope encryption)
aws kms generate-data-key \
  --key-id alias/my-key \
  --key-spec AES_256

# Response contains:
# Plaintext: base64-encoded DEK (use to encrypt data locally)
# CiphertextBlob: KMS-encrypted DEK (store alongside data)

# To decrypt:
# 1. Call kms:Decrypt(CiphertextBlob) -> plaintext DEK
# 2. Use plaintext DEK to decrypt data locally
# 3. Zeroize plaintext DEK from memory
aws kms decrypt --ciphertext-blob fileb://encrypted-dek.bin

KMS 密钥轮换

密钥轮换是一项安全最佳实践,会定期替换加密密钥材料,从而在密钥遭到泄露时缩短暴露窗口。对于Customer Managed Keys,您可以启用每年自动轮换功能——KMS 会生成新的密钥材料,并将其用于新的加密操作,同时保留旧密钥材料以解密现有数据。AWS Managed Keys 每年自动轮换。导入的密钥材料不支持自动轮换(您必须手动轮换)。轮换后,新的 KMS 操作会自动使用新的密钥材料,无需修改应用。

# Enable automatic annual key rotation
aws kms enable-key-rotation \
  --key-id alias/prod-db-key

# Verify rotation is enabled
aws kms get-key-rotation-status \
  --key-id alias/prod-db-key

# Manual rotation (for imported key material):
# 1. Create a new CMK
# 2. Update all services to use new key
# 3. Re-encrypt existing data with new key
# 4. Schedule old key for deletion (minimum 7-day waiting period)

S3 服务器端加密选项

S3 支持三种服务器端加密选项:SSE-S3——S3 使用 AES-256 管理密钥,免费,但控制能力最低。SSE-KMS——使用 KMS 密钥(AWS 托管密钥或 CMK),可在 CloudTrail 中提供密钥审计记录,支持密钥策略,但每次 KMS API 调用都会产生费用。SSE-C——您在每次请求中提供并管理密钥材料;S3 永不存储该密钥。当您需要审计谁在何时使用过密钥时,请使用 SSE-KMS。对于注重简便性和成本、敏感度较低的数据,请使用 SSE-S3。您可以通过存储桶策略拒绝未加密的 PutObject,从而强制执行加密。

# Enforce SSE-KMS on all new S3 objects
aws s3api put-bucket-policy \
  --bucket my-secure-bucket \
  --policy '{
    "Statement": [{
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-secure-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        }
      }
    }]
  }'

# Set default encryption for bucket
aws s3api put-bucket-encryption \
  --bucket my-secure-bucket \
  --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/my-key"}}]}'

AWS Certificate Manager(ACM)

AWS Certificate Manager(ACM)可免费为 AWS 服务配置、管理和自动续订SSL/TLS 证书。ACM 证书可与 ALB、NLB、CloudFront、API Gateway 和 AppSync 配合使用。ACM 会自动处理证书生命周期——在证书到期前 60 天续订,并透明地部署续订后的证书。您可以为自己拥有的域名申请证书(通过 DNS 或电子邮件验证),也可以导入第三方证书。ACM 证书不可下载——它们会绑定到与之关联的 AWS 服务。

# Request a public ACM certificate
aws acm request-certificate \
  --domain-name app.example.com \
  --subject-alternative-names '*.example.com' \
  --validation-method DNS

# ACM returns a CNAME record to add to Route 53
# Add the CNAME -> ACM validates domain ownership
# Certificate is issued and auto-renews annually

# Attach to ALB listener (HTTPS:443)
aws elbv2 create-listener \
  --load-balancer-arn <ALB-ARN> \
  --protocol HTTPS --port 443 \
  --certificates CertificateArn=arn:aws:acm:us-east-1:123:certificate/abc \
  --default-actions Type=forward,TargetGroupArn=<TG-ARN>

ACM Private Certificate Authority

ACM Private CA(Certificate Authority)可让您创建完全托管的私有 CA 层次结构,为内部资源颁发证书,包括 EC2 实例、容器、内部 API 和 IoT 设备。与公有 ACM 证书(用于面向互联网的服务)不同,私有 CA 证书可以为任意内部主机名或 IP 地址颁发。Private CA 的适用场景包括:微服务之间的双向 TLS(mTLS)、基于证书的 VPN 身份验证,以及内部 PKI 的合规要求。Private CA 的费用为每个 CA 每月 400 美元,另加每张颁发证书 0.75 美元。

# Create ACM Private Certificate Authority
aws acm-pca create-certificate-authority \
  --certificate-authority-type ROOT \
  --certificate-authority-configuration '{
    "KeyAlgorithm": "RSA_2048",
    "SigningAlgorithm": "SHA256WITHRSA",
    "Subject": {
      "Country": "US",
      "Organization": "Example Corp",
      "CommonName": "Example Corp Internal CA"
    }
  }'

# Issue certificate from private CA
aws acm request-certificate \
  --domain-name internal-service.example.internal \
  --certificate-authority-arn arn:aws:acm-pca:us-east-1:123:certificate-authority/xxx

EBS 和 RDS 加密

对于 EBS 卷加密,请在创建卷时启用(或者复制已有卷,并在复制时启用加密)。卷上的所有数据(包括快照)都会使用您指定的 KMS 密钥进行加密。EBS 加密对操作系统是透明的,无需更改应用程序。对于 RDS 加密,请在创建 DB 实例时启用;您无法直接加密现有的未加密 RDS 实例。解决方法是:从未加密的实例创建加密快照,然后将其恢复为新的加密实例。EBS 和 RDS 的加密快照在复制后仍保持加密状态。

# Enable account-level EBS default encryption
aws ec2 enable-ebs-encryption-by-default
aws ec2 modify-ebs-default-kms-key-id \
  --kms-key-id alias/prod-ebs-key

# Encrypt an existing unencrypted RDS instance:
# 1. Create unencrypted snapshot
aws rds create-db-snapshot \
  --db-instance-identifier mydb \
  --db-snapshot-identifier mydb-plain-snapshot

# 2. Copy snapshot with encryption
aws rds copy-db-snapshot \
  --source-db-snapshot-identifier mydb-plain-snapshot \
  --target-db-snapshot-identifier mydb-encrypted-snapshot \
  --kms-key-id alias/prod-db-key

客户端加密与服务器端加密

对于 SAA-C03 考试而言,理解服务器端加密和客户端加密之间的区别非常重要。服务器端加密:AWS 在接收数据后进行加密,并在交付数据前解密;您的应用程序与 AWS 之间传输的是明文数据。客户端加密:您在将数据发送到 AWS 之前进行加密;AWS 只存储密文,从不接触明文。对于敏感性最高的数据,如果您无法信任云服务提供商处理明文,应使用客户端加密,例如受到严格监管的医疗记录或财务数据。

# Client-side encryption with AWS Encryption SDK
# (conceptual Python example)

# 1. Application encrypts data locally using KMS DEK
# from aws_encryption_sdk import KmsKeyProvider, encrypt

# key_provider = KmsKeyProvider(key_ids=['alias/my-key'])
# ciphertext, _ = encrypt(
#     source=b'Sensitive patient data',
#     key_provider=key_provider
# )

# 2. Send ciphertext to S3
# s3.put_object(Bucket='hipaa-data', Key='record.enc', Body=ciphertext)

# AWS only stores ciphertext - cannot decrypt without your key policy

KMS 跨账户访问

KMS 密钥可以在 AWS 账户之间共享,以支持跨账户加密场景。例如,如果账户 A 的应用程序将加密数据写入账户 B 所有的 S3 存储桶,账户 A 的 KMS 密钥必须允许账户 B 的主体使用该密钥。在账户 A 中配置 KMS key policy 以授予跨账户访问权限,然后在账户 B 中创建 IAM policy,允许相应角色使用账户 A 的密钥。这种模式常见于数据共享和多账户架构,其中由中央账户管理加密密钥。

# KMS key policy: allow cross-account access
# (in Account A's key policy)
{
  'Sid': 'Allow Account B to use this key',
  'Effect': 'Allow',
  'Principal': {
    'AWS': 'arn:aws:iam::999999999999:root'
  },
  'Action': [
    'kms:Encrypt',
    'kms:Decrypt',
    'kms:ReEncrypt*',
    'kms:GenerateDataKey*',
    'kms:DescribeKey'
  ],
  'Resource': '*'
}

# Account B IAM policy also needed to allow the role to use it

快速检查

请测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。

课程回顾

本课介绍了以下内容:KMS 使用 HSM 保护来管理加密密钥,并支持 CMK 以实现细粒度的访问控制和审计跟踪;ACM 可为 AWS 服务配置并自动续订 TLS 证书,且不收取费用;加密可以在服务器端(KMS)或客户端执行,而服务器端加密是 AWS 原生工作负载中最常见的模式。请使用拒绝未加密操作的存储桶策略来强制执行加密。接下来我们将学习 GuardDuty、Inspector 和 Macie。

常见问题解答

「KMS、ACM 与加密模式」课时是免费的吗?

是的 — 「KMS、ACM 与加密模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「KMS、ACM 与加密模式」这节课中我会学到什么?

使用 AWS KMS 管理加密密钥,使用 ACM 配置和轮换 TLS 证书,并在客户端加密、服务器端加密和传输加密之间进行选择 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「KMS、ACM 与加密模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. KMS、ACM 与加密模式
  2. GuardDuty、Inspector 与 Macie
  3. Secrets Manager 与 Parameter Store
  4. WAF、Shield 与 Network Firewall
← 返回 AWS Solutions Architect