LoginSignup
0
0

More than 1 year has passed since last update.

CDKでセキュリティグループからの通信のみを許可するインバウンドルールを作成する

Last updated at Posted at 2023-02-05

やりたいこと

image.png

  • CDK(v2)で、インターフェース型のエンドポイントを作成する。
    • 今回はGlueのエンドポイントだが、インターフェース型なら何でもOK
  • そのエンドポイントのセキュリティグループに、別のセキュリティグループからのアクセス許可のみを与える。
  • その際、IPでのアクセス許可は実施しない。

ポイントは、「別のセキュリティグループからのアクセス許可のみを与える」という部分です。IPでの許可は与えません。
少しハマったのでやり方を共有します。

前提条件

  • CDK 2.62.2
    • これ以外のバージョンでも使える話だと思いますが、詳細はドキュメントの確認をお願いいたします。
  • 言語はTypeScript

間違った方法

以下のようなCDKのコードを書きました(EC2インスタンスなどの部分は省略して、今回の説明に必要な部分だけ記載しています)。

    // VPCなど
    const vpc : ec2.Vpc = new ec2.Vpc(this, "cdk-vpc", {
      ipAddresses: ec2.IpAddresses.cidr("10.0.0.0/16"),
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: "public-",
          subnetType: ec2.SubnetType.PUBLIC
        },
        {
          cidrMask: 24,
          name: "private-",
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS
        }
      ]
    });
    
    
    // EC2用のセキュリティグループ
    const ec2SecurityGroup = new ec2.SecurityGroup(
      this,
      "Ec2SecurityGroup",
      {
        securityGroupName: "Ec2SecurityGroup",
        vpc: vpc
      }
    );

    // InterfaceEndpoint用のセキュリティグループ
    const interfaceEndpointSecurityGroup = new ec2.SecurityGroup(
      this,
      "InterfaceEndpointSecurityGroup",
      {
        securityGroupName: "InterfaceEndpointSecurityGroup",
        vpc: vpc
      }
    );

    // EC2用のセキュリティグループからの通信を許可
    interfaceEndpointSecurityGroup.addIngressRule(
      ec2.Peer.securityGroupId(ec2SecurityGroup.securityGroupId),
      ec2.Port.tcp(443)
    );


    // Glue VPCE
    vpc.addInterfaceEndpoint("GLUEInterfaceEndpoint", {
      service: ec2.InterfaceVpcEndpointAwsService.GLUE,
      subnets: {
        subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS
      },
      securityGroups: [interfaceEndpointSecurityGroup],
    });

この記載だと、作成されたインターフェース用のセキュリティグループのインバウンドルールは以下のようになります。
image.png

1行目は、自身で追加しているEC2用のセキュリティグループに対する許可ですが、2行目はIPアドレスによる許可が勝手に追加されています。

原因

インターフェース型のVPCエンドポイントを作成する、InterfaceVpcEndpointで指定するパラメータに問題がありました。
こちらのドキュメントを見ると、InterfaceVpcEndpointopenという任意のパラメータを持ちます。

open?
Type: boolean (optional, default: true)

Whether to automatically allow VPC traffic to the endpoint.

If enabled, all traffic to the endpoint from within the VPC will be automatically allowed. This is done based on the VPC's CIDR range.

記載の通り、このパラメータを有効にすると、VPC内からのエンドポイントへのトラフィックが自動的に許可されます。
具体的な挙動で言うと、セキュリティグループのインバウンドルールにVPCのCIDRからの許可ルールが追加されるようです。
そして、このパラメータはデフォルトで有効となっています。今回は何も指定していないため、デフォルトでopenが有効となり、勝手にインバウンドルールにIPでのアクセス許可が追加されてしまいました。

正しい方法

addInterfaceEndpointのパラメータであるopenを明示的にfalseに指定してあげます。

    // Glue VPCE
    vpc.addInterfaceEndpoint("GLUEInterfaceEndpoint", {
      service: ec2.InterfaceVpcEndpointAwsService.GLUE,
      subnets: {
        subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS
      },
      securityGroups: [interfaceEndpointSecurityGroup],
      open: false
    });

そうすると、今度は意図したセキュリティグループからの通信の許可のみのルールとなりました。

image.png

おわりに

CDKはL2の抽象度で記載すると、色々と良い感じにしてくれて楽になる一方で、一部融通が利かなくなる時がありますね。
今回はパラメータの変更で済みましたが、これを毎回探すのがなかなか大変そうです。
ただ、そういう試行錯誤も含めて、CDK書いていて楽しいですね。これはハマる人が多いのも頷けます。
もちろんCloudFormationもサクッとIaCを試すのに便利ですが、ガッツリIaC使った開発PJを進めるのなら、CDKおすすめです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0