第40回において,ターミナルを利用したファイルのやりとりとしてssh/scpコマンドを紹介しました。sshはリモートマシンにログインを行ったり,リモートマシン上でコマンドを実行したりするためのプログラムです。今回はsshに関するTipsを紹介します。
公開鍵の登録
ssh-keygenで生成した公開鍵をリモートマシンの~/.ssh/authorized_keysに追加することで,公開鍵を利用した認証が行えるようになることは第40回で紹介しました。公開鍵を登録するためには公開鍵ファイルをscpコマンドなどで転送し,authorized_keysファイルの末尾に書き込む必要がありますが,これを自動で行ってくれるスクリプトがssh-copy-idです。ssh-copy-idはopenssh-clientパッケージに含まれるため,特にインストールを行うことなく使用することができます。
使い方は以下の通りです。
$ ssh-copy-id -i (公開鍵ファイル) (リモートマシンのアドレス)
リモートマシンへログインするためのパスワードが訊かれますので,パスワードを入力してください。ログインが正常に完了すると,リモートマシンに~/.ssh/authorized_keysファイルが作成され(既に存在する場合は既存のファイルの末尾に)公開鍵が追記されます。
複数の鍵を使い分ける
ssh-keygenが生成する鍵ペアは,デフォルトではid_rsaとid_rsa.pubとなっています。sshは接続時に自動的にこの鍵を使用しますが,複数の鍵を使い分けたい場合も多くあるかと思います。そのような場合は,リネームした複数の鍵を配置しておき,sshコマンドに -i オプションを渡すことで鍵を使い分けることができます。
$ ssh -i .ssh/id_rsa.hoge hoge.example.org <- hoge.example.orgに接続する場合は ir_rsa.hoge を鍵として使用
$ ssh -i .ssh/id_rsa.fuga fuga.example.org <- fuga.example.orgに接続する場合は ir_rsa.fuga を鍵として使用
また使用する鍵のリストをあらかじめ定義しておくこともできます。
~/.ssh/configファイルに以下の記述を追加してください。
IdentityFile ~/.ssh/id_rsa IdentityFile ~/.ssh/id_rsa.hoge IdentityFile ~/.ssh/id_rsa.fuga
ポート転送
sshには安全な通信路を経由して,ローカルマシンからリモートマシンへポートを転送する機能があります。この機能を利用することで,インターネットから接続可能なsshサーバさえあればファイアウォールに新しくポートを開けなくても,sshを経由してファイアウォールの内側のサービスへ接続することが可能になります。
例として,自宅のLAN内で動いているWebサーバに外部からアクセスすることを考えてみましょう。ネットワークの構成は以下のようになっているとします。
クライアントマシンで以下のコマンドを実行し,sshサーバに対してログインを行います。
$ ssh -L 8080:web.localdomain:80 gw.mydomain.org
接続が完了すると,クライアントマシンのポート8080への接続が,Webサーバ(web.localdomain)のポート80へ転送されることになります。具体的に言うとクライアントマシンのポート8080をsshがlistenし,当該ポートへの接続をリモートへ転送します。(1023番以下のポートをlistenするためにはroot権限が必要になるため,本例ではポート8080を指定しています)
sshがコネクションを張っている状態でクライアントマシンのWebブラウザに以下のアドレスを入力することで,Webサーバに接続することができます。
http://localhost:8080
なお転送先ホスト名の解決は接続先サーバにて行われます。すなわち本例ではsshサーバ(gw.mydomain.org)がLAN内のホスト名(web.localdomain)の名前解決を行える必要があります。
なお上記の例ではsshサーバにログインしてシェルが実行されますが,ポート転送のみを行いたいという場合もあるかと思います。そのような場合は -N -fオプションを使用する事で,リモートでのコマンド実行を抑制し,かつバックグラウンドで動作させることができます。

