話題の記事

[AWS][CLI] EC2にSSHするときだけ、security groupに自分のアドレスを追加する

2014.05.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

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は便利ですね。