如何通过AWS CDK禁用默认VPC默认安全组的入站出站流量
解决AWS CDK修改默认VPC默认安全组的问题
问题分析
你当前的代码是新建了一个安全组,而非修改默认VPC自带的默认安全组,所以无法达到禁用默认安全组流量的目的。默认安全组是AWS自动创建的资源,不能通过new ec2.SecurityGroup来操作,需要用CDK的引用方法获取它,再通过自定义资源修改其入站/出站规则。
实现步骤
- 引用默认VPC和默认安全组
通过Vpc.fromLookup获取默认VPC,直接利用VPC的defaultSecurityGroup属性拿到默认安全组ID,无需手动指定。 - 用自定义资源修改安全组规则
CDK的SecurityGroup构造器不支持修改现有安全组,所以要借助AWS SDK在自定义资源中调用相关API,撤销默认的入站/出站规则。
完整代码示例
import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as customResources from 'aws-cdk-lib/custom-resources'; import { Construct } from 'constructs'; export class DefaultSgFixStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // 查找默认VPC const defaultVpc = ec2.Vpc.fromLookup(this, 'DefaultVPC', { isDefault: true, }); // 获取默认安全组ID const defaultSgId = defaultVpc.defaultSecurityGroup; // 撤销默认安全组入站规则 new customResources.AwsCustomResource(this, 'RevokeDefaultSgIngress', { onCreate: { service: 'EC2', action: 'revokeSecurityGroupIngress', parameters: { GroupId: defaultSgId, IpPermissions: [{ IpProtocol: '-1', UserIdGroupPairs: [{ GroupId: defaultSgId }] }] }, physicalResourceId: customResources.PhysicalResourceId.of('RevokeDefaultSgIngress'), }, onUpdate: { service: 'EC2', action: 'revokeSecurityGroupIngress', parameters: { GroupId: defaultSgId, IpPermissions: [{ IpProtocol: '-1', UserIdGroupPairs: [{ GroupId: defaultSgId }] }] }, }, policy: customResources.AwsCustomResourcePolicy.fromSdkCalls({ resources: [defaultSgId], }), }); // 撤销默认安全组出站规则 new customResources.AwsCustomResource(this, 'RevokeDefaultSgEgress', { onCreate: { service: 'EC2', action: 'revokeSecurityGroupEgress', parameters: { GroupId: defaultSgId, IpPermissions: [{ IpProtocol: '-1', CidrIp: '0.0.0.0/0' }] }, physicalResourceId: customResources.PhysicalResourceId.of('RevokeDefaultSgEgress'), }, onUpdate: { service: 'EC2', action: 'revokeSecurityGroupEgress', parameters: { GroupId: defaultSgId, IpPermissions: [{ IpProtocol: '-1', CidrIp: '0.0.0.0/0' }] }, }, policy: customResources.AwsCustomResourcePolicy.fromSdkCalls({ resources: [defaultSgId], }), }); } }
关键说明
- 只读引用限制:
SecurityGroup.fromSecurityGroupId返回的是只读引用,无法通过CDK原生API修改规则,必须用自定义资源调用AWS SDK。 - 权限控制:代码中限制自定义资源仅能操作目标默认安全组,比开放所有资源权限更安全。
- 合规适配:修改后默认安全组无任何入站/出站规则,可满足Security Hub关于默认安全组的合规要求。
内容的提问来源于stack exchange,提问作者Iheb Mar
相关产品推荐
相关产品推荐

