প্রায় এক বছর অব্যক্ত ব্যবহারের পরে, আমি আমার AWS ইসি 2 সুরক্ষা গোষ্ঠীগুলি নিরীক্ষণ এবং উত্তরাধিকার, অব্যবহৃত গোষ্ঠীগুলি পরিষ্কার করার প্রয়োজন মনে করেছি।
ওয়েব জিইউআইয়ের মাধ্যমে সম্পাদন করা এটি একটি কঠিন কাজ ছিল, সুতরাং আমি কাজটি আরও সহজ করার জন্য আমি ডাব্লুএসএস সিএলআইয়ের দিকে চেয়েছিলাম। স্ট্যাকওভারফ্লোতে এটি কীভাবে করা যায় সে সম্পর্কে আমি একটি সূচনা পেয়েছি, তবে এটি সম্পূর্ণরূপে ছিল না। তাই আমি নিজের স্ক্রিপ্ট লেখার সিদ্ধান্ত নিয়েছি। নিম্নলিখিতগুলি সম্পাদন করার জন্য আমি এডাব্লুএস সিএলআই, মাইএসকিউএল এবং কিছু "বাশ-ফু" ব্যবহার করেছি:
সমস্ত ইসি 2 সুরক্ষা গোষ্ঠীর একটি তালিকা পান। আমি লোকালহোস্টে aws_security_groups নামক একটি মাইএসকিউএল ডাটাবেসে "গোষ্ঠী" নামে একটি টেবিলে গ্রুপ-আইডি, গোষ্ঠীর নাম এবং বিবরণ সংরক্ষণ করি। প্রাপ্ত গোষ্ঠীর সংখ্যাটি ব্যবহারকারীকে জানানো হয়েছে is
নিম্নলিখিত প্রতিটি পরিষেবার সাথে যুক্ত সমস্ত সুরক্ষা গোষ্ঠীর একটি তালিকা পান এবং তাদের টেবিল থেকে বাদ দিন: ইসি 2 আইটেমস ইসি 2 ইলাস্টিক লোড ব্যালান্সারস ডাব্লুএস আরডিএস উদাহরণ অ্যাডাব্লুএস অপস ওয়ার্কস (অ্যামাজনে অপসারণ করা উচিত নয়) ডিফল্ট সুরক্ষা গোষ্ঠীগুলি (মোছা যাবে না) ) ইলাস্টিচে
প্রতিটি পরিষেবার জন্য আমি বাদ পড়ার পরে টেবিলের মধ্যে থাকা গ্রুপগুলির সংখ্যার একটি গণনা রিপোর্ট করি।
- অবশেষে আমি গ্রুপ-আইডি, গোষ্ঠীর নাম এবং যে গোষ্ঠীগুলি রেখে গেছে তার জন্য বিবরণ প্রদর্শন করব। এগুলি হ'ল "অব্যবহৃত" গোষ্ঠী যা নিরীক্ষণ এবং / অথবা মুছে ফেলা দরকার। আমি খুঁজে পেয়েছি যে এসজি এর উদাহরণস্বরূপ এবং ইলাস্টিক লোড ব্যালান্সার (ইএলবি) এর মধ্যে প্রায়শই একে অপরকে উল্লেখ করে। ক্রস রেফারেন্সগুলি সরিয়ে দেওয়ার এবং সুরক্ষা গোষ্ঠীগুলি মোছার আগে তারা সত্যিকারের ব্যবহারে নেই তা নিশ্চিত করার জন্য কিছু ম্যানুয়াল তদন্ত করা ভাল অনুশীলন। তবে আমার স্ক্রিপ্টটি কমপক্ষে এটি ম্যারেজযোগ্য কিছুতে পেরেজ করে।
দ্রষ্টব্য: ১. আপনি আপনার মাইএসকিউএল হোস্ট, ব্যবহারকারীর নাম এবং পাসওয়ার্ড সংরক্ষণ করতে একটি ফাইল তৈরি করতে চান এবং এতে to ডিবিসিএনএফআইপি ভেরিয়েবলটি নির্দেশ করতে পারেন। এটি এর মতো কাঠামোযুক্ত হওয়া উচিত:
[mysql]
host=your-mysql-server-host.com
user=your-mysql-user
password=your-mysql-user-password
- আপনি ইচ্ছে করলে ডাটাবেসের নাম পরিবর্তন করতে পারেন - স্ক্রিপ্টে $ 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/'
এবং এখানে ডেটাবেস তৈরির জন্য বুদ্ধি রয়েছে।
-- 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