SSH

2段階SSH接続を,ProxyCommandを使って一度のsshコマンドで接続する

More than 5 years have passed since last update.

以下のような構成を考える.Localは手元のサーバ,Server1は踏み台用サーバ,Server2がターゲットとなるサーバです.

2step_ssh_image

通常,何も設定していない場合は,LocalからServer1にssh接続し,Server1からServer2にssh接続します.

Local$ ssh account1@Server1

Server1$ ssh account2@Server2

あるいは

ssh -t account1@Server1 "ssh account2@Server2"

今回は,LocalからServer1には公開鍵認証方式を使って接続し,LocalからServer2へ一発のコマンドで接続する事を考える.

(Server1からServer2への接続は常にパスワードの入力を要求するように残しておくため,Server1からServer2への接続には公開鍵認証方式を用いなかった)


LocalからServer1に公開鍵認証で接続する

1.まず,Server1へ接続する

ssh account1@Server1

sshの設定で鍵の利用ができるかは「/etc/sssshd_config 」か,「/etc/ssh/sshd_config」で確認できると思う.

2.「.ssh」ディレクトリへ移動し,RSAで暗号化された鍵を生成する

cd .ssh

ssh-keygen -t rsa

パスフレーズを入力してできる「id_rsaが秘密鍵」「id_rsa.pubが公開鍵」です.

3.公開鍵をauthrized_keysとして保存し,古い公開鍵は削除する

cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys

rm id_rsa.pub

4.パーミッションを変更し,ログアウトする

chmod 600 ~/.ssh/authorized_keys

logout

5.Localの「.ssh」ディレクトリへ移動し,秘密鍵をローカルへ保存する(本当はネットワーク越しに送るべきではないですが・・・)

cd .ssh

scp account1@Server1:~/.ssh/id_rsa ~/.ssh/server1_rsaKey

接続できるか確認

ssh -i server1_rsaKey account1@Server1


ProxyCommandを使って,LocalからServer2までssh接続する

ProxyCommandは,sshクライアントと標準入出力でやりとりしてくれるみたい.詳しくは「多段 ssh / rsync するために ProxyCommand を使ってみる - daily dayflower」あたりを参照.

1.「.ssh/config」に,ssh接続ごとに,接続に関する情報を以下のように書き込む

Host S1

HostName Server1
User account1
IdentityFile ~/.ssh/server1_rsaKey
Host S2
HostName Server2
User account2
ProxyCommand ssh S1 nc %h %p


  1. 以上より,LocalからServer2へssh接続するには,以下のコマンドでできるようになる.

ssh S2

LocalからS1(Server1)へは,公開鍵認証で接続しているのでパスフレーズを覚えてなくてもバックグラウンドで接続し,S2(Server2)への接続を試みてくれる.

これで,ssh接続を利用するscp等も,以下のように省略して利用できる

scp -r S2:/path/to/data /local/path/downloadData

ただ,以下のように書いたrsyncはなぜか利用できなかった

rsync -rav --exclude '/path/to/data/tmp/' S2:/path/to/data /local/path/downloadData