sshといえば、ネットワーク経由でリモートアクセスする場合の標準的なプロトコルです。Linuxであれば、クライアントは基本的なディストリビューションであればデフォルトで入っていますし、サーバも標準リポジトリに含まれています。
私も、sshを使ってネットワーク越しによく研究室内の自分のPC等にアクセスしたりしてるのですが、使えば使うほど、いろいろ便利な利用法を知ることが出来てあちこちにメモしていたらだんだん分散されてきたので、できることのメモを兼ねてここにまとめます。
詳細は以下より…
公開鍵認証
デフォルトではsshはパスワードによる認証ですが、秘密鍵・公開鍵を作成し、その鍵を利用して認証することも可能です。鍵認証にすることでパスワードなしでアクセス可能なので、cron等定期実行する場合のパスワード入力を省略するためには必須です(鍵自体にパスフレーズを指定することも可)。さらに秘密鍵がないとアクセス出来ないため、鍵認証のみにして、セキュリティを高めることもできます。逆に秘密鍵が漏洩した場合には自由にアクセス可能なので、鍵の扱いには注意が必要です。
鍵の作成
ssh-keygenコマンドを使用することで秘密鍵・公開鍵のペアを作成できます。
user@local:$ ssh-keygen -t dsa -C "任意のコメント"
作成される秘密鍵のパス: ~/.ssh/id_dsa
作成される公開鍵のパス: ~/.ssh/id_dsa.pub
ただし鍵認証を利用する際、秘密鍵のアクセス権限が600、または400である必要があります。
公開鍵のサーバへの設置
作成した公開鍵を、ログインしたいサーバの~/.ssh/authorized_keysに記載することで公開鍵を登録します。
user@local:$ scp ~/.ssh/id_dsa.pub server1:~/.ssh/authorized_keys
すでにauthorized_keysに別の公開鍵が登録されている場合、上記の方法では上書きしてしまうため、以下のようにします。
user@local:$ cat ~/.ssh/id_dsa.pub | ssh server1 'cat >> ~/.ssh/authorized_keys'
config設定
sshは、~/.ssh/configに多くの設定を書くことができます。その多くはssh実行時にオプションとして渡すこともできますが、複数に渡る場合、また基本的にパターンが決まっている場合は、予め記載している方が便利です。
基本的に以下のように、対象ホスト毎に記載します。
Host [対象サーバ1]
Host [対象サーバ2]
…
接続するホスト名・ユーザ名・ポートの指定
接続するホスト名を省略したい場合、または同一ホスト名のサーバに対して複数設定を行いたい場合には、HostNameに実際のホスト名を書き、Host部分には個別の名前を記載することで、その名前の時にその設定でアクセスすることができます。
また、同様に個別の名前にユーザ名やポート番号を指定することも可能です。ただしssh接続時のコマンドの@以前にユーザ名を指定した場合、そちらが優先されます。これはユーザ名に限らず、全ての指定可能オプションで共通のようです。コマンドオプション→ユーザのconfig→システムのconfigの順に設定項目ごとに最初にヒットした設定を利用するようです。
Host server1 Hostname server1.domain.jp User user1 Host server2 Hostname server2.domain.jp Port 3000 User user2 Host server2-admin Hostname server2.domain.jp Port 3000 User administrator
複数サーバへの設定指定
複数のホストに同一設定を行う場合、以下のようにも記載できます。
?や*による正規表現的な選択や、,区切りでの複数指定も可能です。
例えば以下のようにすると、個別の設定を行った上で、全てのサーバで接続パケットを定期的に送る指定ができます。
Host server1 … Host server2 … Host * ServerAliveInterval 60
異なる鍵を利用した鍵認証の設定
基本的に鍵認証を行うときの鍵は1つあれば問題ないので、複数使うことはあまり多くはないですが、利用するネットワークの都合や、パスフレーズあり・なしを使い分けているなどの理由などから、複数の鍵を使う場合もあります。
その場合には、以下のように指定することで、使い分けができます。
Host server1 HostName server1.domain.jp IdentityFile ~/.ssh/id_rsa_1 Host server2 HostName server2.domain.jp IdentityFile ~/.ssh/id_rsa_2
プロキシサーバの指定
例えば、私の学校の環境では外部から接続できるのは、ゲートウェイサーバ1つだけですが、以下のようにconfigに記載しておくことで、直接remote-serverに接続することができます。さらにremote-serverのみからしかアクセス出来ないサーバがある場合には、ProxyCommandにremote-outsideを指定することで、クライアント→gateway→remote→inside という多段アクセスをssh inside-outsideのように直接指定することができるようになります。
Host gateway HostName gateway.domein.jp User User_id Host remote-outside HostName remote-server.domein.jp User User_id ProxyCommand ssh sshgate -W %h:%p Host inside-outside HostName inside.domein.jp User User_id ProxyCommand ssh remote-outside -W %h:%p
ここで記入したホスト名は以降のコマンドで利用しているserver項にも利用できるため、ファイル転送を直接行ったり、内部ネットワークからのみしかアクセス出来ないサーバに外からポートフォワーディングを行うこともできます。
ただしここで記載した -Wオプションはopenssh 5.4以降のサポートなので、それ以前の場合には他の方法を利用する必要があります。その方法としてはいかに記載するconnectやncを利用する方法があります。その指定を以下に記載します。
ProxyCommand connect -H proxy.domein.jp:port %h %p
ProxyCommand ssh proxy.domein.jp nc %h %p
ただし、これらを利用する場合は、どちらもこのコマンドがプロキシサーバサイドで利用できる必要があります。そのため、プロキシとなるサーバに制限がかかっている場合は利用できないため、基本的にはWオプションを利用することを推奨します。Wオプションはクライアントサイドで利用が出来ればよいため、サーバに設定するよりは敷居は低いかと思います。
ポートフォワーディング
sshのコネクションを利用して、サーバのポートをクライアントのポートに接続することができます。例えば、特定ネットワーク内のみアクセス可能なwebページのあるサーバの80番ポートにローカルのポートを接続することで、外部からそのwebページヘのアクセスを行うことができます。
user@local:$ ssh -L 10000:inside-web.domain.jp:80 gateway.domein.jp
このコマンドを実行することで、http://localhost:10000/ でinside-web.domain.jpにアクセスすることが可能です。
これを利用することで、自分のみで利用したいためLAN内のみで利用したいが、外部からアクセスが必要な場合に上記のようにすることでsshでアクセスできるユーザだけが利用するようにできます。外部公開するための設定が必要ないため、テスト用のwebページやwebシステムに外部からアクセスできるようになります。
また、特定ネットワーク内のプロキシのポートを割り当てることで、ドメイン単位でアクセス指定しており、利用するためには特定ネットワーク内のプロキシ経由でアクセスする必要が有る場合も同様に指定して、プロキシにlocalhost:10000を指定することでプロキシ経由でアクセスすることができます。
逆ポートフォワーディング
先ほどのポートフォワーディングとは逆にローカルのポートをサーバのポートに割り当てます。これを利用することで、グローバルIPを持たないサーバに対しても、ssh等でアクセスすることが可能です。そのため、グローバルIPを持たない自宅のPCやネットワーク内からしかアクセス出来ないが、ネットワーク内に外部からアクセスできるゲートウェイが存在しない場合には、これを利用することでアクセス可能です。
user@local:$ ssh -R 11000:localhost:22 server1.domein.jp
このコマンドを実行する後、server1の11000ポートにアクセスすると、実行したクライアントの22番ポートにアクセスすることが可能です。
sshのオプション
sshのオプションは複数ありますが、その中でも私がよく利用するものを解説します。
- p : ポート番号を指定する
- l : ユーザ名を指定する
- Y : サーバのアプリケーションのXウィンドウをローカルに転送する
- C : 転送するデータを圧縮する
- f : バックグラウンドで実行する
- N : リモートでコマンドを実行しない
- L : ポートフォワーディングを行う
- R : 逆ポートフォワーディングを行う
ポート番号の指定
sshで接続するポート番号の指定します。セキュリティのためsshのポート番号を変えている場合やポートフォワーディングでsshアクセスを行う場合などに利用可能です。
server1の3000番ポートにsshアクセスする場合
user@local:$ ssh -p 3000 server1
ユーザ名の指定
sshで接続するユーザ名の指定します。指定がない場合には現在ログインしているユーザ名でログインを試みます。 -l オプションに続いて指定する方法の他にuser_id@serverのように@区切りで指定することもできます。
server1にユーザ”user1″でsshアクセスする場合
user@local:$ ssh -l user1 server1
user@local:$ ssh user1@server1
X-windowの転送
サーバのXアプリのXプロトコルをローカルに転送します。このオプションを指定したsshセッションでX-windowアプリを起動した際は、ローカルにそのアプリのX-windowを表示して操作することができます。GUIアプリを利用する必要が有る場合には、このオプションを利用することでネットワーク越しに利用することができます。
server1にX転送を行うsshアクセスをする→x-windowの確認
user@local:$ ssh -Y server1
user@server1:$ xeyes
これでxeyesのウィンドウがローカルに表示されていれば正常に転送されています。
バックグラウンドでの実行
ポートフォワーディング等を行う場合に、他のオプションなしで実行した場合、踏み台となるサーバにsshのセッションがはられて、その上でのプロンプトが表示されます。
しかし、ポートフォワーディングを行う場合には、そのサーバのプロンプトを表示する必要性がない場合も多くその場合には、以下のように指定することでバックグラウンドでポートフォワーディングを行うことができます。
ssh -N -f -L 10000:inside-web.domain.jp:80 gateway.domein.jp
ssh越しのファイル転送/圧縮
sshを利用したネットワーク越しのファイル転送と言えば、scpやsftpなどがあります。
user@local:$ scp source_path user@server:filepath/filename.tar
user@local:$ sftp user@server
さらにsshとtar等を合わせれば、ファイル圧縮を行いながら転送することができます。
user@local:$ tar c source_path | ssh user@server "cat > filepath/filename.tar"
user@local:$ tar zc source_path | ssh user@server "cat > filepath/filename.tar.gz"
user@local:$ tar jc source_path | ssh user@server "cat > filepath/filename.tar.bz2"
まとめ
とりあえずssh関係の自分のメモが乱雑としてきたので、まとめのつもりで書きましたが、書いたら書いたで複数鍵認証のこと書いてても、鍵認証単独のことが書いて無かったため、書き足したりしてるうちに何を書いて何を書いてないか分からなくなってきました。
なので、適当な所で切った上に乱雑になってしまっています。他のオプションや使い方もまだまだあるので、そちらは別途調べて頂くようお願いします。
参考リンク
- http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html
- http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html
- http://d.hatena.ne.jp/dayflower/20080204/1202457379
- http://www-net.nifs.ac.jp/nifscc/manual/man-sshrsa.html