You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过AWS CDK禁用默认VPC默认安全组的入站出站流量

解决AWS CDK修改默认VPC默认安全组的问题

问题分析

你当前的代码是新建了一个安全组,而非修改默认VPC自带的默认安全组,所以无法达到禁用默认安全组流量的目的。默认安全组是AWS自动创建的资源,不能通过new ec2.SecurityGroup来操作,需要用CDK的引用方法获取它,再通过自定义资源修改其入站/出站规则。

实现步骤

  1. 引用默认VPC和默认安全组
    通过Vpc.fromLookup获取默认VPC,直接利用VPC的defaultSecurityGroup属性拿到默认安全组ID,无需手动指定。
  2. 用自定义资源修改安全组规则
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:25:55