ホームページ > バックエンド開発 > Python チュートリアル > Python と Boto3 を使用した AWS の未使用のセキュリティ グループの検索と検証

Python と Boto3 を使用した AWS の未使用のセキュリティ グループの検索と検証

Linda Hamilton
リリース: 2024-12-17 06:50:25
オリジナル
903 人が閲覧しました

Finding and Validating Unused Security Groups in AWS with Python and Boto3

AWS セキュリティ グループを効果的に管理することは、安全でコスト効率の高いクラウド環境を維持するために重要です。セキュリティ グループは AWS のネットワーク セキュリティの重要な部分ですが、時間の経過とともに、未使用のセキュリティ グループが蓄積される可能性があります。これらの未使用のグループは環境を乱雑にするだけでなく、セキュリティ上のリスクを引き起こしたり、不必要にコストを増加させたりする可能性があります。

この記事では、Python と Boto3 を使用して、AWS 環境内で未使用のセキュリティ グループを特定し、検証し、それらが他のリソースによって参照されていないことを確認する方法を説明します。また、これらのグループを削除できるかどうかを安全に判断する方法についても説明します。

前提条件

このチュートリアルを進めるには、次のものが必要です:

AWS アカウント: 未使用のセキュリティ グループを検索する AWS 環境にアクセスできることを確認してください。
Boto3 がインストールされました: 以下を実行して Boto3 Python SDK をインストールできます:

   pip install boto3
ログイン後にコピー
ログイン後にコピー

AWS 認証情報が設定されました: AWS CLI を使用するか、IAM ロールまたは環境変数を使用してコード内で直接 AWS 認証情報が設定されていることを確認します。

コードの内訳

特定の AWS リージョンで未使用のセキュリティ グループを識別し、それらを検証し、他のグループによって参照されているかどうかを確認するコードを見てみましょう。

ステップ 1: すべてのセキュリティ グループと ENI を取得する

   pip install boto3
ログイン後にコピー
ログイン後にコピー
  • セキュリティ グループの取得: まず、describe_security_groups メソッドを呼び出して、指定されたリージョン内のすべてのセキュリティ グループを取得します。
  • ネットワーク インターフェイスの取得: 次に、describe_network_interfaces を使用してすべてのネットワーク インターフェイスを取得します。各ネットワーク インターフェイスには 1 つ以上のセキュリティ グループを関連付けることができます。
  • 使用されるセキュリティ グループの識別: 各ネットワーク インターフェイスについて、関連付けられたセキュリティ グループ ID を used_sg_ids と呼ばれるセットに追加します。
  • 未使用のグループの検索: 次に、セキュリティ グループ ID を使用中のグループ ID と比較します。グループが使用されていない場合 (つまり、その ID が used_sg_ids セットにない場合)、削除できないデフォルトのセキュリティ グループを除き、そのグループは未使用とみなされます。

ステップ 2: セキュリティグループ参照を確認する

import boto3
from botocore.exceptions import ClientError

def get_unused_security_groups(region='us-east-1'):
    """
    Find security groups that are not being used by any resources.
    """
    ec2_client = boto3.client('ec2', region_name=region)

    try:
        # Get all security groups
        security_groups = ec2_client.describe_security_groups()['SecurityGroups']

        # Get all network interfaces
        enis = ec2_client.describe_network_interfaces()['NetworkInterfaces']

        # Create set of security groups in use
        used_sg_ids = set()

        # Check security groups attached to ENIs
        for eni in enis:
            for group in eni['Groups']:
                used_sg_ids.add(group['GroupId'])

        # Find unused security groups
        unused_groups = []
        for sg in security_groups:
            if sg['GroupId'] not in used_sg_ids:
                # Skip default security groups as they cannot be deleted
                if sg['GroupName'] != 'default':
                    unused_groups.append({
                        'GroupId': sg['GroupId'],
                        'GroupName': sg['GroupName'],
                        'Description': sg['Description'],
                        'VpcId': sg.get('VpcId', 'EC2-Classic')
                    })

        # Print results
        if unused_groups:
            print(f"\nFound {len(unused_groups)} unused security groups in {region}:")
            print("-" * 80)
            for group in unused_groups:
                print(f"Security Group ID: {group['GroupId']}")
                print(f"Name: {group['GroupName']}")
                print(f"Description: {group['Description']}")
                print(f"VPC ID: {group['VpcId']}")
                print("-" * 80)
        else:
            print(f"\nNo unused security groups found in {region}")

        return unused_groups

    except ClientError as e:
        print(f"Error retrieving security groups: {str(e)}")
        return None
ログイン後にコピー
  • 参照の確認: この機能は、特定のセキュリティ グループが他のセキュリティ グループによって参照されているかどうかを確認します。これは、受信 (ip-permission.group-id) および送信 (egress.ip-permission.group-id) ルールに基づいてセキュリティ グループをフィルタリングすることによって行われます。
  • 参照グループを返す: グループが参照されている場合、関数は参照しているセキュリティ グループのリストを返します。そうでない場合は、None を返します。

ステップ 3: 未使用のセキュリティ グループを検証する

def check_sg_references(ec2_client, group_id):
    """
    Check if a security group is referenced in other security groups' rules
    """
    try:
        # Check if the security group is referenced in other groups
        response = ec2_client.describe_security_groups(
            Filters=[
                {
                    'Name': 'ip-permission.group-id',
                    'Values': [group_id]
                }
            ]
        )

        referencing_groups = response['SecurityGroups']

        # Check for egress rules
        response = ec2_client.describe_security_groups(
            Filters=[
                {
                    'Name': 'egress.ip-permission.group-id',
                    'Values': [group_id]
                }
            ]
        )

        referencing_groups.extend(response['SecurityGroups'])

        return referencing_groups

    except ClientError as e:
        print(f"Error checking security group references: {str(e)}")
        return None
ログイン後にコピー
  • 未使用のセキュリティ グループの検証: この最後のステップでは、スクリプトはまず未使用のセキュリティ グループを取得します。次に、未使用のグループごとに、他のセキュリティ グループがルール内でそのグループを参照しているかどうかを確認します。
  • 出力: スクリプトはグループが参照されているかどうかを出力し、参照されていない場合は安全に削除できます。

スクリプトの実行

スクリプトを実行するには、validate_unused_groups 関数を実行するだけです。たとえば、リージョンを us-east-1 に設定すると、スクリプトは次のようになります:

  1. us-east-1 のすべてのセキュリティ グループとネットワーク インターフェイスを取得します。
  2. 未使用のセキュリティ グループを特定します。
  3. これらの未使用のグループが他のセキュリティ グループによって参照されているかどうかを検証してレポートします。

出力例

def validate_unused_groups(region='us-east-1'):
    """
    Validate and provide detailed information about unused security groups
    """
    ec2_client = boto3.client('ec2', region_name=region)
    unused_groups = get_unused_security_groups(region)

    if not unused_groups:
        return

    print("\nValidating security group references...")
    print("-" * 80)

    for group in unused_groups:
        group_id = group['GroupId']
        referencing_groups = check_sg_references(ec2_client, group_id)

        if referencing_groups:
            print(f"\nSecurity Group {group_id} ({group['GroupName']}) is referenced by:")
            for ref_group in referencing_groups:
                print(f"- {ref_group['GroupId']} ({ref_group['GroupName']})")
        else:
            print(f"\nSecurity Group {group_id} ({group['GroupName']}) is not referenced by any other groups")
            print("This security group can be safely deleted if not needed")
ログイン後にコピー

結論

このスクリプトを使用すると、AWS で未使用のセキュリティ グループを見つけるプロセスを自動化し、不要なリソースを保持しないようにできます。これにより、不要なリソースが削除されるため、混乱が軽減され、セキュリティ体制が向上し、コストが削減される可能性があります。

このスクリプトは次のように拡張できます。

  • タグ、VPC、またはその他の基準に基づいて追加のフィルタリングを処理します。
  • 未使用のグループが検出された場合に、より高度なレポートまたはアラートを実装します。
  • AWS Lambda と統合して、自動化されたスケジュールされたチェックを実行します。

AWS 環境を安全に保ち、整理整頓してください!

以上がPython と Boto3 を使用した AWS の未使用のセキュリティ グループの検索と検証の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート