安全架构场景
练习 IAM 最小权限、加密、VPC 隔离以及 WAF/Shield 相关的场景题,巩固安全领域知识
安全架构场景 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
场景 1:遵循最小权限原则访问 EC2 和 S3
场景:一个 EC2 实例运行着一个 Web 应用程序,需要从特定的 S3 存储桶读取对象。安全团队要求实例上不得存储任何长期凭证,并且访问必须遵循最小权限原则。解决方案:创建一个IAM 角色,并通过策略仅允许对特定存储桶 ARN 执行 s3:GetObject。将该角色作为实例配置文件附加到 EC2 实例。应用程序使用实例元数据服务(IMDS)自动获取临时凭证——无需存储密钥。
# IAM policy for least-privilege EC2 -> S3 read
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Action': ['s3:GetObject'],
'Resource': 'arn:aws:s3:::my-app-bucket/*'
}]
}
# Attach role to EC2 instance
aws ec2 associate-iam-instance-profile \
--instance-id i-1234567890abcdef0 \
--iam-instance-profile Name=EC2S3ReadRole场景 2:加密 RDS 数据库中的数据
场景:一家公司将客户 PII 存储在 RDS PostgreSQL 数据库中。合规团队要求启用静态加密,并能够审计密钥使用情况。解决方案:使用 AWS KMS 和客户托管密钥(CMK)启用RDS 加密。CMK 允许安全团队控制密钥轮换、在 CloudTrail 中查看密钥使用情况,并在需要时撤销访问权限。注意:必须在创建 RDS 实例时启用加密——无法直接对现有的未加密 RDS 实例进行原地加密。要加密现有数据库,请先创建快照,再复制快照并启用加密,最后从加密快照恢复。
# Create an encrypted RDS instance
aws rds create-db-instance \
--db-instance-identifier prod-postgres \
--db-instance-class db.t3.medium \
--engine postgres \
--master-username admin \
--master-user-password SecurePass123! \
--storage-encrypted \
--kms-key-id arn:aws:kms:us-east-1:123456789012:key/mrk-abc123 \
--allocated-storage 100场景 3:S3 存储桶——阻止公共访问
场景:某位开发人员意外地将 S3 存储桶设为公共,导致客户数据暴露。安全团队希望确保账户中的任何 S3 存储桶都无法被设为公共,即使开发人员尝试这样做也不行。解决方案:在账户级别启用 S3 Block Public Access。无论各个团队如何配置,它都会覆盖授予公共访问权限的任何存储桶级策略或 ACL。再结合 AWS Config 规则(s3-bucket-public-read-prohibited),持续检测并告警任何不合规的存储桶。
# Block all public access at account level
aws s3control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration \
'BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true'
# Deploy Config rule to detect violations
aws configservice put-config-rule \
--config-rule '{"ConfigRuleName": "s3-bucket-public-read-prohibited", "Source": {"Owner": "AWS", "SourceIdentifier": "S3_BUCKET_PUBLIC_READ_PROHIBITED"}}'场景 4:数据库层的 VPC 隔离
场景:一家公司希望确保其 RDS 数据库只能从应用程序服务器访问,而不能从 Internet 访问。解决方案:将 RDS 放置在私有子网中,并且不配置 Internet 网关路由。为 RDS 创建一个安全组,仅允许应用程序服务器安全组通过 5432 端口(PostgreSQL)入站,而不是允许任何 IP 地址范围。这样,即使某个应用程序服务器遭到入侵,攻击者也无法从 VPC 外部访问数据库;同时,安全组规则也会限制横向移动。
# Create RDS security group allowing only the app tier SG as source
aws ec2 create-security-group \
--group-name rds-sg \
--description 'RDS security group' \
--vpc-id vpc-abc123
aws ec2 authorize-security-group-ingress \
--group-id sg-rds \
--protocol tcp \
--port 5432 \
--source-group sg-app # app tier security group ID only场景 5:轮换数据库凭证
场景:应用程序代码目前将数据库凭证硬编码在配置文件中。安全审计将其标记为严重风险。解决方案:将凭证存储在 AWS Secrets Manager 中,并配置自动轮换(Secrets Manager 为 RDS 提供内置的 Lambda 轮换函数)。更新应用程序,使其在运行时使用 SDK 从 Secrets Manager 获取凭证。每次轮换时,应用程序都会自动获得新凭证,无需重新部署。启用 RDS 密钥轮换模板,以实现完全托管且零停机的凭证轮换。
# Store RDS credentials in Secrets Manager
aws secretsmanager create-secret \
--name prod/myapp/rds \
--secret-string '{"username":"admin","password":"OldPass123!","host":"rds-endpoint.amazonaws.com","port":5432}'
# Enable automatic rotation every 30 days
aws secretsmanager rotate-secret \
--secret-id prod/myapp/rds \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSPostgreSQLRotationSingleUser \
--rotation-rules AutomaticallyAfterDays=30场景 6:检测异常 API 活动
场景:一家公司希望检测 AWS 账户凭证是否遭到泄露,以及这些凭证是否从异常位置被使用。解决方案:在所有 Region 中启用 Amazon GuardDuty。GuardDuty 使用机器学习分析 CloudTrail 事件、VPC Flow Logs 和 DNS 日志,以检测异常行为:来自异常地理位置的 API 调用、EC2 上的比特币挖矿模式、与 Tor 出口节点的通信,或凭证外泄模式。GuardDuty 会生成 Finding,这些 Finding 可以触发 EventBridge 规则,通过 SNS 自动通知安全团队或创建支持工单。
# Enable GuardDuty in a Region
aws guardduty create-detector \
--enable \
--finding-publishing-frequency FIFTEEN_MINUTES
# EventBridge rule to react to GuardDuty HIGH severity findings
aws events put-rule \
--name guardduty-high-severity \
--event-pattern '{
"source": ["aws.guardduty"],
"detail-type": ["GuardDuty Finding"],
"detail": {"severity": [{"numeric": [">=", 7]}]}
}'场景 7:使用 WAF 阻止恶意请求
场景:位于 ALB 后面的 Web 应用程序遭受 SQL 注入攻击。应用程序暂时无法修改。解决方案:将 AWS WAF 与 ALB 关联。部署包含预构建 SQL 注入检测功能的AWS Managed Rules for Common Threats规则组(Core Rule Set + SQL Database 规则组)。WAF 会在 HTTP 请求到达 ALB 之前进行检查,并阻止匹配攻击模式的请求——无需修改应用程序代码。同时启用 WAF logging,将日志发送到 Kinesis Firehose 进行安全分析。
# Create WAF Web ACL with SQL injection protection
aws wafv2 create-web-acl \
--name AppProtection \
--scope REGIONAL \
--default-action Allow={} \
--rules '[{
"Name": "AWSManagedRulesSQLiRuleSet",
"Priority": 1,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesSQLiRuleSet"
}
},
"OverrideAction": {"None": {}},
"VisibilityConfig": {"SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "SQLi"}
}]' \
--region us-east-1场景 8:跨账户 AssumeRole
场景:中央安全账户需要对 AWS Organisation 中的所有工作负载账户拥有只读访问权限,以执行安全审计。解决方案:在每个工作负载账户中创建一个IAM 角色,并设置 Trust policy,允许安全账户(通过账户 ID)AssumeRole。附加只读策略(例如 SecurityAudit AWS 托管策略)。中央账户中的安全团队使用 STS AssumeRole,临时获得每个工作负载账户中的角色权限。这遵循最小权限原则——不会在工作负载账户中创建永久 IAM 用户。
# Trust policy in workload account (allows security account to assume role)
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Principal': {
'AWS': 'arn:aws:iam::SECURITY_ACCOUNT_ID:root'
},
'Action': 'sts:AssumeRole'
}]
}
# From security account: assume role in workload account
aws sts assume-role \
--role-arn arn:aws:iam::WORKLOAD_ACCOUNT_ID:role/SecurityAuditRole \
--role-session-name audit-2024-01场景 9:使用 SCP 限制操作
场景:一家公司使用 AWS Organizations,并希望阻止非生产 OU 中的任何账户启动昂贵的 GPU 实例。解决方案:创建一个Service Control Policy(SCP),拒绝对 GPU 实例系列(p3、p4、g4、g5)执行 ec2:RunInstances,并将其附加到非生产 OU。SCP 对成员账户中的 root 用户和 Administrator 级别 IAM 用户同样生效——它们充当任何身份都无法绕过的防护栏。这样可以防止开发和测试账户产生意外或恶意的大额支出。
# SCP to deny GPU instance types in non-prod OU
{
'Version': '2012-10-17',
'Statement': [{
'Sid': 'DenyGPUInstances',
'Effect': 'Deny',
'Action': 'ec2:RunInstances',
'Resource': 'arn:aws:ec2:*:*:instance/*',
'Condition': {
'StringLike': {
'ec2:InstanceType': ['p3.*', 'p4d.*', 'g4.*', 'g5.*']
}
}
}]
}场景 10:用于合规审计的审计轨迹
场景:一家金融服务公司必须向审计人员证明,所有 AWS API 调用都已记录、防篡改并保留 7 年。解决方案:创建一个多区域 AWS CloudTrail 追踪,将日志传送到 logging 账户中的专用 S3 存储桶。启用日志文件完整性验证(用于检测日志篡改的加密摘要文件)。在 logging 存储桶上设置 S3 Object Lock 策略,使用 Compliance 模式并将保留期限设为 7 年。这样可以确保在规定的保留期限内,日志无法被删除或修改——即使是 root 用户也无法操作。
# Create multi-region trail with integrity validation
aws cloudtrail create-trail \
--name compliance-trail \
--s3-bucket-name central-audit-logs-123 \
--is-multi-region-trail \
--enable-log-file-validation \
--include-global-service-events
aws cloudtrail start-logging --name compliance-trail场景 11:用于私有 S3 访问的 VPC Endpoint
场景:私有 VPC 中的 EC2 实例需要访问 S3,同时流量不能经过公共 Internet。目前使用 NAT Gateway,但由于 NAT Gateway 数据处理费用较高,成本很高。解决方案:创建一个S3 Gateway VPC Endpoint。在私有子网的路由表中添加路由条目,将 S3 前缀列表指向该 Endpoint。现在,发往 S3 的流量完全停留在 AWS 网络骨干中——无需 NAT Gateway,也无需 Internet 网关。S3 Gateway Endpoint免费(不同于按每小时、每个 AZ 收费的 Interface Endpoint)。这还通过将 S3 访问从公共 Internet 路径中移除,提升了安全性。
# Create S3 Gateway VPC Endpoint
aws ec2 create-vpc-endpoint \
--vpc-id vpc-abc123 \
--service-name com.amazonaws.us-east-1.s3 \
--route-table-ids rtb-private-1a rtb-private-1b
# Result: route table automatically gets a route:
# Destination: pl-63a5400a (S3 prefix list)
# Target: vpce-xyz456 (the Gateway Endpoint)
# EC2 instances now reach S3 privately at no endpoint cost快速检查
测试您对本课 AWS Solutions Architect (SAA-C03) 概念的理解。
课程回顾
本课通过以下场景进行了练习:使用 IAM 角色和实例配置文件实现无需凭证的 EC2 访问、使用 Secrets Manager 自动轮换数据库凭证、使用 AWS WAF 在不修改代码的情况下阻止注入攻击,以及结合 CloudTrail 和 S3 Object Lock 实现防篡改的合规日志。接下来我们将学习具有弹性和高可用性的架构场景。
常见问题解答
「安全架构场景」课时是免费的吗?
是的 — 「安全架构场景」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「安全架构场景」这节课中我会学到什么?
练习 IAM 最小权限、加密、VPC 隔离以及 WAF/Shield 相关的场景题,巩固安全领域知识 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「安全架构场景」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。