はじめに
↓ の機能拡張版で、WAF にも登録するようにスクリプトを修正しました。
仕様
指定された IP アドレスのリストを AWS の SG と WAFに登録するためのスクリプトです。IP アドレスにCIDR 表記("/" が含まれているかどうか)によって条件分岐し、それに応じて適切に SG と WAF に登録します。(デフォルトで /32 を追加します)
コマンド
上記仕様に加えて以下のオプションがあります。
- SG を二つ用意
- SG_ID1 にはポート 3389 で登録、SG_ID2 にはポート 443 で登録
- DESCRIPTION も含め登録する
#!/bin/bash
set -euo pipefail
# 変数格納
IP_ARRAY=("5.5.5.5/32" "6.6.6.6/32" "7.7.7.7" "8.8.8.8/32" "9.9.9.9")
DESCRIPTION=("go" "roku" "nana" "hati" "kyu")
SG_ID1="sg-XXXXXXXXXXXXXXXXX"
SG_ID2="sg-YYYYYYYYYYYYYYYYY"
WAF_ID="XXX"
WAF_NAME="testip"
for (( i=0; i < ${#IP_ARRAY[*]}; i++ )); do
if [ `echo ${IP_ARRAY[$i]} | grep '/'` ]; then
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID1 \
--ip-permissions IpProtocol=tcp,FromPort=3389,ToPort=3389,IpRanges="[{CidrIp=${IP_ARRAY[$i]},Description="${DESCRIPTION[$i]}"}]"
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID2 \
--ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges="[{CidrIp=${IP_ARRAY[$i]},Description="${DESCRIPTION[$i]}"}]"
# waf は一件追加というのが出来ないため、現状の全量 + 更新したい IP を更新する流れ
json=$(aws wafv2 get-ip-set \
--name $WAF_NAME \
--scope REGIONAL \
--region=ap-northeast-1 \
--id $WAF_ID)
IPs=$(echo $json | jq -r '.IPSet.Addresses[]')
LOCK_TOKEN=$(echo $json | jq -r '.LockToken')
# IP更新
aws wafv2 update-ip-set \
--name $WAF_NAME \
--scope REGIONAL \
--region=ap-northeast-1 \
--id $WAF_ID \
--addresses $IPs ${IP_ARRAY[$i]} \
--lock-token $LOCK_TOKEN
else
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID1 \
--ip-permissions IpProtocol=tcp,FromPort=3389,ToPort=3389,IpRanges="[{CidrIp=${IP_ARRAY[$i]}/32,Description="${DESCRIPTION[$i]}"}]"
aws ec2 authorize-security-group-ingress \
--group-id $SG_ID2 \
--ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges="[{CidrIp=${IP_ARRAY[$i]}/32,Description="${DESCRIPTION[$i]}"}]"
json=$(aws wafv2 get-ip-set \
--name $WAF_NAME \
--scope REGIONAL \
--region=ap-northeast-1 \
--id $WAF_ID)
IPs=$(echo $json | jq -r '.IPSet.Addresses[]')
LOCK_TOKEN=$(echo $json | jq -r '.LockToken')
# IP更新
aws wafv2 update-ip-set \
--name $WAF_NAME \
--scope REGIONAL \
--region=ap-northeast-1 \
--id $WAF_ID \
--addresses $IPs ${IP_ARRAY[$i]}/32 \
--lock-token $LOCK_TOKEN
fi
done