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 policyAWS 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 callsKMS 密钥策略和授权
每个 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.binKMS 密钥轮换
密钥轮换是一项安全最佳实践,会定期替换加密密钥材料,从而在密钥遭到泄露时缩短暴露窗口。对于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/xxxEBS 和 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 policyKMS 跨账户访问
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 反馈 — 无需本地设置。
此课程中的所有课时
- KMS、ACM 与加密模式
- GuardDuty、Inspector 与 Macie
- Secrets Manager 与 Parameter Store
- WAF、Shield 与 Network Firewall