AWS-CloudFormation

【小ネタ】CloudFormationでセキュリティグループのアウトバウンドルール(Egressルール)を空にするには

はじめに

こんにちは、ディーネットの山田です。ブログ執筆のネタがなく、小ネタで数稼ぎをします。

今回は、案件対応で利用するCloudFormationを作成していて、セキュリティグループのEgressを空にする必要があったのですが、一筋縄ではいかなかったので記事にしてみました。

CloudFormationとは

AWSを触っている方なら、補足する必要ないと思いますが。

AWSから提供されている、AWSインフラストラクチャをCloudFormationテンプレートと呼ばれるコードで管理できるサービスとなります。

AWS CloudFormation とは

リファレンスも公式から提供されているので、以下を確認しながらコードを書くことができます。

AWS resource and property types reference

本題

さて、前置きはこのあたりにして、実際にはまった事柄としては、CloudFormationでセキュリティグループを新規作成するコードを書いていたのですが、アウトバウンドルールを空で指定しているにも関わらず実行したらアウトバウンドルールが全許可されているではないですか。

実際のCloudFormationのコード

Resources:
  BlogTestSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: blog-test-description
      GroupName: blog-test
      SecurityGroupEgress: []
      SecurityGroupIngress: []
      Tags:
        - Key: Name
          Value: blog-test
      VpcId: vpc-XXXXXXXXXXXXXXXXX

実際の実行後のセキュリティグループ

なんと、アウトバウンドルールが全許可されている!!

原因について

「AWS::EC2::SecurityGroup」のリファレンスには、以下のように書かれております。

When you create a security group, if you do not add egress rules, we add egress rules that allow all outbound IPv4 and IPv6 traffic. Otherwise, we do not add them. After the security group is created, if you remove all egress rules that you added, we do not add egress rules, so no outbound traffic is allowed.

日本語に翻訳すると。

セキュリティグループを作成するときに、egressルールを追加しない場合は、すべてのアウトバウンドIPv4およびIPv6トラフィックを許可するegressルールを追加します。それ以外の場合は追加しません。セキュリティグループの作成後、追加したすべてのegressルールを削除すると、egressルールは追加されないので、送信トラフィックは許可されません。

セキュリティグループを作成するときに、Egressルールを追加しない場合は勝手に全許可のアウトバウンドルールを追加するよ。Egressルールを追加している場合は、そういった対応はしないからと。

つまり、セキュリティグループのアウトバウンドルールを空にしたければ、以下の順序を踏む必要がある。

  1. Egressルールにダミールールを入れてセキュリティグループを作成
  2. 変更セットで、Egressルールからダミールールを削除

では早速試してみる

以下の順序で試してみる。

  1. Egressルールにダミールールを入れてセキュリティグループを作成
  2. 変更セットで、Egressルールからダミールールを削除

Egressルールにダミールールを入れてセキュリティグループを作成

リファレンスに記載されているダミールールを入れてセキュリティグループを作成します。

Remove the default rule

Resources:
  BlogTestSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: blog-test-description
      GroupName: blog-test
      SecurityGroupEgress:
        - CidrIp: 127.0.0.1/32
          IpProtocol: "-1"
      SecurityGroupIngress: []
      Tags:
        - Key: Name
          Value: blog-test
      VpcId: vpc-XXXXXXXXXXXXXXXXX

この時点で、アウトバウンドルールは作成されているが、宛先がループバックアドレスなので、実質どこにも接続はできない。

変更セットで、Egressルールからダミールールを削除

宛先がループバックアドレスのルールを残しておいてもよいが、(元々の設計がアウトバウンドルールが空であれば)設計との乖離が出てしまうので、以下のようにEgressルールを空にして変更セットで実行する。

Resources:
  BlogTestSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: blog-test-description
      GroupName: blog-test
      SecurityGroupEgress: []
      SecurityGroupIngress: []
      Tags:
        - Key: Name
          Value: blog-test
      VpcId: vpc-XXXXXXXXXXXXXXXXX

ようやく、アウトバウンドルールが空になった

まとめ

冪等性という意味では、1回目の初回実行と2回目の実行で結果が変わってしまうので、よくない気もするが、セキュリティグループのアウトバウンドルールには癖がある前提で設計するしかなさそうですね。

どうしても、要件上セキュリティグループのアウトバウンドルールを空にする必要がある場合は、この癖を思い出して対応しようと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA