defaultのセキュリティグループが使われているか調査するPythonスクリプト書いてみた

こんにちは、臼田です。

皆さん、スクリプト書いてますか?

今回も狭い用途のスクリプトを書いたので公開します。defaultセキュリティグループが利用されているか調査するためのスクリプトです。

defaultセキュリティグループの性質

セキュリティグループの中には、defaultセキュリティグループが各VPCに一つ存在します。VPCが作成されたタイミングと一緒に作成されます。

このdefaultセキュリティグループは特殊な役割を担っています。それは、明示的にセキュリティグループを指定しなかったリソースに対して割り当たることがあるというものです。

このセキュリティグループのインバウンドは、デフォルトではすべてのプロトコルをセキュリティグループ内で許可する設定となっており、意識せず割り当たって意図せず通信できてしまう、ということが発生する懸念があるため、利用を避けるべきセキュリティグループとなっています。

また、削除することができず残さないといけないため、インバウンドルールをすべて削除する変更が必要となり、CISベンチマークでもこれが推奨されています

スクリプト

というわけでdefaultセキュリティグループを無効化したくなるのですが、自分ですべてを理解していない環境では、defaultセキュリティグループが使われている可能性があります。

まずはそれを調査する必要があるため、このスクリプトを書きました。

Python3.6で動作します。

import sys
import boto3

account_id = boto3.client('sts').get_caller_identity()['Account']

print('Account is: ' + account_id)
agree = input('Is it OK? (y/n): ')
if agree != 'y': sys.exit()

ec2_client = boto3.client('ec2')
regions = ec2_client.describe_regions()['Regions']

try:
	for region in regions:
		region_name = region['RegionName']
		print("# " + region_name)
		# get default security group list
		ec2 = boto3.resource('ec2', region_name=region_name)
		sgs = list(ec2.security_groups.filter(Filters=[{'Name': 'group-name', 'Values': ['default']}]))
		print('  DefaultSecurityGroups:')
		# get sg relations
		config = boto3.client('config', region_name=region_name)
		for sg in sgs:
			r = config.get_resource_config_history(
				resourceType='AWS::EC2::SecurityGroup',
				resourceId=sg.id
			)
			print("    SG: %s, VPC: %s." % (sg.id, sg.vpc_id))
			for relation in r["configurationItems"][0]["relationships"]:
				print("      " + relation["relationshipName"] + ": " + relation["resourceId"])
except Exception as e:
	print(e)

流れを説明します。

  • ec2_client.describe_regions()で全リージョンを取得してループします
    • ec2.security_groups()でfilterを使ってderaultセキュリティグループのみ取得します
    • config.get_resource_config_history()を使って該当セキュリティグループとリレーションがあるリソースをダンプします

あるリソースが利用されているかどうかを調べる一つの方法としてAWS Configのリレーションを確認する方法があります。

この方法は、ほぼ現時点で関連しているリソースを洗い出してくれるため、例えばセキュリティグループで言えば紐付いているENIやVPCなどが洗い出せます。

実際に実行した結果は下記のようになります。

# ap-northeast-1
  DefaultSecurityGroups:
    SG: sg-0ad977cfc87216dxx, VPC: vpc-0d194a5909689c3xx.
      Is contained in Vpc: vpc-0d194a5909689c3xx
    SG: sg-8756e4xx, VPC: vpc-4c13ccxx.
      Is associated with NetworkInterface: eni-03b6a2146cd68d2xx
      Is contained in Vpc: vpc-4c13ccxx
    SG: sg-b086ddxx, VPC: vpc-c1abaexx.
      Is contained in Vpc: vpc-c1abaexx
…省略…

各セキュリティグループはVPCとは絶対に紐付いているため、VPCだけであれば使われてないと言えます。上記の6行目のようにENIと紐付いていれば、EC2などで使われていると判断できるため、このままセキュリティグループのインバウンドを変更することはできなさそうなので、新しいセキュリティグループを作成して差し替える必要があります。

まとめ

defaultのセキュリティグループの利用状況を確認するスクリプトを紹介しました。

用途が限定的なスクリプトですが考え方も含め役に立つ場面はあると思うので公開しました。

部分的にでも役に立てば幸いです。