【AWS CLI】セキュリティグループにルールを追加する方法

記事タイトルとURLをコピーする

こんにちは。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を使ってセキュリティグループのルールを追加するコマンドをご紹介いたしました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

SRE3課

2019/10 入社

AWS CLIが好きです。