こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、拠点のパブリックIP変更に伴い、既存のパブリックIPで通信を許可しているセキュリティグループに 新しいのパブリックIP用のルールを追加したいという要望があり、その対応をAWS CLIで実施したため、使ったコマンドをご紹介いたします。
利用するコマンド,サブコマンド
まず、AWS CLIの構造は以下の通りです。
aws <command> <subcommand> [options and parameters]
上記を前提に今回使う <command>,<subcommand>
は、以下の通りです。
<command>
ec2
<subcommand>
* describe-security-group-rules ⇒セキュリティグループのルールを出力するコマンド * authorize-security-group-ingress ⇒インバウンドルールを変更するコマンド * authorize-security-group-egress ⇒アウトバウンドルールを変更するコマンド
結論
①セキュリティグループを調査するコマンド
特定のIPが含まれるルールを出力
単純にルールの一覧を出力後、grepコマンドで特定のIPが含まれている行だけを出力します。 Windows(powershell)の場合、Select-Stringで代替できるかと存じます。
- コマンド 【特定のIP】の箇所を任意の値を設定します。
aws ec2 describe-security-group-rules --query "SecurityGroupRules[].\ [GroupId,\ IsEgress,\ IpProtocol,\ FromPort,\ ToPort,\ CidrIpv4]" --output text | grep 【特定のIP】
- 実行例
aws ec2 describe-security-group-rules --query "SecurityGroupRules[].\ [GroupId,\ IsEgress,\ IpProtocol,\ FromPort,\ ToPort,\ CidrIpv4]" --output text | grep 2.2.2.2/32
- 出力結果
sg-0c9bbb07e91531dc0 False tcp 443 443 2.2.2.2/32
ヘッダーがないため分かりづらいですが、左から
- セキュリティグループのID
- Egressのルール(Trueの場合、Egress)
- protocol
- from_port
- to_port
- 許可CIDR
になります。
②ルールを追加するコマンド
単一のIPから443のインバウンド通信を許可する場合
aws ec2 authorize-security-group-ingress \ --group-id sg-0c9bbb07e91531dc0 \ --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,\ IpRanges='[{CidrIp=1.1.1.1/32,Description="Access from fukushima house"}]'
単一のIPから8000-8010のインバウンド通信を許可する場合
aws ec2 authorize-security-group-ingress \ --group-id sg-0c9bbb07e91531dc0 \ --ip-permissions IpProtocol=tcp,FromPort=8000,ToPort=8010,\ IpRanges='[{CidrIp=1.1.1.1/32,Description="Access from fukushima house"}]'
複数のIPから443のインバウンド通信を許可する場合
aws ec2 authorize-security-group-ingress \ --group-id sg-0c9bbb07e91531dc0 \ --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,\ IpRanges='[{CidrIp=1.1.1.1/32,Description="Access from fukushima house"},{CidrIp=2.2.2.2/32,Description="Access from fukushima house"}]'
※アウトバウンドのルールを変更したい場合、authorize-security-group-ingressをauthorize-security-group-egressに変更すればOKです。
おまけ
今回はルールの数もそれなりにあったため、ルールを追加するコマンドを以下のコマンドで生成しました。
ルールを追加するコマンド生成コマンド
事前に以下の変数を定義します。
* GREP ルールの一覧に含まれているIPを追加します。 複数ある場合、「|」で区切ります。 * IPRANGES 追加したいIPおよび説明を記載します。 Description内の「"」は、\を前に記載する点がポイントです。
GREP="2.2.2.2/32|3.3.3.3/32" IPRANGES="'[{CidrIp=3.3.3.3/32,Description=\"Access from fukushima house\"},{CidrIp=4.4.4.4/32,Description=\"Access from fukushima house\"}]'"
変数の定義を実施後、以下のコマンドを実行します。
- コマンド
echo "###########################################" ;\ echo "### ルールを追加するコマンドを生成します。" ;\ echo "###########################################" ;\ aws ec2 describe-security-group-rules --query "SecurityGroupRules[].\ [GroupId,\ IsEgress,\ IpProtocol,\ FromPort,\ ToPort,\ CidrIpv4]" --output text | grep -E ${GREP} | while read line do group_id=$(echo $line | awk '{print $1}') if [[ $(echo $line | awk '{print $2}') == True ]] ; then sub_command=authorize-security-group-egress else sub_command=authorize-security-group-ingress fi protocol=$(echo $line | awk '{print $3}') from_port=$(echo $line | awk '{print $4}') to_port=$(echo $line | awk '{print $5}') cat << EOF aws ec2 ${sub_command} \ --group-id ${group_id} \ --ip-permissions IpProtocol=${protocol},FromPort=${from_port},ToPort=${to_port},\ IpRanges=${IPRANGES} EOF done
- 実行結果例
########################################### ### ルールを追加するコマンドを生成します。 ########################################### aws ec2 authorize-security-group-ingress --group-id sg-0c9bbb07e91531dc0 --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=3.3.3.3/32,Description="Access from fukushima house"},{CidrIp=4.4.4.4/32,Description="Access from fukushima house"}]' aws ec2 authorize-security-group-ingress --group-id sg-0c9bbb07e91531dc0 --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=3.3.3.3/32,Description="Access from fukushima house"},{CidrIp=4.4.4.4/32,Description="Access from fukushima house"}]' aws ec2 authorize-security-group-egress --group-id sg-0c9bbb07e91531dc0 --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges='[{CidrIp=3.3.3.3/32,Description="Access from fukushima house"},{CidrIp=4.4.4.4/32,Description="Access from fukushima house"}]'
後は生成されたコマンドを確認し、問題なければコピペで実行します。 もし、コピペもめんどくさいという方がいましたら、上記スクリプトから「cat << EOF」と「EOF」の行を消せば、 コマンドを生成したタイミングで実際にコマンドを実行できます。(がスクリプトを理解していないと危険のため、ご注意ください。)
終わりに
今回は、AWS CLIを使ってセキュリティグループのルールを追加するコマンドをご紹介いたしました。 どなたかのお役に立てれば幸いです。
福島 和弥 (記事一覧)
2019/10 入社
AWS CLIが好きです。
AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。