如何提取带对应安全组及源信息的AWS EC2实例?
提取EC2实例、关联安全组及含(0.0.0.0/0)的源规则信息
方法一:使用AWS CLI结合Shell脚本
通过组合AWS CLI命令和Shell循环,可直接筛选出目标信息并按指定格式输出:
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, SecurityGroups[*].GroupId]' --output text | while read -r instance_id sg_ids; do for sg_id in $sg_ids; do aws ec2 describe-security-groups --group-ids $sg_id --query "SecurityGroups[*].{GroupId:GroupId, Ingress:IpPermissions[?CidrIpv4=='0.0.0.0/0']}" --output text | while read -r sg_id rule; do if [ -n "$rule" ]; then echo "$instance_id | $sg_id | $rule" fi done done done
命令说明:
- 调用
describe-instances获取所有EC2实例ID及其关联的安全组ID列表 - 遍历每个安全组ID,调用
describe-security-groups查询其入站规则 - 筛选出源CIDR为
0.0.0.0/0的规则,最终按指定格式输出
方法二:使用Python脚本(基于boto3库)
如果需要更灵活的格式定制或后续处理,可使用Python脚本实现:
import boto3 # 初始化EC2客户端 ec2 = boto3.client('ec2') # 打印表头 print("EC2实例 | 安全组 | 含(0.0.0.0/0)的源信息") print("--- | --- | ---") # 遍历所有EC2实例 for reservation in ec2.describe_instances()['Reservations']: for instance in reservation['Instances']: instance_id = instance['InstanceId'] # 遍历实例关联的每个安全组 for sg in instance['SecurityGroups']: sg_id = sg['GroupId'] # 查询安全组详情 sg_details = ec2.describe_security_groups(GroupIds=[sg_id]) for sg_info in sg_details['SecurityGroups']: # 筛选出源为0.0.0.0/0的入站规则 for permission in sg_info['IpPermissions']: for cidr_range in permission.get('IpRanges', []): if cidr_range['CidrIp'] == '0.0.0.0/0': # 整理规则详情 protocol = permission['IpProtocol'] if permission['IpProtocol'] != '-1' else '所有协议' port_info = f"{permission['FromPort']}-{permission['ToPort']}" if 'FromPort' in permission else '所有端口' rule_desc = f"协议: {protocol}, 端口范围: {port_info}, 源CIDR: 0.0.0.0/0" # 按指定格式输出 print(f"{instance_id} | {sg_id} | {rule_desc}")
脚本说明:
- 需提前配置AWS凭证(可通过
~/.aws/credentials文件、环境变量或IAM角色) - 自动遍历所有EC2实例及关联安全组,提取符合条件的规则并以更易读的格式展示
内容的提问来源于stack exchange,提问作者Ceej
相关产品推荐
相关产品推荐

