Hello! 欢迎来到小浪资源网!



使用 Python 和 Boto3 查找并验证 AWS 中未使用的安全组


使用 Python 和 Boto3 查找并验证 AWS 中未使用的安全组

有效管理 aws 安全组对于维护安全且经济高效的云环境至关重要。安全组是 aws 网络安全的重要组成部分,但随着时间的推移,未使用的安全组会不断累积。这些未使用的组不仅会使您的环境变得混乱,还可能带来安全风险或不必要地增加成本。

在本文中,我们将探讨如何使用 python 和 boto3 识别 aws 环境中未使用的安全组、验证它们并确保它们不被任何其他资源引用。我们还将研究如何安全地确定是否可以删除这些组。

先决条件

要学习本教程,您需要以下内容:

aws 账户:确保您有权访问要搜索未使用的安全组的 aws 环境。
boto3 已安装:您可以通过运行以下命令来安装 boto3 python sdk:

   pip install boto3 

已配置 aws 凭证:确保您使用 aws cli 或使用 iam 角色或环境变量直接在代码中配置了 aws 凭证。

立即学习Python免费学习笔记(深入)”;

代码分解

让我们看一下代码,用于识别给定 aws 区域中未使用的安全组、验证它们并检查它们是否被任何其他组引用。

第 1 步:获取所有安全组和 eni

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" found {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" no unused security groups found in {region}")          return unused_groups      except clienterror as e:         print(f"error retrieving security groups: {str(e)}")         return none 
  • 获取安全组:我们首先调用describe_security_groups方法获取指定区域内的所有安全组。
  • 检索网络接口:接下来,我们使用describe_network_interfaces检索所有网络接口。每个网络接口都可以有一个或多个与其关联的安全组。
  • 识别已使用的安全组:对于每个网络接口,我们将关联的安全组 id 添加到名为used_sg_ids 的集合中。
  • 查找未使用的组:然后我们将安全组 id 与正在使用的组 id 进行比较。如果一个组没有被使用(即它的id不在used_sg_ids集合中),我们认为它没有被使用,除了默认的安全组,它不能被删除。

步骤 2:检查安全组引用

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 
  • 检查引用:此函数检查特定安全组是否被任何其他安全组引用。它通过根据入站 (ip-permission.group-id) 和出站 (egress.ip-permission.group-id) 规则过滤安全组来实现此目的。
  • 返回引用组:如果引用组,则该函数返回引用安全组的列表。如果没有,则返回 none。

步骤 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(" validating 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" security 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" security group {group_id} ({group['groupname']}) is not referenced by any other groups")             print("this security group can be safely deleted if not needed") 
  • 验证未使用的安全组:在最后一步中,脚本首先检索未使用的安全组。然后,对于每个未使用的组,它会检查是否有任何其他安全组在其规则中引用它。
  • 输出:脚本输出该组是否被引用,如果没有,则可以安全删除。

运行脚本

要运行脚本,只需执行 validate_unused_groups 函数即可。例如,当区域设置为 us-east-1 时,脚本将:

  1. 检索 us-east-1 中的所有安全组和网络接口。
  2. 识别未使用的安全组。
  3. 验证并报告这些未使用的组是否被其他安全组引用。

示例输出

Found 5 unused security groups in us-east-1: -------------------------------------------------------------------------------- Security Group ID: sg-12345678 Name: unused-sg-1 Description: Unused security group VPC ID: vpc-abcde123 -------------------------------------------------------------------------------- Security Group sg-12345678 (unused-sg-1) is not referenced by any other groups This security group can be safely deleted if not needed -------------------------------------------------------------------------------- Security Group ID: sg-23456789 Name: unused-sg-2 Description: Another unused group VPC ID: vpc-abcde123 -------------------------------------------------------------------------------- Security Group sg-23456789 (unused-sg-2) is referenced by: - sg-34567890 (some-other-sg) 

结论

使用此脚本,您可以自动执行在 aws 中查找未使用的安全组的过程,并确保您不会保留不必要的资源。这有助于减少混乱、改善安全状况,并可能通过删除未使用的资源来降低成本。

您可以将此脚本扩展为:

  • 根据标签、vpc 或其他条件处理额外的过滤。
  • 在检测到未使用的组时实施更高级的报告或警报。
  • 与 aws Lambda 集成以进行自动定期检查。

确保您的 aws 环境安全且组织良好!

相关阅读