วิธีค้นหากลุ่มความปลอดภัยที่ไม่ได้ใช้ Amazon EC2


93

ฉันพยายามหาวิธีกำหนดกลุ่มความปลอดภัยเด็กกำพร้าเพื่อที่ฉันจะได้ทำความสะอาดและกำจัดพวกมัน มีใครรู้วิธีค้นหากลุ่มความปลอดภัยที่ไม่ได้ใช้

ไม่ว่าจะผ่านคอนโซลหรือด้วยเครื่องมือบรรทัดคำสั่งก็จะทำงานได้ (การเรียกใช้เครื่องมือบรรทัดคำสั่งบนเครื่อง linux และ OSX)


4
My Kingdom สำหรับคำตอบที่ตอบคำถามนี้ได้อย่างสมบูรณ์โดยไม่มีข้อยกเว้นสำหรับออบเจ็กต์ที่ไม่ใช่อินสแตนซ์ที่มีอายุการใช้งานยาวนาน (RDS, ELBs, ALBs) ที่สามารถกำหนด SG ให้กับพวกเขาได้และไม่เกี่ยวข้องกับ 'เลือกทั้งหมดแล้วลบ' วันหยุดสุดสัปดาห์ที่น่ากลัว - วิธีการทำลาย :)
Jesse Adelman

คำตอบ:


78

หมายเหตุ: สิ่งนี้จะพิจารณาเฉพาะการใช้ความปลอดภัยใน EC2 ไม่ใช่บริการอื่น ๆ เช่น RDS คุณจะต้องทำงานเพิ่มเติมเพื่อรวมกลุ่มความปลอดภัยที่ใช้ภายนอก EC2 สิ่งที่ดีคือคุณไม่สามารถทำได้อย่างง่ายดาย (อาจเป็นไปไม่ได้) ในการลบกลุ่มความปลอดภัยที่ใช้งานอยู่หากคุณพลาดบริการที่เกี่ยวข้องกับบริการอื่น

เมื่อใช้เครื่องมือ AWS CLI ที่ใหม่กว่าฉันพบวิธีง่ายๆในการรับสิ่งที่ต้องการ:

ขั้นแรกรับรายชื่อกลุ่มความปลอดภัยทั้งหมด

aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'

จากนั้นได้รับกลุ่มรักษาความปลอดภัยทั้งหมดที่เชื่อมโยงกับอินสแตนซ์แล้วประปาsortแล้วuniq:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq

จากนั้นนำมารวมกันและเปรียบเทียบทั้ง 2 รายการและดูสิ่งที่ไม่ได้ใช้จากรายการหลัก:

comm -23  <(aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'| sort) <(aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq)

1
@Erik ใช่ฉันมีเพียงภูมิภาคเดียวและสคริปต์ AWS มีการตั้งค่าภูมิภาคหลักผ่านตัวแปรสภาพแวดล้อม ฉันสนใจที่จะดูสคริปต์นี้ในเวอร์ชันหลายภูมิภาค
เรย์

1
คุณอาจต้องการเพิ่ม --filter สำหรับ vpc ของคุณเพื่อที่คุณจะได้ไม่ต้องเห็น
vpc

2
ELB อาจใช้กลุ่มความปลอดภัย คำสั่งนี้จะแสดงรายการชุดรหัสกลุ่มความปลอดภัย uniq ที่อ้างอิงโดย ELB ในภูมิภาคเริ่มต้น:aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].SecurityGroups[*]' --output text | tr '\t' '\n' | sort | uniq
astletron

2
กลุ่มความปลอดภัย EC2 อาจถูกใช้โดยอินสแตนซ์ RDS คำสั่งนี้จะแสดงรายการ ID กลุ่มความปลอดภัยที่ใช้โดยอินสแตนซ์ RDS ในภูมิภาคเริ่มต้น:aws rds describe-db-security-groups --query 'DBSecurityGroups[*].EC2SecurityGroups[*].EC2SecurityGroupId' --output text | tr '\t' '\n' | sort | uniq
aharden

2
คุณยังสามารถใช้aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Groups[*].GroupId' --output text| tr '\t' '\n' | sort | uniqเพื่ออธิบายอินเตอร์เฟสเครือข่าย
Jonathan

63

หากคุณเลือกกลุ่มความปลอดภัยทั้งหมดของคุณในคอนโซล EC2 จากนั้นกดการดำเนินการ -> ลบกลุ่มความปลอดภัยป๊อปอัปจะปรากฏขึ้นเพื่อแจ้งให้คุณทราบว่าคุณไม่สามารถลบกลุ่มความปลอดภัยที่เชื่อมต่อกับอินสแตนซ์กลุ่มความปลอดภัยอื่น ๆ หรืออินเทอร์เฟซเครือข่ายได้ จะแสดงรายการกลุ่มความปลอดภัยที่คุณสามารถลบได้ เช่นกลุ่มความปลอดภัยที่ไม่ได้ใช้ :)


15
แม้ว่าฉันจะต้องยอมรับ แต่การใช้ "เลือกทั้งหมด + ลบ" มักไม่ใช่นิสัยที่ดี
Balmipour

3
หากคุณไม่แน่ใจว่าจะใช้งานได้หรือไม่คุณสามารถสร้างกลุ่มความปลอดภัยแบบจำลองและแนบบางสิ่งเข้ากับมันได้ลองลบออกและดูว่าจะไม่ยอมให้คุณ
NLail

2
คุณไม่จำเป็นต้องยืนยันการลบจริงๆในป๊อปอัปจะแสดงรายละเอียดที่สามารถลบได้ (orphan) และไม่สามารถลบได้ จากนั้นคุณสามารถกดยกเลิกแล้วลบเด็กกำพร้า
rjarmstrong

4
สิ่งที่ฉันไม่ได้รับคือสิ่งนี้: หากคอนโซล AWS สามารถเสนอข้อมูลนี้ได้เมื่อคุณทำสิ่งนี้ที่น่ากลัวการซ้อมรบทำไมพวกเขาไม่แบ่งปันวิธีการทำสิ่งเดียวกันผ่าน API ไม่ใช่แบบนี้ไม่ใช่สิ่งที่จำเป็นในสภาพแวดล้อมสนามสีน้ำตาล ...
Jesse Adelman

1
กล้าหาญ :: do it
zanuka

29

นี่คือโค้ดตัวอย่างที่เขียนด้วย boto (Python SDK สำหรับ AWS) เพื่อแสดงรายการกลุ่มความปลอดภัยเทียบกับจำนวนอินสแตนซ์ที่เกี่ยวข้อง

คุณสามารถใช้ตรรกะนี้เพื่อรับสิ่งเดียวกันในบรรทัดคำสั่งได้เช่นกัน

รหัส Boto

import boto
ec2 = boto.connect_ec2()
sgs = ec2.get_all_security_groups()
for sg in sgs:
    print sg.name, len(sg.instances())

เอาต์พุต

Security-Group-1 0
Security-Group-2 1
Security-Group-3 0
Security-Group-4 3

ดีและง่าย! ขอบคุณ
Chris Koston

6
ดีใช่ แต่สิ่งที่เกี่ยวกับ elbs?
Ilja

โปรดทราบว่าสิ่งนี้รวมถึงอินสแตนซ์ที่กำลังทำงานอยู่เท่านั้น คุณไม่สามารถลบ SG ที่เชื่อมโยงกับอินสแตนซ์ที่หยุดได้เช่นกัน
AgDude

6
สิ่งนี้ไม่สนใจอินเทอร์เฟซจากบริการเช่น RDS RDS เป็นเจ้าของอินสแตนซ์ แต่คุณเป็นเจ้าของ ENI ฉันคิดว่า ElasticSearch และ ELB ทำงานในลักษณะเดียวกันและจะไม่ปรากฏขึ้นพร้อมกับสคริปต์นี้
rajat banerjee

6

หลังจากใช้งานโดยไม่ได้ตรวจสอบประมาณหนึ่งปีฉันพบว่าจำเป็นต้องตรวจสอบกลุ่มความปลอดภัย AWS EC2 ของฉันและล้างกลุ่มเดิมที่ไม่ได้ใช้

นี่เป็นงานที่น่ากลัวในการดำเนินการผ่านเว็บ GUI ดังนั้นฉันจึงมองไปที่ AWS CLI เพื่อทำให้งานง่ายขึ้น ฉันพบจุดเริ่มต้นในการทำสิ่งนี้ที่ StackOverflow แต่ก็ยังไม่เสร็จสมบูรณ์ ผมจึงตัดสินใจเขียนบทของตัวเอง ฉันใช้ AWS CLI, MySQL และ“ Bash-foo” เพื่อทำสิ่งต่อไปนี้:

  1. รับรายชื่อกลุ่มความปลอดภัย EC2 ทั้งหมด ฉันเก็บ group-id, group-name และ description ไว้ใน tabled ที่เรียกว่า "groups" ในฐานข้อมูล MySQL ที่เรียกว่า aws_security_groups บน localhost จำนวนกลุ่มทั้งหมดที่พบจะถูกรายงานไปยังผู้ใช้

  2. รับรายชื่อกลุ่มความปลอดภัยทั้งหมดที่เชื่อมโยงกับแต่ละบริการต่อไปนี้และแยกออกจากตาราง: EC2 Istances EC2 Elastic Load Balancers AWS RDS Instances AWS OpsWorks (ไม่ควรนำออกต่อ Amazon) กลุ่มความปลอดภัยเริ่มต้น (ไม่สามารถลบได้ ) ElastiCache

สำหรับแต่ละบริการฉันรายงานจำนวนกลุ่มที่เหลือในตารางหลังจากการยกเว้นเสร็จสมบูรณ์

  1. ในที่สุดฉันก็แสดง group-id, group-name และ description สำหรับกลุ่มที่เหลือ กลุ่มเหล่านี้คือกลุ่มที่ "ไม่ได้ใช้" ที่ต้องได้รับการตรวจสอบและ / หรือลบออก ฉันพบว่า SG ระหว่างอินสแตนซ์และ Elastic Load Balancers (ELB) มักจะอ้างถึงกัน แนวทางปฏิบัติที่ดีที่สุดในการตรวจสอบด้วยตนเองเพื่อให้แน่ใจว่าไม่มีการใช้งานจริงก่อนที่จะลบการอ้างอิงโยงและลบกลุ่มความปลอดภัย แต่อย่างน้อยสคริปต์ของฉันก็แยกสิ่งนี้ออกไปเป็นสิ่งที่จัดการได้ไม่ดี

หมายเหตุ: 1. คุณจะต้องสร้างไฟล์เพื่อจัดเก็บโฮสต์ MySQL ชื่อผู้ใช้และรหัสผ่านของคุณและชี้ตัวแปร $ DBCONFIG ไปที่มัน ควรมีโครงสร้างดังนี้:

[mysql]
host=your-mysql-server-host.com
user=your-mysql-user
password=your-mysql-user-password
  1. คุณสามารถเปลี่ยนชื่อของฐานข้อมูลได้หากต้องการ - อย่าลืมเปลี่ยนตัวแปร $ DB ในสคริปต์

โปรดแจ้งให้เราทราบหากคุณพบว่าสิ่งนี้มีประโยชน์หรือมีความคิดเห็นการแก้ไขหรือการปรับปรุงใด ๆ

นี่คือสคริปต์

#!/bin/bash
# Initialize Variables
DBCONFIG="--defaults-file=mysql-defaults.cnf"
DB="aws_security_groups"
SGLOOP=0
EC2LOOP=0
ELBLOOP=0
RDSLOOP=0
DEFAULTLOOP=0
OPSLOOP=0
CACHELOOP=0
DEL_GROUP=""

# Function to report back # of rows
function Rows {
    ROWS=`echo "select count(*) from groups" | mysql $DBCONFIG --skip-column-names $DB`
#   echo -e "Excluding $1 Security Groups.\nGroups Left to audit: "$ROWS
    echo -e $ROWS" groups left after Excluding $1 Security Groups."
}


# Empty the table
echo -e "delete from groups where groupid is not null" | mysql $DBCONFIG $DB

# Get all Security Groups
aws ec2 describe-security-groups --query "SecurityGroups[*].[GroupId,GroupName,Description]" --output text > /tmp/security_group_audit.txt
while IFS=$'\t' read -r -a myArray
do
    if [ $SGLOOP -eq 0 ];
    then
        VALUES="(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
    else
        VALUES=$VALUES",(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
    fi
    let SGLOOP="$SGLOOP + 1"
done < /tmp/security_group_audit.txt
echo -e "insert into groups (groupid, groupname, description) values $VALUES" | mysql $DBCONFIG $DB
echo -e $SGLOOP" security groups total."


# Exclude Security Groups assigned to Instances
for groupId in `aws ec2 describe-instances --output json | jq -r ".Reservations[].Instances[].SecurityGroups[].GroupId" | sort | uniq`
do
    if [ $EC2LOOP -eq 0 ];
    then
        DEL_GROUP="'$groupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$groupId'"
    fi
    let EC2LOOP="$EC2LOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "EC2 Instance"
DEL_GROUP=""


# Exclude groups assigned to Elastic Load Balancers
for elbGroupId in `aws elb describe-load-balancers --output json | jq -c -r ".LoadBalancerDescriptions[].SecurityGroups" | tr -d "\"[]\"" | sort | uniq`
do
    if [ $ELBLOOP -eq 0 ];
    then
        DEL_GROUP="'$elbGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$elbGroupId'"
    fi
    let ELBLOOP="$ELBLOOP + 1"
done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "Elastic Load Balancer"
DEL_GROUP=""


# Exclude groups assigned to RDS
for RdsGroupId in `aws rds describe-db-instances --output json | jq -c -r ".DBInstances[].VpcSecurityGroups[].VpcSecurityGroupId" | sort | uniq`
do
    if [ $RDSLOOP -eq 0 ];
    then
        DEL_GROUP="'$RdsGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$RdsGroupId'"
    fi
    let RDSLOOP="$RDSLOOP + 1"
done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "RDS Instances"
DEL_GROUP=""

# Exclude groups assigned to OpsWorks
for OpsGroupId in `echo -e "select groupid from groups where groupname like \"AWS-OpsWorks%\"" | mysql $DBCONFIG $DB`
do
    if [ $OPSLOOP -eq 0 ];
    then
        DEL_GROUP="'$OpsGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$OpsGroupId'"
    fi
    let OPSLOOP="$OPSLOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "OpsWorks"
DEL_GROUP=""

# Exclude default groups (can't be deleted)
for DefaultGroupId in `echo -e "select groupid from groups where groupname like \"default%\"" | mysql $DBCONFIG $DB`
do
    if [ $DEFAULTLOOP -eq 0 ];
    then
        DEL_GROUP="'$DefaultGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$DefaultGroupId'"
    fi
    let DEFAULTLOOP="$DEFAULTLOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "Default"
DEL_GROUP=""

# Exclude Elasticache groups
for CacheGroupId in `aws elasticache describe-cache-clusters --output json | jq -r ".CacheClusters[].SecurityGroups[].SecurityGroupId" | sort | uniq`
do
    if [ $CACHELOOP -eq 0 ];
    then
        DEL_GROUP="'$CacheGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$CacheGroupId'"
    fi
    let CACHELOOP="$CACHELOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "ElastiCache"

# Display Security Groups left to audit / delete
echo "select * from groups order by groupid" | mysql $DBCONFIG $DB | sed 's/groupid\t/groupid\t\t/'

และนี่คือ sql สำหรับสร้างฐานข้อมูล

-- MySQL dump 10.13  Distrib 5.5.41, for debian-linux-gnu (x86_64)
--
-- Host:  localhost   Database: aws_security_groups
-- ------------------------------------------------------
-- Server version   5.5.40-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `groups`
--

DROP TABLE IF EXISTS `groups`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `groups` (
  `groupid` varchar(12) DEFAULT NULL,
  `groupname` varchar(200) DEFAULT NULL,
  `description` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `groups`
--

LOCK TABLES `groups` WRITE;
/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2015-01-27 16:07:44

3

ตัวอย่าง boto ที่พิมพ์รหัสกลุ่มและชื่อเฉพาะของกลุ่มความปลอดภัยที่ไม่มีอินสแตนซ์ปัจจุบัน

นอกจากนี้ยังแสดงวิธีระบุภูมิภาคที่คุณเกี่ยวข้อง

import boto
import boto.ec2
EC2_REGION='ap-southeast-2'
ec2region = boto.ec2.get_region(EC2_REGION)
ec2 = boto.connect_ec2(region=ec2region)
sgs = ec2.get_all_security_groups()
for sg in sgs:
    if len(sg.instances()) == 0:
        print ("{0}\t{1}".format(sg.id, sg.name))

เพื่อยืนยันว่ายังคงใช้กลุ่มความปลอดภัยใดอยู่คุณควรย้อนกลับหรือลบการif len(sg.instances()) == 0ทดสอบและพิมพ์len(sg.instances())ค่าออกมา

เช่น

print ("{0}\t{1}\t{2} instances".format(sg.id, sg.name, len(sg.instances())))

3

การใช้ node.js AWS SDK ฉันยืนยันได้ว่า AWS ไม่อนุญาตให้คุณลบกลุ่มความปลอดภัยที่ใช้งานอยู่ ฉันเขียนสคริปต์ที่พยายามลบกลุ่มทั้งหมดและจัดการข้อผิดพลาดอย่างสง่างาม สิ่งนี้ใช้ได้กับ VPC แบบคลาสสิกและแบบสมัยใหม่ ข้อความแสดงข้อผิดพลาดสามารถดูได้ด้านล่าง

Err { [DependencyViolation: resource sg-12345678 has a dependent object]
  message: 'resource sg-12345678 has a dependent object',
  code: 'DependencyViolation',
  time: Mon Dec 07 2015 12:12:43 GMT-0500 (EST),
  statusCode: 400,
  retryable: false,
  retryDelay: 30 }


1

ไปยัง SG ที่เชื่อมต่อกับอินเทอร์เฟซเครือข่าย:

โดยชื่อ:

aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupName | tr -d '\r' | tr "\t" "\n" | sort | uniq

โดย id:

aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupId | tr -d '\r' | tr "\t" "\n" | sort | uniq

0

มีเครื่องมือในตลาด AWS ที่ทำให้สิ่งนี้ง่ายขึ้นมาก จะแสดงให้คุณเห็นว่ากลุ่มใดถูกแนบ / แยกออกเพื่อให้ง่ายต่อการลบ แต่ยังเปรียบเทียบบันทึกโฟลว์ VPC ของคุณกับกฎกลุ่มความปลอดภัยและแสดงให้คุณเห็นว่ากฎ SG ใดถูกใช้หรือไม่ได้ใช้ AWS โพสต์โซลูชัน ELK-stack เพื่อทำสิ่งนี้ แต่มันซับซ้อนมาก

นี่คือเครื่องมือและข้อจำกัดความรับผิดชอบที่ฉันดำเนินการกับมัน แต่ฉันหวังว่าทุกคนจะพบว่ามันเกี่ยวข้อง: https://www.piasoftware.net/single-post/2018/04/24/VIDEO-Watch-as-we-clean-up-EC2-security-groups-in-just - ไม่กี่นาที


0

น่าเสียดายที่คำตอบที่เลือกไม่ถูกต้องเท่าที่ฉันต้องการ (ฉันพยายามตรวจสอบสาเหตุ แต่ฉันต้องการนำไปใช้)
หากฉันเลือกทั้งหมดNetworkInterfacesโดยมองหาไฟล์แนบใด ๆSecurityGroupฉันจะได้รับผลลัพธ์บางส่วน หากฉันตรวจสอบอย่างเดียวEC2Instancesมันจะทำให้ฉันได้รับผลลัพธ์บางส่วนเช่นกัน

นั่นคือแนวทางของฉันในการแก้ปัญหา:

  1. ฉันได้รับ EC2 SecurityGroups ทั้งหมด -> all_secgrp
  2. ฉันได้รับอินสแตนซ์ EC2 ทั้งหมด -> all_instances
  3. สำหรับแต่ละอินสแตนซ์ฉันจะแนบ SecurityGroups ทั้งหมดมาด้วย
    1. ฉันลบออกจาก all_secgrp แต่ละกลุ่ม SecurityGroup เหล่านี้ (เพราะแนบมา)
  4. สำหรับ SecurityGroup แต่ละกลุ่มฉันตรวจสอบการเชื่อมโยงกับ NetworkInterfaces ใด ๆ (โดยใช้filterฟังก์ชันและการกรองโดยใช้สิ่งนั้นsecurity-group-id)
    1. หากไม่พบการเชื่อมโยงฉันจะลบกลุ่มความปลอดภัยออกจาก all_secgrp

สิ่งที่แนบมาคุณสามารถดูข้อมูลโค้ดได้ อย่าบ่นเรื่องประสิทธิภาพ แต่พยายามเพิ่มประสิทธิภาพหากคุณต้องการ

all_secgrp = list(ec2_connector.security_groups.all())
all_instances = ec2_connector.instances.all()

for single_instance in all_instances:
    instance_secgrp = ec2_connector.Instance(single_instance.id).security_groups
    for single_sec_grp in instance_secgrp:
        if ec2.SecurityGroup(id=single_sec_grp['GroupId']) in all_secgrp:
            all_secgrp.remove(ec2.SecurityGroup(id=single_sec_grp['GroupId']))

all_secgrp_detached_tmp = all_secgrp[:]
for single_secgrp in all_secgrp_detached_tmp:
    try:
        print(single_secgrp.id)
        if len(list(ec2_connector.network_interfaces.filter(Filters=[{'Name': 'group-id', 'Values': [single_secgrp.id]}]))) > 0:
            all_secgrp.remove(single_secgrp)
    except Exception:
        all_secgrp.remove(single_secgrp)

return all_secgrp_detached  

0

นี่เป็นปัญหาที่ยากหากคุณมีกลุ่มความปลอดภัยที่อ้างอิงกลุ่มความปลอดภัยอื่น ๆ ในกฎ ถ้าเป็นเช่นนั้นคุณจะต้องแก้ไข DependencyErrors ซึ่งไม่ใช่เรื่องเล็กน้อย

หากคุณใช้เฉพาะที่อยู่ IP โซลูชันนี้จะใช้งานได้หลังจากที่คุณสร้างไคลเอนต์ boto3:

# pull all security groups from all vpcs in the given profile and region and save as a set
all_sgs = {sg['GroupId'] for sg in client.describe_security_groups()['SecurityGroups']}

# create a new set for all of the security groups that are currently in use
in_use = set()

# cycle through the ENIs and add all found security groups to the in_use set
for eni in client.describe_network_interfaces()['NetworkInterfaces']:
    for group in eni['Groups']:
        in_use.add(group['GroupId'])

unused_security_groups = all_sgs - in_use

for security_group in unused_security_groups:
    try:
        response = client.delete_security_group(GroupId=security_group)
    except ClientError as e:
        if e.response['Error']['Code'] == 'DependencyViolation':
            print('EC2/Security Group Dependencies Exist')
    else:
        print('Unexpected error: {}'.format(e))

นี้จะไม่ SGS ปกใช้โดย RDS
alexandernst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.