AWS CDK の VPC Construct で作成されるデフォルトセキュリティグループのインバウンドとアウトバウンドのルールを削除する設定
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CDK の Vpc Construct を使用して VPC を作成すると、下記のルールを持つセキュリティグループがデフォルトで作成されます。
- インバウンドルール:同じセキュリティグループに属するリソース間の全ての通信を許可
- アウトバウンドルール:インターネット(IPv4 アドレス)への全ての送信トラフィックを許可
下記は実際に作成されたセキュリティグループとそのルールです。
そして上記のセキュリティグループは下記の Security Hub コントロール失敗の原因となります。
- EC2.18 Security groups should only allow unrestricted incoming traffic for authorized ports
- EC2.19 Security groups should not allow unrestricted access to ports with high risk
いずれも重要度 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 コードは下記のようになります。
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
プロパティの設定で削除する方法をご紹介しました。
以上