🔒

Security Groupを書き換える

2022/07/16に公開

書き換えるって何を?

ちょっとしたことをEC2でやるときに、さっとログインしたいのでシェルのaliasを書いて[1]いろんなVMにSSHするようにしている[2]。このときSecurityGroupは自端末からのSSHのみを許可したい。ただ、ISPがIPを毎日変えているのでSecurityGroupのSourceIPを頻繁に変更しないと繋がらない。

毎回めんどくさいのでSecurity GroupのIngressをいい感じに書き換えるシェルスクリプトを書いたので置いておく。SecurityGroupには中にSecurityGroupRuleが複数ある。これを全てrevokeして、今のSourceIPのエントリをauthorizeする。

スクリプト

#!/bin/bash

SecurityGroupId="sg-09c8e7c03dd2c0af0"
GlobalIP=$(curl -s inet-ip.info)

echo "Before:"
aws ec2 describe-security-group-rules | \
  jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]'

echo "Deleting existing security rules..."
SecurityRules=$(aws ec2 describe-security-group-rules | \
  jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]' | \
  jq '[.[].SecurityGroupRuleId]')

for sgr in $(echo $SecurityRules | jq -r '.[]'); do
  aws ec2 revoke-security-group-ingress \
    --group-id $SecurityGroupId \
    --security-group-rule-ids $sgr
done

echo "Adding current source ip address..."
aws ec2 authorize-security-group-ingress \
  --group-id $SecurityGroupId \
  --protocol tcp \
  --port 22 \
  --cidr $GlobalIP/32 

echo "After:"
aws ec2 describe-security-group-rules | \
  jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]'

ちょっとつまったのはjqにシェル変数を渡す方法。上にあるようにjq --arg name $shell_valuableとやると参照できるようになる。

結果

さーやろう!というときにSSHが繋がらなくて、いちいちWebコンソールに行ってポチポチやる..みたいに出鼻をくじかれることがないのはよい。CLIでやろうにもコマンド絶対すぐに忘れるし。今回JSONの加工はjqに頼り切っている。改めてさわるとjqってスゲーな[3]。なめてましたすいません。

脚注
  1. u1='ssh -i ~/.ssh/aws.pem ubuntu@<ip_address>'みたいな感じ。 ↩︎

  2. Systems Manager Session Managerを使えというのはわかるが、事前にエージェントを..とか、接続時に微妙なラグが..とかでそれはそれでめんどくさい。 ↩︎

  3. AWS CLIにもfilterqueryがあるのでそれでもいいかもしれない。いや、ないなぁ。 ↩︎

Discussion