AWS CDK の VPC Construct で作成されるデフォルトセキュリティグループのインバウンドとアウトバウンドのルールを削除する設定

AWS CDK の VPC Construct で作成されるデフォルトセキュリティグループのインバウンドとアウトバウンドのルールを削除する設定

Clock Icon2025.01.28

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS CDK の Vpc Construct を使用して VPC を作成すると、下記のルールを持つセキュリティグループがデフォルトで作成されます。

  • インバウンドルール:同じセキュリティグループに属するリソース間の全ての通信を許可
  • アウトバウンドルール:インターネット(IPv4 アドレス)への全ての送信トラフィックを許可

下記は実際に作成されたセキュリティグループとそのルールです。


そして上記のセキュリティグループは下記の Security Hub コントロール失敗の原因となります。

いずれも重要度 High のアラームとなり、デフォルトのセキュリティグループを使用しない場合は不必要なルールのせいでアラームが上がってしまうことになります。

そこで VPC Construnct の restrictDefaultSecurityGroup プロパティを使用して、デフォルトセキュリティグループのインバウンドとアウトバウンドのルールを削除して上記のコントロール失敗に対処してみます。

やってみた

既存の VPC に下記のように restrictDefaultSecurityGroup プロパティを設定します。

diff --git a/lib/main-stack.ts b/lib/main-stack.ts
index 45672ef..0d9cd46 100644
--- a/lib/main-stack.ts
+++ b/lib/main-stack.ts
@@ -10,6 +10,7 @@ export class MainStack extends cdk.Stack {
     new ec2.Vpc(this, 'VPC', {
       maxAzs: 1,
       natGateways: 0,
+      restrictDefaultSecurityGroup: true,
     });
   }
 }

対処後の VPC Construct の CDK コードは下記のようになります。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as ec2 from 'aws-cdk-lib/aws-ec2';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    // Create a VPC
    new ec2.Vpc(this, 'VPC', {
      maxAzs: 1,
      natGateways: 0,
      restrictDefaultSecurityGroup: true,
    });
  }
}

CDK Diff を確認すると、カスタムリソースの Lambda 関数によりデフォルトセキュリティグループのインバウンドとアウトバウンドのルールが削除されるようです。

$ npx cdk diff
start: Building e49f277787fdc6c5d231e2a36b82c83c1e9052d14aafb025cf4292c51609665a:current_account-current_region
success: Built e49f277787fdc6c5d231e2a36b82c83c1e9052d14aafb025cf4292c51609665a:current_account-current_region
start: Publishing e49f277787fdc6c5d231e2a36b82c83c1e9052d14aafb025cf4292c51609665a:current_account-current_region
success: Published e49f277787fdc6c5d231e2a36b82c83c1e9052d14aafb025cf4292c51609665a:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main
IAM Statement Changes
┌───┬────────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────────┬──────────────────────────────────────────────────────┬───────────┐
│   │ Resource                                           │ Effect │ Action                                             │ Principal                                            │ Condition │
├───┼────────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────┼──────────────────────────────────────────────────────┼───────────┤
│ + │ ${Custom::VpcRestrictDefaultSGCustomResourceProvid │ Allow  │ sts:AssumeRole                                     │ Service:lambda.amazonaws.com                         │           │
│   │ er/Role.Arn}                                       │        │                                                    │                                                      │           │
├───┼────────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────┼──────────────────────────────────────────────────────┼───────────┤
│ + │ arn:${AWS::Partition}:ec2:${AWS::Region}:${AWS::Ac │ Allow  │ ec2:AuthorizeSecurityGroupEgress                   │ AWS:${Custom::VpcRestrictDefaultSGCustomResourceProv │           │
│   │ countId}:security-group/${VPCB9E5F0B4.DefaultSecur │        │ ec2:AuthorizeSecurityGroupIngress                  │ ider/Role}                                           │           │
│   │ ityGroup}                                          │        │ ec2:RevokeSecurityGroupEgress                      │                                                      │           │
│   │                                                    │        │ ec2:RevokeSecurityGroupIngress                     │                                                      │           │
└───┴────────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────────┴──────────────────────────────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────┐
│   │ Resource                                                   │ Managed Policy ARN                                                                           │
├───┼────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┤
│ + │ ${Custom::VpcRestrictDefaultSGCustomResourceProvider/Role}{"Fn::Sub":"arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"} │
└───┴────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Mappings
[+] Mapping LatestNodeRuntimeMap LatestNodeRuntimeMap: {"af-south-1":{"value":"nodejs20.x"},"ap-east-1":{"value":"nodejs20.x"},"ap-northeast-1":{"value":"nodejs20.x"},"ap-northeast-2":{"value":"nodejs20.x"},"ap-northeast-3":{"value":"nodejs20.x"},"ap-south-1":{"value":"nodejs20.x"},"ap-south-2":{"value":"nodejs20.x"},"ap-southeast-1":{"value":"nodejs20.x"},"ap-southeast-2":{"value":"nodejs20.x"},"ap-southeast-3":{"value":"nodejs20.x"},"ap-southeast-4":{"value":"nodejs20.x"},"ap-southeast-5":{"value":"nodejs20.x"},"ap-southeast-7":{"value":"nodejs20.x"},"ca-central-1":{"value":"nodejs20.x"},"ca-west-1":{"value":"nodejs20.x"},"cn-north-1":{"value":"nodejs18.x"},"cn-northwest-1":{"value":"nodejs18.x"},"eu-central-1":{"value":"nodejs20.x"},"eu-central-2":{"value":"nodejs20.x"},"eu-north-1":{"value":"nodejs20.x"},"eu-south-1":{"value":"nodejs20.x"},"eu-south-2":{"value":"nodejs20.x"},"eu-west-1":{"value":"nodejs20.x"},"eu-west-2":{"value":"nodejs20.x"},"eu-west-3":{"value":"nodejs20.x"},"il-central-1":{"value":"nodejs20.x"},"me-central-1":{"value":"nodejs20.x"},"me-south-1":{"value":"nodejs20.x"},"mx-central-1":{"value":"nodejs20.x"},"sa-east-1":{"value":"nodejs20.x"},"us-east-1":{"value":"nodejs20.x"},"us-east-2":{"value":"nodejs20.x"},"us-west-1":{"value":"nodejs20.x"},"us-west-2":{"value":"nodejs20.x"}}

Resources
[+] Custom::VpcRestrictDefaultSG VPC/RestrictDefaultSecurityGroupCustomResource VPCRestrictDefaultSecurityGroupCustomResource59474679
[+] AWS::IAM::Role Custom::VpcRestrictDefaultSGCustomResourceProvider/Role CustomVpcRestrictDefaultSGCustomResourceProviderRole26592FE0
[+] AWS::Lambda::Function Custom::VpcRestrictDefaultSGCustomResourceProvider/Handler CustomVpcRestrictDefaultSGCustomResourceProviderHandlerDC833E5E

✨  Number of stacks with differences: 1

上記をデプロイし、CloudFormation のリソースを見るとカスタムリソースが追加されています。

セキュリティグループのインバウンドとアウトバウンドのルールが削除されていることが確認できました!

おわりに

AWS CDK の VPC Construct で作成されるデフォルトセキュリティグループのインバウンドとアウトバウンドのルールを restrictDefaultSecurityGroup プロパティの設定で削除する方法をご紹介しました。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.