この記事は公開されてから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は便利ですね。