[AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する
はじめに
AWSのEC2にはSecurityGroupと呼ばれるファイアウォールがあります。"指定したIPアドレスから、特定のポートのみアクセスが可能"といった指定をすることでセキュリティを上げることができます。
ただ、会社のような固定IPを持った場所からのアクセスではよいのですが、モバイル機器などを用いる場合は毎回IPアドレスを指定するというのは非現実的です。というわけで、スクリプトをつくって省力化してみました。
sshをする前にSecurityGroupに自分の利用しているIPによるSSHを許可して、ssh終了後に追加したルールを削除するというスクリプトです
VPNを使うのが本筋だとはおもいますが、いつもできるというわけではないので、役に立つ場合もあるかもしれません。
スクリプトの概要と実行結果
myssh.sh というシェルスクリプトを作ってみました。短かいコードですのでまずはコードを全部のせます。
#!/bin/sh export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXX (アクセスキー) export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX (秘密アクセスキー) export AWS_DEFAULT_REGION=ap-northeast-1 MYSECURITYGROUP=sg-XXXXXXXXX (セキュリティグループのID) SSH_ARGUMENTS='myserver' MYIP=`curl -s ifconfig.me` aws ec2 authorize-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32 ssh $SSH_ARGUMENTS aws ec2 revoke-security-group-ingress --group-id $MYSECURITYGROUP --protocol tcp --port 22 --cidr $MYIP/32
最初の3行はaws cliを用いるのに利用するための環境変数の設定です。
6行目は変更したいセキュリティグループのIDを指定してください。SGで始まります。
7行目はsshの引数を指定します。後程説明しますが、ssh_configに設定するhost myserverを指定しています。
8行目は、自分の端末のpublic IPを返してくれるifconfig.meというサイトを利用してIPアドレスをMYIPというシェル変数にいれています。
10行目からがスクリプトの本体で、10行目でセキュリティグループへingressルールの追加、11行目でssh、12行目でingressルールの無効化を行なっています。
次に~/.ssh/configファイルを編集します。こちらはsshの接続設定を行なうファイルです。 こんなかんじに設定します。
$cat ~/.ssh/config ServerAliveInterval=60 PubkeyAuthentication yes Host myserver Hostname ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com User ec2-user IdentityFile ~/.ssh/id_rsa_ec2.pem Port 22 $
Host myserverという部分がssh実行時に読みこまれ、sshのパラメータとして利用されます。
ssh myserver
は
ssh -i ~/.ssh/id_rsa_ec2.pem -p 22 ec2-user@ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
と等価となります
実行してみる
では実行してみましょう。
$ ./myssh.sh { "return": "true" } Last login: Sat May 10 06:37:10 2014 from XXXXXX.ne.jp __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/ 1 package(s) needed for security, out of 18 available Run "sudo yum update" to apply all updates. [ec2-user@ip-XXX-XXX-XXX-XXX ~]$ exit logout Connection to ec2-XXX.XXX.XXX.XXX.ap-northeast-1.compute.amazonaws.com closed. { "return": "true" } $
うまくうごきましたね。 { "return": "true" }というのはaws cliが実行された時の結果です。scriptでは特になにもしていませんが、この結果を確認してエラーを返す等したほうが親切かもしれません。
まとめ
SSHする前にingressフィルタを追加し、SSH実行後にそのフィルタを削除するスクリプトを作りました。
同時に複数実行したりするとフィルタが消えてしまうので、運用に使うのは難しいかもしれませんが、
ここは人力でなんとかできるかなとおもいます。
それにしても、aws cliは便利ですね。