AWS CLI でデフォルトのセキュリティグループを使用する AWS リソースを特定する方法

AWS CLI でデフォルトのセキュリティグループと紐づいた ENI を確認することで、どの AWS リソースでデフォルトのセキュリティグループが使用されているかどうかを確認します。起動テンプレートと起動設定の特定方法についても記載があります。
2021.09.21

困っていた内容

デフォルトのセキュリティグループを使用している AWS リソースを特定したいのですが、なにか良い方法はありますか?

どう対応すればいいの?

セキュリティグループは ENI と紐づくので、デフォルトのセキュリティグループと紐づいた ENI を確認することでどの AWS リソースで使用されているかどうかがわかります。以下のコマンドをお試しください。

デフォルトのセキュリティグループに紐づく ENI と AWS リソースの特定

  • デフォルトのセキュリティグループに紐づく ENI とそれを使用する EC2 インスタンスを特定します。
    $ SG=sg-xxxxxxxx ## デフォルトのセキュリティグループ ID を格納してください
    $ aws ec2 describe-network-interfaces \
    --filters Name=group-id,Values=$SG \
    --query 'NetworkInterfaces[].Attachment[].[AttachmentId, InstanceId]' \
    --output text

  • ENI の説明からどの AWS リソースがデフォルトのセキュリティグループを使用しているかを確認します。

    $ SG=sg-xxxxxxxx ## デフォルトのセキュリティグループ ID を格納してください
    $ aws ec2 describe-network-interfaces \
    --filters Name=group-id,Values=$SG \
    --query 'NetworkInterfaces[].Description'


デフォルトのセキュリティグループと紐づく起動テンプレートと起動設定の特定

デフォルトのセキュリティグループが起動テンプレート起動設定で使用されているかどうかは以下のコマンドでご確認ください。

jq コマンドのインストールを行なった後に実行してください。

  • どの起動テンプレートでデフォルトのセキュリティグループが使用されているかを特定します。
    $ SG=sg-xxxxxxxx ## デフォルトのセキュリティグループ ID を格納してください
    $ for template in $(aws ec2 describe-launch-templates \
    | jq -r '.LaunchTemplates[].LaunchTemplateId');
     do aws ec2 describe-launch-template-versions --launch-template-id $template \
    | jq -r --arg sg $SG '.LaunchTemplateVersions[]
    | if .LaunchTemplateData.SecurityGroupIds
    | contains([$sg]) then .LaunchTemplateId + ", version : " + (.VersionNumber | tostring) else "" end' ; done

  • どの起動設定でデフォルトのセキュリティグループが使用されているかを特定します。

    $ SG=sg-xxxxxxxx ## デフォルトのセキュリティグループ ID を格納してください
    $ aws autoscaling describe-launch-configurations \
    | jq -r --arg sg $SG '.LaunchConfigurations[] 
    | if .SecurityGroups | contains([$sg]) then .LaunchConfigurationName else "" end'


試してみた

ENI と AWS リソースの特定

コマンドを試してみるために、検証環境でリソースをいくつか立ち上げました。
※ 以下のリソースは、すべてデフォルトのセキュリティグループを利用しています。

Lambda
 - VPC 内に Lambda 関数「hello-in-vpc」を作成しました。

ロードバランサー
 - ALB 「lb-test」を作成しました。

Auto Scaling
 - EC2 インスタンス「i-06919f02a79b35106」を Auto Scaling 配下で起動させました。

EC2
 - EC2 インスタンス「i-07b80a8bc62d00dbd」を起動させました。

  • デフォルトのセキュリティグループを利用する ENI とそれに紐づく EC2 インスタンスが確認できました。
$ SG=sg-xxxxxxxx
$ aws ec2 describe-network-interfaces \
> --filters Name=group-id,Values=$SG \
> --query 'NetworkInterfaces[].Attachment[].[AttachmentId, InstanceId]' \
> --output text
eni-attach-003a3921b7ce3ca1d    i-06919f02a79b35106
eni-attach-00d4d3a48a678b9b1    None
eni-attach-082313cffcfc3f312    i-07b80a8bc62d00dbd
eni-attach-05d58e0c0d927dccd    None
ela-attach-008dfd6e72eb9617c    None
  • 「None」となっているリソースは、ENI の説明を呼び出すことで詳細が確認できました。
$ SG=sg-xxxxxxxx
$ aws ec2 describe-network-interfaces \
> --filters Name=group-id,Values=$SG \
> --query 'NetworkInterfaces[].Description'
[
   "",  ## これは i-06919f02a79b35106
   "ELB app/lb-test/ff604fe623bd8c3b",
   "",  ## これは i-07b80a8bc62d00dbd
   "ELB app/lb-test/ff604fe623bd8c3b",
   "AWS Lambda VPC ENI-hello-in-vpc-5b030af0-21a9-455d-9a33-1c18efff7d5b"
]


起動テンプレートの特定

デフォルトのセキュリティグループが使用されている起動テンプレート 「lt-01628dcff06fef06e」と
その他のセキュリティグループが使用されている起動テンプレート「lt-019c76a7097629310」を作成しました。

起動テンプレート

  • コマンドを実行すると、「lt-01628dcff06fef06e」のみが表示されました。
$ SG=sg-xxxxxxxx
$ for template in $(aws ec2 describe-launch-templates \
> | jq -r '.LaunchTemplates[].LaunchTemplateId');
>  do aws ec2 describe-launch-template-versions --launch-template-id $template \
> | jq -r --arg sg $SG '.LaunchTemplateVersions[]
> | if .LaunchTemplateData.SecurityGroupIds
> | contains([$sg]) then .LaunchTemplateId + ", version : " + (.VersionNumber | tostring) else "" end' ; done
lt-01628dcff06fef06e, version : 1


起動設定の特定

デフォルトのセキュリティグループが使用されている起動設定「test-default-sg」と
その他のセキュリティグループが使用されている起動設定「test-no-default-sg」を作成しました。

起動設定

  • コマンドを実行すると、「test-default-sg」のみが表示されました。
$ SG=sg-xxxxxxxx
$ aws autoscaling describe-launch-configurations \
> | jq -r --arg sg $SG '.LaunchConfigurations[] 
> | if .SecurityGroups | contains([$sg]) then .LaunchConfigurationName else "" end'
test-default-sg

おわりに

デフォルトのセキュリティグループがどこで使用されているかが確認できたら、次はその無効化の検討となりますが、そちらについては以下の弊社ブログをご参照ください。

今回はデフォルトのセキュリティグループの確認のためにコマンドを使用しましたが、特定のセキュリティグループを確認する場合にも良かったらお試しください。

関連資料