设计AWS云架构方案实现基于AWS Endpoint Security(EPS)与AWS服务深度集成,结合AWS CLI或管理控制台,EPS与VPC安全组、网络ACL联动,实现网络层与终端层的协同防御。例如,当EPS检测到某实例被入侵时,可通过API自动调整安全组规则,限制其出站流量,以及具体实现的详细步骤和关键代码。
通过此方案,可实现终端层与网络层的实时联动防御,提升AWS环境的安全性。
架构设计概述
- 检测层:使用Amazon GuardDuty监控EC2实例的安全事件。
- 事件触发:通过Amazon EventBridge捕获GuardDuty事件并触发Lambda函数。
- 响应层:Lambda函数自动修改安全组规则限制受感染实例的出站流量,可选联动网络ACL。
- 恢复机制:记录原始安全组配置,支持手动或自动恢复。
详细步骤
1. 启用Amazon GuardDuty
- 在AWS控制台启用GuardDuty,并配置检测规则(默认已包含常见威胁检测)。
2. 创建EventBridge规则监听GuardDuty事件
- 规则名称:
guardduty-to-lambda
- 事件模式:
{ "source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"], "detail": { "severity": [7, 8, 8.9, 9], // 高严重性事件 "resource": {"resourceType": ["Instance"]} } }
- 目标:选择后续创建的Lambda函数。
3. 创建Lambda函数处理事件
- Runtime: Python 3.9+
- IAM角色:附加以下权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:CreateSecurityGroup", "ec2:AuthorizeSecurityGroupIngress", "ec2:RevokeSecurityGroupEgress", "ec2:ModifyInstanceAttribute", "ec2:DescribeInstances" ], "Resource": "*" } ] }
4. Lambda函数代码
import boto3
def lambda_handler(event, context):
# 解析事件中的实例ID
instance_id = event['detail']['resource']['instanceDetails']['instanceId']
ec2 = boto3.resource('ec2')
instance = ec2.Instance(instance_id)
# 获取实例的私有IP(用于网络ACL可选步骤)
private_ip = instance.private_ip_address
# 创建隔离安全组,仅允许管理员SSH访问
ec2_client = boto3.client('ec2')
isolated_sg = ec2_client.create_security_group(
GroupName='Isolated_SG',
Description='Restrict all outbound traffic',
VpcId=instance.vpc_id
)
sg_id = isolated_sg['GroupId']
# 添加入站规则:允许管理员IP访问SSH
ec2_client.authorize_security_group_ingress(
GroupId=sg_id,
IpPermissions=[{
'IpProtocol': 'tcp',
'FromPort': 22,
'ToPort': 22,
'IpRanges': [{'CidrIp': 'YOUR_ADMIN_IP/32'}]
}]
)
# 移除默认出站规则并拒绝所有出站
ec2_client.revoke_security_group_egress(
GroupId=sg_id,
IpPermissions=[{'IpProtocol': '-1', 'IpRanges': [{'CidrIp': '0.0.0.0/0'}]}]
)
# 将实例关联到新安全组
instance.modify_attribute(Groups=[sg_id])
# (可选)修改网络ACL
subnet = ec2.Subnet(instance.subnet_id)
nacl_id = subnet.network_acl_id
# 添加拒绝该实例出站的ACL规则(规则号需唯一)
ec2_client.create_network_acl_entry(
NetworkAclId=nacl_id,
RuleNumber=100,
Protocol='-1',
RuleAction='deny',
Egress=True,
CidrBlock=f'{private_ip}/32'
)
return {'status': 'success'}
5. 测试与验证
- 模拟一次入侵(如触发GuardDuty的测试事件)。
- 检查Lambda日志(CloudWatch Logs),确认安全组和网络ACL被正确修改。
- 验证受感染实例的出站流量是否被阻断。
6. 恢复流程
- 手动恢复:
- 将实例重新关联原始安全组。
- 删除临时创建的隔离安全组和网络ACL条目。
- 自动恢复:可通过额外Lambda定时任务或基于GuardDuty的解决事件触发。
关键注意事项
- 规则号冲突:网络ACL的
RuleNumber
需唯一,建议使用动态生成的高位数值(如时间戳后几位)。 - 安全组默认规则:新安全组默认拒绝所有入站、允许所有出站,需显式移除出站规则。
- 跨账户支持:若GuardDuty跨账户检测,需配置EventBridge跨账户权限。