ちょっと話題の記事

【Tips】使用していないセキュリティグループを洗い出したい!!!

2017.09.05

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

森永です。

先日セキュリティグループの各ルールにコメントを書けるようになりました。

[新機能]Security Groupのルールに説明が記載可能になりました! | Developers.IO

これを機にセキュリティグループの棚卸しをしよう!という機運が高まりますよね。
ただ、セキュリティグループ一覧を見ると使っているのか、使ってないのか分からないものが多数あります。
使っていないものを管理するのも時間の無駄なので削除したいのですが、下手に消すと通信が遮断されて大変なことになる可能性もあります。

今回は使用していないセキュリティグループを洗い出す方法を検討してみます。

今回はEC2-VPCセキュリティグループのみを対象としています。

Case1: AWS Configを有効化している場合

AWS Configには紐付いているAWSリソースを洗い出せるというものです。

AWS Configをちゃんと有効にしていれば、これを使ってセキュリティグループに紐付いているAWSリソースを洗い出せるという寸法です。
下記の画像のように紐づくVPCやアタッチされているENIを一覧で確認することが出来ます。
EC2に限らず、RDS、ElastiCache、RedshiftなどもENIが作成され、使用しているセキュリティグループは全てENIに紐付きます。
そのため、これを確認すれば使用しているかどうかを確認できそうです。

AWS_Config_Console

Case2: AWS Configを有効化していない場合

Configを有効にしないと上記情報は見ることが出来ません。。。
その場合はENIに紐付いているセキュリティグループを全て洗い出せばなんとかなりそうです。
マネジメントコンソールから見るのは辛いので、CLIで一気に確認しましょう。

全セキュリティグループ洗い出しスクリプトを置いておきます。
走らせるとCSVが出力されますので、Excelに貼り付けて使うことも出来ます。

スクリプト

#!/bin/bash
echo "sg_id,sg_name,is_assosiated_eni"
for sg in `aws ec2 describe-security-groups --query 'SecurityGroups[].[join(\`,\`,[GroupId,GroupName])]' --output text`; do
  sg_id=$(echo ${sg} | cut -d ',' -f1)
  sg_name=$(echo ${sg} | cut -d ',' -f2)
  
  echo -n "${sg}"

  # このSGを使用しているENIがあるか問合せ
  eni=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=${sg_id} --query 'NetworkInterfaces[]' --output text)
  
  if [ -n "${eni}" ]; then
    echo -n ",true"
  else
    echo -n ",false"
  fi
  
  echo ;
done

結果

sg_id,sg_name,is_assosiated_eni
sg-11111111,default,true
sg-22222222,HTTP,true
sg-33333333,SSH,true
sg-44444444,default,false

Case3: ENIに紐付かないセキュリティグループの場合

全部ENIに紐づくって言ったじゃないですかー!

残念ながら現在使用しているセキュリティグループはENIに紐付くのですが、Auto Scalingの起動設定で指定されていて、インスタンスは無いけど使用しているというような「一時的にインスタンスが立ち上がる」場合には上記の方法では見つけることが出来ないのです。
しかも困ったことに、起動設定に設定しているだけだとセキュリティグループ消せちゃいます。
ASが起動しようとするとセキュリティグループ無いやんってなります。これは困りました。

以下が、普段はセキュリティグループを使わないけどたまに使う可能性があるサービスのリストです。
全てを網羅しきれていません。他にもあれば教えてください。

  • Auto Scaling(スケジューリングで起動するやつが怪しいです)
  • Data Pipeline(EMRとか起動します)
  • AWS Batch(ジョブが来たときだけ起動します)

他にもLambdaで起動する仕組みを作っていたりするかもしれません。
ここも一個一個使っていないかを確認していく必要があります。
なるべくCLIを駆使して楽しましょう。

ENIのやつとAuto Scalingの起動設定洗い出しを組み合わせるとこんな感じです。

スクリプト

#!/bin/bash
echo "sg_id,sg_name,is_assosiated_eni,is_assosiated_as"
for sg in `aws ec2 describe-security-groups --query 'SecurityGroups[].[join(\`,\`,[GroupId,GroupName])]' --output text`; do
  sg_id=$(echo ${sg} | cut -d ',' -f1)
  sg_name=$(echo ${sg} | cut -d ',' -f2)
  
  echo -n "${sg}"

  # このSGを使用しているENIがあるか問合せ
  eni=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=${sg_id} --query 'NetworkInterfaces[]' --output text)
  
  if [ -n "${eni}" ]; then
    echo -n ",true"
  else
    echo -n ",false"
  fi
  
  # このSGを使用しているLaunch Configutationがあるか問合せ
  as=$(aws autoscaling describe-launch-configurations --query "LaunchConfigurations[?contains(SecurityGroups,\`${sg_id}\`)].[LaunchConfigurationName]" --output text)
  if [ -n "${as}" ]; then
    echo -n ",true"
  else
    echo -n ",false"
  fi
  
  echo ;
done

結果

sg_id,sg_name,is_assosiated_eni,is_assosiated_as
sg-11111111,default,true,false
sg-22222222,HTTP,true,false
sg-33333333,SSH,true,true
sg-44444444,default,false,false

最後に

使用しないセキュリティグループが大量に残ってごちゃごちゃした状態だとオペミスが発生しやすくなります。
本来意図しないポートが開放されて攻撃されるなどの可能性もありますので、定期的にセキュリティグループを棚卸しして不要なセキュリティグループを削除するようにしましょう。