[python]デフォルトのセキュリティグループのインバウンドルール、アウトバウンドルールを削除する

2021.10.15

どうも!西村祐二です。

デフォルトのセキュリティグループに付与されているインバウンドルールとアウトバウンドルールをPythonスクリプトで自動的に削除する機会がありました。

調べてもすんなり情報が出てこなかったので、個人的な備忘録も兼ねてブログにしておきます。

なぜ削除するのか?

デフォルトセキュリティグループは通信できないように無効化することが推奨されており、Securty Hubを有効にしていると検知されるためです。

(無効化はインバウンド、アウトバウンドのルールを全て削除することを意味します。)

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-standards-fsbp-controls.html#fsbp-ec2-2

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-cis-controls.html#securityhub-cis-controls-4.3

簡易スクリプト

import boto3
obj_ec2 = boto3.resource("ec2")

sgs = list(
    obj_ec2.security_groups.filter(
        Filters=[{"Name": "group-name", "Values": ["default"]}]
    )
)

for sg in sgs:
    default_sg = obj_ec2.SecurityGroup(sg.id)
    if default_sg.ip_permissions_egress:
        default_sg.revoke_egress(
            IpPermissions=default_sg.ip_permissions_egress,
        )
    if default_sg.ip_permissions:
        default_sg.revoke_ingress(
            IpPermissions=default_sg.ip_permissions,
        )

複数のリージョンで使いたい場合は適宜変更してください。

スクリプトの内容を簡単に解説します。

  • 4-8行目:デフォルトのセキュリティグループの情報を取得する処理
    sgs = list(
        obj_ec2.security_groups.filter(
            Filters=[{"Name": "group-name", "Values": ["default"]}]
        )
    )

もっとすんなりデフォルトのセキュリティグループの情報を取得する方法があれば教えて下さい。

  • default_sg.ip_permissions: インバウンドのルール情報を取得することができます。

何も設定がなければ空の配列が返ってきます。

下記が取得できるデータの例です。

default_sg.ip_permissions

[
  {
    'FromPort': 0,
    'IpProtocol': 'tcp',
    'IpRanges': [
      
    ],
    'Ipv6Ranges': [
      
    ],
    'PrefixListIds': [
      
    ],
    'ToPort': 0,
    'UserIdGroupPairs': [
      {
        'GroupId': 'sg-00000000',
        'UserId': '0000000000'
      }
    ]
  }
]
  • default_sg.ip_permissions_egress: アウトバウンドのルール情報を取得することができます。

何も設定がなければ空の配列が返ってきます。

下記が取得できるデータの例です。

default_sg.ip_permissions_egress

[
  {
    'FromPort': 0,
    'IpProtocol': 'tcp',
    'IpRanges': [
      {
        'CidrIp': '0.0.0.0/0'
      }
    ],
    'Ipv6Ranges': [
      {
        'CidrIpv6': '::/0'
      }
    ],
    'PrefixListIds': [
      
    ],
    'ToPort': 0,
    'UserIdGroupPairs': [
      
    ]
  }
]
  • revoke_ingress/revoke_egressでルールを削除

IpPermissionsに取得した情報をそのまま渡せばすべて削除できます。便利。

さいごに

デフォルトのセキュリティグループに付与されているインバウンドルールとアウトバウンドルールをPythonスクリプトで削除する方法を紹介しました。

誰かの参考になれば幸いです。

AWS Configを使ってより自動化したい場合は下記ブログを参考にしてください。