SSH(1) FreeBSD 一般コマンドマニュアル SSH(1)
名称
ssh − OpenSSH SSH クライアント (リモート ログイン プログラム) |
書式
ssh [−1246AaCfgkNnqsTtVvXxY] [−b bindするアドレス] [−c 暗号化オプション] [−D ポート番号] [−e エスケープ文字] [−F 設定ファイル] [−i identity ファイル] [ |
−L ポート番号:ホスト:ホスト側ポート番号] [−l ログイン名] [−m mac指定] [−o オプション] [−p ポート番号] [ −R ポート番号:ホスト:ホスト側ポート番号] [ ユーザ@]ホスト名 [コマンド]
解説 |
ssh (SSH クライアント) はリモートマシンにログインしたり、リモートマシン上 でコマンドを実行するためのプログラムです。これは rlogin と rsh を置き換え るためのもので、安全でないネットワーク上にある、2 つの信頼されていないホ スト間で、暗号化された安全な通信を提供します。 X11 の接続や任意の TCP/IP ポートなども安全な通信路を通して転送できます。 ssh は指定された ホスト名に接続し、(オプションで ユーザ名付きで) ログイン します。ユーザはリモートマシンに対して、本人であることを証明する必要があ ります。これにはプロトコルのバージョンに応じたいくつかの方法のうち 1 つを 使います。 コマンドが指定されている場合は コマンドはログインシェルの代わりにリモート ホスト上で実行されます。 |
SSH プロトコル バージョン 1 |
最初に、ユーザがリモートマシン上の /etc/hosts.equiv あるいは /etc/ssh/shosts.equiv に記されているマシンからログインしてきて、さらにそ のユーザの名前が両方のホストで同じならば、そのユーザはすぐさまログインが 許可されます。つぎに、 .rhosts あるいは .shosts がリモートホスト上のその ユーザのホームディレクトリに存在していて、そこにクライアントホスト名とそ のホスト上におけるユーザ名が記されている行が存在すれば、そのユーザはログ インが許可されます。この形の認証はふつう、これ単体ではサーバから許可され ません。安全ではないからです。 2 番目の認証方法は rhosts または hosts.equiv を RSA ベースのホスト認証と 組み合わせて使うことです。これは、もしログインが $HOME/.rhosts, $HOME/.shosts, /etc/hosts.equiv, あるいは /etc/ssh/shosts.equiv で許可さ れていて、さらにサーバ側がクライアントのホスト鍵 ( FILES セクションの /etc/ssh/ssh_known_hosts と $HOME/.ssh/known_hosts の項を参照) を確認でき る場合にのみログインが許可されます。この認証方法を使うと IP 詐称、 DNS 詐 称および経路詐称によるセキュリティホールをふさぐことができます。 [管理者 の方へ: /etc/hosts.equiv や $HOME/.rhosts 、そして一般的な rlogin/rsh プ ロトコルは本質的に危険であり、セキュリティを考えるなら禁止しなくてはいけ ません] 3 つめの認証方法として、 ssh は RSA ベースの認証をサポートしています。こ のやりかたは公開鍵暗号技術に基づいています: 暗号システムのなかには、暗号 化/復号化をそれぞれ別の鍵を使って行うことができ、さらに復号化用の鍵から暗 号化用の鍵が推測することはできないものがあります。 RSA はこのような暗号シ ステムのひとつで、以下のようなアイデアで認証を行います。まず各ユーザは、 認証のための「秘密鍵」「公開鍵」とよばれる鍵の対をつくります。サーバは公 開鍵を知っていますが、秘密鍵のほうはユーザだけが知っているものとします。 $HOME/.ssh/authorized_keys ファイルには、ログインが許可されている公開鍵の 一覧が書かれています。ユーザがログインするさい、 ssh プログラムは、その ユーザがどの鍵を使って認証したがっているかをサーバに伝えます。サーバはこ の鍵が許されるものであるかどうかを検査し、もし許されているならば、ユーザ (実際にはユーザのために走っている ssh プログラム) に「チャレンジ (挑戦)」 と呼ばれるものを送ります。これはサーバ側で生成された乱数で、ユーザの公開 鍵によって暗号化されています。このチャレンジはユーザがもっている正しい秘 密鍵によってのみ復号化することができます。ユーザ側のクライアントはこのと きチャレンジを秘密鍵を使って復号化してみせることで、秘密鍵の中身をサーバ 側に公開しないで、それを持っていることをサーバに対し証明するのです。 ssh は RSA の認証プロトコルを自動的におこないます。ユーザは ssh-keygen(1) をつかって自分の RSA 鍵の対をつくります。このプログラムは秘密鍵をユーザの ホームディレクトリ内の $HOME/.ssh/identity ファイルに、公開鍵を $HOME/.ssh/identity.pub ファイルに格納します。ユーザはつぎにこの identity.pub をリモートマシン上の自分のホームディレクトリにある $HOME/.ssh/authorized_keys ファイルにコピーしなくてはいけません ( authorized_keys ファイルは従来の $HOME/.rhosts ファイルに相当し、1 行ごと にひとつの鍵を格納します。各行はかなり長くなることもあります)。この後、 ユーザはパスワードなしでログインすることができます。 RSA 認証は rhosts 認 証よりもずっと安全です。 RSA 認証を使う際にいちばん便利なのは「認証エージェント」と呼ばれるものを 使うことでしょう。詳しくは ssh-agent(1) のマニュアルページをごらんくださ い。 もし他の認証方法が失敗した場合、 ssh はユーザにパスワードを要求します。こ のパスワードは検査のためリモートホストに送られますが、すべての通信は暗号 化されているため、ネットワークを盗聴している何者かによってパスワードが見 られてしまうようなことはありません。 |
SSH プロトコル バージョン 2 |
ユーザがバージョン 2 のプロトコルで接続したときにも、同様の認証方法が使え るようになります。まずクライアントは最初にホストベース認証を試そうとする でしょう。これは PreferredAuthentications のデフォルト値によります。この 認証に失敗すると、次は公開鍵認証を試みます。これもだめなら最後にキーボー ドインタラクティブ認証とパスワード認証を試みます。 公開鍵による方法は前節に書かれている RSA 認証と似ており、 RSA または DSA アルゴリズムを使うことができます。クライアントは自分の秘密鍵である $HOME/.ssh/id_dsa または $HOME/.ssh/id_rsa を使ってセッション識別子に署名 し、この結果をサーバに送ります。サーバはこれに対応する公開鍵が $HOME/.ssh/authorized_keys ファイル中に存在するかどうか検査し、もし双方の 鍵が存在して、なおかつその署名が正しければアクセスを許可します。セッショ ン識別子は共有 Diffie-Hellman 値によって与えられます。この値を知ることが できるのはクライアントとサーバだけです。 公開鍵認証が失敗するか、あるいはそれが使えなかった場合、リモートホストに はそのユーザであることを証明するパスワードを暗号化して送ることができま す。 加えて、 ssh ではホスト間認証やチャレンジ・レスポンス認証もサポートしてい ます。 さらにプロトコル 2 では、秘匿性 (通信は 3DES, Blowfish, CAST128 または Arcfour によって暗号化されます) やデータの改竄を防ぐ機構 (data integrity protection) (hmac-sha1, hmac-md5) が提供されています。プロトコル 1 では通 信内容が改竄されていないことを保証するような強力なメカニズムは存在しない ので注意してください。 |
ログインセッション と リモート実行 |
そのユーザが本人であることが確認できると、サーバは与えられたコマンドを実 行するか、あるいはユーザをそのマシンにログインさせてリモートマシンでの標 準的なシェルを与えます。リモートコマンドあるいはシェルにおけるすべての通 信は自動的に暗号化されます。 仮想端末が割り当てられている場合 (通常のログインセッション時)、ユーザは以 下のエスケープ文字を使うことができます。 仮想端末が割り当てられていない場合、そのセッションは透過になります。その ため、バイナリデータでも確実に転送できます。ほとんどのシステムでは、たと え仮想端末が割り当てられている場合でもエスケープ文字に ‘‘none’’ を設定す ることによって、そのセッションを透過にすることができます。 セッションは、リモートマシン上のコマンドやシェルが完了し、すべての X11 や TCP/IP 接続が閉じられると終了します。このときのリモートプログラムの終了状 態が ssh の終了状態となります。 |
エスケープ文字 |
仮想端末が割り当てられている場合、 ssh ではエスケープ文字を使った機能がい くつかサポートされています。 チルダ記号そのものを 1回入力するには ~~ を押すか、上で述べられている以外 の文字をチルダに続けます。エスケープ文字は、つねに改行の直後に来なければ 特別な文字とは見なされません。エスケープ文字は、設定ファイルの EscapeChar 設定項目あるいはコマンドラインの −e オプションで変更できます。 現在サポートされているエスケープ機能 (エスケープ文字はデフォルトの ‘~’ と 仮定します) : |
~.
接続を切断します。 ~^Z ~# ~& ~? ~C ~R X11 と TCP の転送 ssh によって設定された DISPLAY の値はサーバマシン上を指すようになっていま すが、ディスプレイ番号は 0 より大きい値になっているでしょう。これは正常な 状態です。 ssh は暗号化された通信路を介して接続を転送します。そのため、 サーバマシン上に X サーバの ‘‘プロキシ’’ をつくるのでこうなるのです。 また、 ssh はサーバマシン上で Xauthority 情報を自動的に用意します。 ssh はこのためにランダムな認証クッキーを生成し、サーバ側の Xauthority に格納 し、接続が転送されるときはすべてこのクッキーを持たせるようにします。そし て接続が開かれるときに、これが本物のクッキーと置き換わるようにするので す。本物の認証クッキーがサーバ側に送られることは決してありません (暗号化 されないままでクッキーが送られることもありません)。 ForwardAgent 設定項目が ‘‘yes’’ になっていて、ユーザが認証エージェントを 使っている場合、認証エージェントに対する接続は自動的にリモート側に転送さ れます。 (以下で説明する −A と −a オプションも参照のこと)。 安全な通信路をつかった任意の TCP/IP 接続への転送は、コマンドラインあるい は設定ファイルで指定します。 TCP/IP 転送の応用として、ひとつは電子預金へ の安全な接続が考えられます。ほかにもファイアウォールをまたいで接続するな どの使いみちがあるでしょう。 サーバ認証 オプションは次のとおりです: −1 −2 −4 −6 −A 認証エージェントの転送には注意が必要です。リモートホスト上で ( エージェントの UNIX ドメインソケットに対する) ファイルアクセス権 限を無視できてしまうユーザがいる場合は、転送された接続を介して ローカル側の認証エージェントにアクセスできてしまうことになりま す。攻撃側は認証エージェントから鍵そのものを盗むことはできません が、認証エージェントがもっている鍵に認証をおこなわせることはでき ます。 −a −b bindするアドレス −C −c blowfish | 3des |
des −c 暗号化オプション −D ポート番号 −e ch | ^ch | none −F 設定ファイル −f −g −I スマートカードデバイス −i identityファイル −k −L −l ログイン名 −m MAC指定 −N −n −o オプション AddressFamily −p ポート番号 −q −R −s −T −t −V −v −X X11 の転送には注意が必要です。リモートホスト上で (そのユーザの X 認証のための) ファイルアクセス権限を無視できてしまうユーザがいる 場合は、転送された接続を介してローカル側の X11 ディスプレイにアク セスできてしまうことになります。すると攻撃側はキーストロークを盗 み見るなどの行為が可能になってしまうかもしれません。 −x −Y 設定ファイル |
さらに ssh は、設定情報をユーザごとの設定ファイルおよび、システム全体にわ たる設定ファイルから取得します。このファイルの形式と設定項目は ssh_config(5) で説明されています。 |
環境変数
ssh はふつう以下の環境変数を設定します: |
DISPLAY
環境変数 DISPLAY は X11 サーバの場所を示しています。これは ssh によって、 ‘‘hostname:n’’ という形の値が自動的に設定されます。こ こで hostname の部分はシェルが走っているホストを表しており、 n は n ≥ 1 の整数です。 ssh は X11 接続を安全な通信路で転送するた めに、この特別な値を使います。 X11 の接続が安全でなくなってしま うため、ユーザは環境変数 DISPLAY を自分で設定すべきではありませ ん (また、それをやってしまうとユーザは認証に必要なクッキーを手で コピーしなければならなくなります)。 HOME LOGNAME MAIL PATH SSH_ASKPASS SSH_AUTH_SOCK SSH_CONNECTION SSH_ORIGINAL_COMMAND SSH_TTY TZ USER これらに加えて、 ssh は $HOME/.ssh/environment ファイルが存在してアクセス 可能になっていればそれを読み込み、 ‘‘VARNAME=value’’ という形式の行を環境 変数に追加します。より詳しい情報は sshd_config(5) の PermitUserEnvironment 設定項目を参照してください。 関連ファイル |
$HOME/.ssh/known_hosts
ユーザがログインしたことのあるホストすべてのホスト鍵を保持します ( /etc/ssh/ssh_known_hosts にあるものを除く)。 sshd(8) も見てくだ さい。 $HOME/.ssh/identity, $HOME/.ssh/id_dsa,
$HOME/.ssh/id_rsa $HOME/.ssh/identity.pub, $HOME/.ssh/id_dsa.pub,
$HOME/.ssh/id_rsa.pub $HOME/.ssh/config $HOME/.ssh/authorized_keys /etc/ssh/ssh_known_hosts sshd(8) がログイン時にクライアント側のホストを検証するさいには、 システムの別名 (ネームサーバの返す canonical name) が使われます。 これ以外の名前が必要なのは次のような理由によります。 ssh は、鍵を 検査する前にユーザの指定した名前を (DNS 的に) 正式なものに変換す る、ということをしません。なぜならもし何者かがネームサーバに仕掛 けを入れれば、これを使ってホスト認証をだますことが可能になってし まうからです。 /etc/ssh/ssh_config /etc/ssh/ssh_host_key, /etc/ssh/ssh_host_dsa_key,
/etc/ssh/ssh_host_rsa_key $HOME/.rhosts デフォルトでは、 sshd(8) で rhosts 認証が許可されるには、まず RSA ホスト認証に成功することが必要になっています。サーバマシンが /etc/ssh/ssh_known_hosts の中にそのクライアントのホスト鍵を持って いない場合は、 $HOME/.ssh/known_hosts ファイルに格納されます。こ うするのにいちばん簡単な方法は、サーバマシンから ssh を使ってクラ イアントマシンに接続し直すことです。こうすることによって、そのホ スト鍵が自動的に $HOME/.ssh/known_hosts に追加されます。 $HOME/.shosts /etc/hosts.equiv /etc/ssh/shosts.equiv /etc/ssh/sshrc $HOME/.ssh/rc $HOME/.ssh/environment 診断 |
ssh は終了状態として、リモートコマンドの終了状態を返します。エラーが発生 した場合は 255 を返します。 |
関連項目
gzip(1), rsh(1), scp(1), sftp(1), ssh-add(1), ssh-agent(1), ssh-keygen(1), telnet(1), hosts.equiv(5), ssh_config(5), ssh-keysign(8), sshd(8) |
T. Ylonen, T. Kivinen, M. Saarinen, T. Rinne, and S. Lehtinen, SSH Protocol Architecture, draft-ietf-secsh-architecture-12.txt, January 2002, work in progress material.
作者
OpenSSH は Tatu Ylonen による、フリーなオリジナル版 ssh 1.2.12 リリースか ら派生したものです。 Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo de Raadt および Dug Song が多くのバグをとり除き、新しい機能 をふたたび追加して OpenSSH をつくりました。 SSH プロトコル バージョン 1.5 および 2.0 のサポートは Markus Friedl の貢献によるものです。 |
日本語訳
新山 祐介 (yusuke at cs . nyu . edu) 2002/6/21 (for 3.3 p1) 当マニュアルページは氏のご好意により FreeBSD 向けに修正を加えて FreeBSD 日本語マニュアルに収録させていただいています。翻訳についてのご意見、ご指 摘がありましたら FreeBSD jpman プロジェクト 〈man-jp@jp.FreeBSD.org〉 また は新山氏 (yusuke at cs . nyu . edu) までお送りください。 FreeBSD 10.0 September 25, 1999 FreeBSD 10.0 |