AWS：セキュリティグループのインバウンドルールを取得、操作

AWSのセキュリティグループをコマンドで、ファイル出力して取得したい場合のやり方。
備忘兼メモ。

# 前提
- CloudShell利用
- またはAWSCLIがあるUNIX系マシン
おすすめはCloudShell
<br>

# やり方
行が複数に分かれていますが、行の末尾に「\」で改行しているため、全行をまるごとコピーペーストしてもOK。

## 情報取得系
- セキュリティグループ　インバウンドルール抽出（全SG、全インバウンドルールを表示）
```shell-session
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にぶっこみ。
最終的にこれにいきついたが、それまでにいくつか試行錯誤があった。
<br>


- セキュリティグループの一覧を表示
中身のルールではなく、セキュリティグループがいくつあるか、IDがなにかを見たいときに使う。
```shell-session
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を押す。
<br>

- セキュリティグループの一覧を表示：CSV出力
先のコマンドをCSVに吐く場合の方法。
```shell-session
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がカレントにできるので、それをダウンロード。
<br>

- セキュリティグループ　インバウンドルール抽出（特定SGのIDを指定して、インバウンドルールの許可IPを表示）
そのセキュリティグループが、どのIPを許可しているのかを見たいとき用。
```shell-session
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に置換する。
<br>

- セキュリティグループ　インバウンドルール抽出（特定SGのIDを指定して、インバウンドルールの許可IPを表示）：CSV出力
先のコマンドをCSVに吐く場合の方法。

```shell-session
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がカレントにできるので、それをダウンロード。
<br>

## 追加

- インバウンドルールの追加
```shell-session
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ポートを空けてますよ、と書いているが任意適宜修正。
<br>

## 削除

- インバウンドルールの削除
```shell-session
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を記載。
<br>


# 参考
【AWS CLI】セキュリティグループのルールの一覧が欲しい！
https://blog.serverworks.co.jp/aws-cli-security-group-rules

CLIを利用して特定のSGに紐づいたEC2一覧とSGルール内容一覧を作成する
https://cloud5.jp/cli-sg-data-get/