AWS CLIでデフォルトセキュリティグループのルールを一括削除してみたin全リージョン

デフォルトセキュリティグループのルールは削除しておきましょう
2023.03.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。

突然ですが、この記事をご覧の皆さんは日々AWS環境のセキュリティチェックを行い、是正されているかと思います。

↓ この記事にもあるVPCのデフォルトセキュリティグループ(SG)のルールを残している。。なんてことは、もちろん無いですよね。

今日のブログでは、そんなデフォルトSGのルールを全リージョンで一括削除するスクリプトをご紹介します。

スクリプト紹介

aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read REGION; do
    echo "# deleting sg-rules in ${REGION}"
    ### default SGのIDを取得し、IDごとに処理を実行
    aws ec2 describe-security-groups --filters "Name=group-name,Values=default" --region "$REGION" --query "SecurityGroups[].GroupId" --output text | xargs -n1 echo \
    | while read ID; do
        echo "# deleting default rule in ${ID}"
        SG=$(aws ec2 describe-security-groups --group-ids ${ID} --region "$REGION" --query "SecurityGroups[]" --output json)
        INGRESS=$(echo $SG | jq -r '.[].IpPermissions[]')
        EGRESS=$(echo $SG | jq -r '.[].IpPermissionsEgress[]')
        ### ingressを削除
        if [ -n "$INGRESS" ]; then
            RESULT=$(aws ec2 revoke-security-group-ingress --group-id $ID --region "$REGION" --ip-permissions "$INGRESS" --query "Return")
            echo "# deleted ${ID} ingress"
        fi
        ### egressを削除
        if [ -n "$EGRESS" ]; then
            RESULT=$(aws ec2 revoke-security-group-egress --group-id $ID --region "$REGION" --ip-permissions "$EGRESS" --query "Return")
            echo "# deleted ${ID} egress"
        fi
    done
done

スクリプト自体は単純なものです。

リージョンごとに処理を実行します。複数VPC作成されていることを考慮し、 default という名前のSGのIDをすべて取得し、そのIDごとにインバウンドルールとアウトバウンドルールを削除しています。

もっと綺麗な書き方もありそうなので、違う書き方があれば私のTwitterまでフィードバックをください!喜びます!

使い方

ただのAWS CLIなのでローカル環境から実行していただいても構いませんが、ここではAmazon CloudShellで実行します。

実施前の注意事項

注意事項です。

VPC作成時に用意されているデフォルトのSGは本来利用が推奨されていないものですが、念の為ご自身の環境で本当にデフォルトのSGを利用していないかどうかをご確認ください。

確認方法については下記記事をご参照ください。

Amazon CloudShellの起動

まずはAWSのマネジメントコンソールにログインしてください。

ログイン後、画面右上にある下記アイコン(下図赤枠部)からCloudShellを実行します。

もしくは下記リンクからでも実行可能です。

Amazon CloudShell(ap-northeast-1)

初めてCloudShellを利用する場合、aws --version でawsコマンドが使えることだけ簡単に確認しましょう。

[cloudshell-user@ip-0-0-0-0 ~]$ aws --version
aws-cli/2.11.3 Python/3.11.2 Linux/5.10.167-147.601.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

スクリプト実行

それではスクリプトを実行します。CloudShellのコンソール上に上で紹介したスクリプトをただコピペするだけです。

[cloudshell-user@ip-0-0-0-0 ~]$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read REGION; do
>     echo "# deleting sg-rules in ${REGION}"
>     ### default SGのIDを取得し、IDごとに処理を実行
>     aws ec2 describe-security-groups --filters "Name=group-name,Values=default" --region "$REGION" --query "SecurityGroups[].GroupId" --output text | xargs -n1 echo \
>     | while read ID; do
>         echo "deleting default rule in ${ID}"
>         SG=$(aws ec2 describe-security-groups --group-ids ${ID} --region "$REGION" --query "SecurityGroups[]" --output json)
>         INGRESS=$(echo $SG | jq -r '.[].IpPermissions[]')
>         EGRESS=$(echo $SG | jq -r '.[].IpPermissionsEgress[]')
>         ### ingressを削除
>         if [ -n "$INGRESS" ]; then
>             RESULT=$(aws ec2 revoke-security-group-ingress --group-id $ID --region "$REGION" --ip-permissions "$INGRESS" --query "Return")
>             echo "# deleted ${ID} ingress"
>         fi
>         ### egressを削除
>         if [ -n "$EGRESS" ]; then
>             RESULT=$(aws ec2 revoke-security-group-egress --group-id $ID --region "$REGION" --ip-permissions "$EGRESS" --query "Return")
>             echo "# deleted ${ID} egress"
>         fi
>     done
> done

ペーストしたらEnterを押して実行します。

すると、以下のような実行結果が出てきます。

# deleting sg-rules in ap-south-1
deleting default rule in sg-xxxxxxxxxxxxx
# deleted sg-xxxxxxxxxxxxx ingress
# deleted sg-xxxxxxxxxxxxx egress
(中略)
deleting default rule in sg-yyyyyyyyyyyyy
# deleted sg-yyyyyyyyyyyyy ingress
# deleted sg-yyyyyyyyyyyyy egress

最後まで実行されればすべて削除完了です。お疲れ様でした!

参考

お世話になった神ブログ

AWS CLIに関するドキュメント

最後に

皆さんもデフォルトSGのルールを放置することなく、ちゃんと削除する&使わないようにしましょう。

些細な内容ですが、本記事が皆さんのお役に立てれば幸いです。

以上、べこみんでした。