私のAWSの構成図です。
管理者は、SSHで接続する時にまず踏み台サーバーにアクセスし、そこからWebサーバーへアクセスします。
更にデータベースへのアクセスはWebサーバー経由で行ない、直接Webサーバーやデータベースへは接続できない構成になっています。
このため不便ですが、サーバー内に入って作業する時は段階的にSSH接続する必要がありました。
そこまではあまり問題がなかったのですが、データベースをGUI環境で操作したい時に困りました。
データベース用GUIソフトのSequelProです。
これは、1度の接続でデータベースまで到達する必要があります。つまり、踏み台を乗り越えて接続する必要があるということです。
調べてみた結果、「多段SSH」なるものがあり、これを解決したのでここに備忘録として残しておきます。
※公開鍵と秘密鍵を既に作成しており、これを用いてSSH接続できる事を前提とします。
以上に詳しく載っています。
今回の流れは、今まで段階的に接続していたものを、一気にWebサーバーまで接続します。
その後にDBへ接続して、完了です。
パーミッションがシビアですので、以上のqiitaを参考にパーミッション確認を行なってください。
$ cd ~/.ssh
.sshに移動
$ ls -la
権限を含めたファイル一覧表示(パーミッション確認)
$ vim config
configファイル編集する
まず、踏み台サーバーまでの接続を行う編集です。
Host ec2-bas
HostName *.*.*.*
User ec2-user
IdentityFile ~/Desktop/hoge/bastion.pem
Port 49200
Host:接続時に使う名前です(なんでもいいです)。
HostName:踏み台サーバーに割り当てられているElasticIPアドレスを指定します。グローバルIPアドレスです。
User:そのサーバーに接続ができるユーザーを設定します。
IdentityFile:秘密鍵の場所を指定します。私の場合は、.sshディレクトリではなく、Desktopに置いてあるのでそちらを指定しています。
Port:そのサーバーに接続する時のポート番号を指定します。デフォルトだとSSHは22番ポートですが、セキュリティを考慮し、変えています。
$ ssh ec2-bas
.sshディレクトリ上で、以上のコマンドで接続できるか試してみてください。
接続できたら一旦ログアウトしてもらい、次にWebサーバーへの接続を追記します。
先ほど記述したec2-basの下に以下を追記します。
Host ec2-web
HostName *.*.*.*
User hoge
IdentityFile ~/Desktop/hoge/id_rsa
Port 49200
ProxyCommand ssh ec2-bas -W %h:%p
ec2-basと書き方は変わりません。
自分のWebサーバーは外部からアクセスできないようにElasticIPアドレスを割り当てていません。その場合はローカルIPをHostNameに指定します。
更に、Userには作業用ユーザーを作成し、そのユーザーで接続をするように鍵を設定しましたのでUserもec2-userから変わっています。
最後のProxyCommandにて、ec2-webに接続する際のコマンドを指定しています。これがあるので、まずec2-basに接続した上でec2-webが接続する設定になります。
$ ssh ec2-web
以上のコマンドで接続できたら完了です。
次にSequelProに接続を行います。
MySQLホスト:AWSだと、RDSのホスト名です。それ以外ならMySQLのIPアドレスを指定します。
ユーザ名、パスワード、ポート:MySQLへの接続ユーザー名、パスワード、ポート(デフォルトは3306)です。
その下は先ほど指定したWebサーバーへの接続名(ec2-web)とユーザー名、ポート番号です。
ローカルのパスワードを指定する必要はありません。これはconfigファイルに既に書かれているからです。
これで接続できるかと思います。
最後に多段SCPの方法を残して、終わりたいと思います。
デスクトップにあるhoge.zipをwebサーバー上の/var/www/htmlディレクトリにアップロードする場合を想定しています。
.sshディレクトリ内にて以下のコマンドを行います。
$ scp -P 49200 ~/desktop/hoge.zip ec2-web:/var/www/html
scp -P ポート番号指定 ローカルのファイル名 configに指定した接続名:アップロード先のサーバーディレクトリ名
以上でアップロードもできます。ぜひやってみてください。