AWSのセキュリティグループをコマンドで、ファイル出力して取得したい場合のやり方。
備忘兼メモ。
前提
- CloudShell利用
- またはAWSCLIがあるUNIX系マシン
おすすめはCloudShell
やり方
行が複数に分かれていますが、行の末尾に「\」で改行しているため、全行をまるごとコピーペーストしてもOK。
情報取得系
- セキュリティグループ インバウンドルール抽出(全SG、全インバウンドルールを表示)
CSVFILE=securitygroup-inboundrules.csv;\
echo "SgGrpDescription,SgGrpID,SgName,RuleType,PortRangeStart,Protocol,PortRangeEnd,IPType,IPRange,RuleDescription" > ${CSVFILE};\
aws ec2 describe-security-groups --query 'SecurityGroups[].{Name:GroupName, Description:Description, GroupId:GroupId, IngressRules:IpPermissions}' --output=text \
| tr "\t" "," \
| sed -e 's/^INGRESSRULES/,,,INGRESSRULES/g' -e 's/^IPRANGES/,,,,,,,IPRANGES/g' -e 's/^PREFIXLISTIDS/,,,,,,,PREFIXLISTIDS/g' \
>> ${CSVFILE}
securitygroup-inboundrules.csvがカレントにできるので、それをダウンロード。
1行目でCSVファイル名を定義。2行目でCSVのヘッダ部分を追記。3行目でセキュリティグループを取得。4行目で取得結果を整形(tr)。5行目で空欄、タブ部分をCSV化するためにカンマ区切りに変更。6行目でそれらの内容をCSVにぶっこみ。
最終的にこれにいきついたが、それまでにいくつか試行錯誤があった。
- セキュリティグループの一覧を表示
中身のルールではなく、セキュリティグループがいくつあるか、IDがなにかを見たいときに使う。
aws ec2 describe-security-groups --query 'SecurityGroups[].{Name:Tags[?Key==`Name`].Value|[0], SGId:GroupId, VpcId:VpcId, Description:Description}'
Name:Tags[?Key==``Name``].Value|[0],
の部分は、タグの名前なので自身の環境の値(Key==Nameの部分)は置き換える。
表示されたら、スペースで次へ進み、止めるときはqを押す。
- セキュリティグループの一覧を表示:CSV出力
先のコマンドをCSVに吐く場合の方法。
aws ec2 describe-security-groups --query 'SecurityGroups[].{Name:Tags[?Key==`Name`].Value|[0], SGId:GroupId, VpcId:VpcId, Description:Description}' \
| jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' > sg-all-list.csv
Name:Tags[?Key==``Name``].Value|[0],
の部分は、タグの名前なので自身の環境の値(Key==Nameの部分)は置き換える。
sg-all-list.csvがカレントにできるので、それをダウンロード。
- セキュリティグループ インバウンドルール抽出(特定SGのIDを指定して、インバウンドルールの許可IPを表示)
そのセキュリティグループが、どのIPを許可しているのかを見たいとき用。
aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXXXXXXXX --output=json --query 'SecurityGroups[].IpPermissions[].IpRanges[].{IP: CidrIp, Description: Description}' | jq -r ".[] | [.IP,.Description] | @csv"
sg-XXXXXXXXXXXXXXXXX は見たいセキュリティグループのIDに置換する。
- セキュリティグループ インバウンドルール抽出(特定SGのIDを指定して、インバウンドルールの許可IPを表示):CSV出力
先のコマンドをCSVに吐く場合の方法。
aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXXXXXXXX --output=json --query 'SecurityGroups[].IpPermissions[].IpRanges[].{IP: CidrIp, Description: Description}' | jq -r ".[] | [.IP,.Description] | @csv" > sg-XXXXXXXXXXXXXXXXX-allowiplist.csv
sg-XXXXXXXXXXXXXXXXX は見たいセキュリティグループのIDに置換する。
sg-XXXXXXXXXXXXXXXXX-allowiplist.csvがカレントにできるので、それをダウンロード。
追加
- インバウンドルールの追加
aws ec2 authorize-security-group-ingress \
--group-id sg-XXXXXXXXXXXXXXXXX \
--ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=XXX.XXX.XXX.XXX/32,Description="https allow"}]'
sg-XXXXXXXXXXXXXXXXX は対象のセキュリティグループIDに置換する。
IpProtocol=tcp,FromPort=443,ToPort=443は、穴あけしたいプロトコル、ポート番号のレンジに適宜修正。CidrIp=XXX.XXX.XXX.XXX/32は空けたいIPを記載。Descriptionは説明欄なので、ここではhttpsポートを空けてますよ、と書いているが任意適宜修正。
削除
- インバウンドルールの削除
aws ec2 revoke-security-group-ingress \
--group-id sg-XXXXXXXXXXXXXXXXX \
--ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=XXX.XXX.XXX.XXX/32}]'
sg-XXXXXXXXXXXXXXXXX は対象のセキュリティグループIDに置換する。
IpProtocol=tcp,FromPort=443,ToPort=443は、設定されていて、なおかつ閉じる予定のプロトコル、ポート番号のレンジに適宜修正。CidrIp=XXX.XXX.XXX.XXX/32のIPについても設定済みなおかつ閉じたいIPを記載。
参考
【AWS CLI】セキュリティグループのルールの一覧が欲しい!
https://blog.serverworks.co.jp/aws-cli-security-group-rules
CLIを利用して特定のSGに紐づいたEC2一覧とSGルール内容一覧を作成する
https://cloud5.jp/cli-sg-data-get/