こんにちは、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に関するドキュメント
- describe-security-groups — AWS CLI 2.11.5 Command Reference
- revoke-client-vpn-ingress — AWS CLI 2.11.5 Command Reference
- revoke-security-group-egress — AWS CLI 2.11.5 Command Reference
最後に
皆さんもデフォルトSGのルールを放置することなく、ちゃんと削除する&使わないようにしましょう。
些細な内容ですが、本記事が皆さんのお役に立てれば幸いです。
以上、べこみんでした。