SSH (1)

OpenSSH-7.3p1 日本語マニュアルページ (2016/10/15)


名前

ssh
OpenSSH SSH クライアント (リモート ログイン プログラム)

書式

ssh [-1246AaCfGgKkMNnqsTtVvXxYy ] [-b bindするアドレス ] [-c 暗号方式 ] [-D [bindするアドレス :] ポート ] [-E ログファイル ] [-e エスケープ文字 ] [-F 設定ファイル ] [-I pkcs11 ] [-i identityファイル ] [-J [ユーザ @] ホスト [:ポート ] ] [-L アドレス ] [-l ログイン名 ] [-m MAC指定 ] [-O 制御コマンド ] [-o オプション ] [-p ポート ] [-Q 問い合わせオプション ] [-R アドレス ] [-S 制御用パス名 ] [-W ホスト :ポート ] [-w ローカルtun [:リモートtun ] ] [ユーザ @] ホスト名 [コマンド ]

説明

ssh (SSH クライアント) はリモートマシンにログインしたり、リモートマシン上でコマンドを実行するためのプログラムです。これは安全でないネットワーク上にある2 つの信頼されていないホスト間で、暗号化された安全な通信を提供します。X11 接続や任意の TCP ポートおよびUnixソケットなども安全な通信路を通して転送できます。

ssh は指定されたホスト名 に接続し、(オプションが指定された場合はそのユーザ で)ログインします。ユーザはリモートマシンに対して、本人であることを証明する必要があります。これにはいくつの方法のうち、ひとつを使います (下記参照) :

コマンド が指定された場合、リモートホスト上ではログインシェルのかわりにそのコマンドが実行されます。

オプションは次のとおりです:

-1
ssh がプロトコル 1 のみを使うよう強制します。

-2
ssh がプロトコル 2 のみを使うよう強制します。

-4
ssh が IPv4 アドレスのみを使うよう強制します。

-6
ssh が IPv6 アドレスのみを使うよう強制します。

-A
認証エージェントの転送を許可します。これは設定ファイルによってホストごとに指定することも可能です。

認証エージェントの転送には注意が必要です。リモートホスト上で (エージェントの UNIX ドメインソケットに対する)ファイルアクセス権限を無視できてしまうユーザがいる場合は、転送された接続を介してローカル側の認証エージェントにアクセスできてしまうことになります。攻撃側は認証エージェントから鍵そのものを盗むことはできませんが、認証エージェントがもっている鍵に認証をおこなわせることはできます。

-a
認証エージェントの転送を禁止します。

-b bindするアドレス
接続のソース側のインターフェイスとして、bindするアドレス を使います。これが有用なのは、複数の IP アドレスをもつマシン上のみです。

-C
すべてのデータを圧縮するよう指示します (標準入力、標準出力、標準エラー出力、転送された X11 や TCP 接続およびUnix接続を含む)。圧縮に使われるアルゴリズムはgzip (1) と同じもので、プロトコル 1 の場合"レベル"がCompressionLevel設定項目によって変更できます。圧縮は、モデムその他の遅い接続においては必要ですが、高速なネットワークでは速度が低下するだけです。このデフォルト値はホスト間ごとに設定ファイルに書くことができます。Compression設定項目を参照してください。

-c 暗号方式
このセッションで使われる暗号の方式を指定します。

プロトコル 1 の場合、指定できる方式はひとつで"3des 、""blowfish"および"des"がサポートされています。

プロトコル 2 では、cipher_spec はカンマで区切られたリストになっており、暗号方式の優先順位を指定できます。より詳しい情報については、ssh_config (5)Ciphersキーワードの項を参照してください。

-D
[bindするアドレス :] ポート ローカルホスト側における、アプリケーションレベルの"動的な"ポート転送を指定します。これは次のように実現しています。まずローカル側でポート を listen するソケットを割り当てます。bindするアドレス が与えられた場合はそのアドレスで listen します。このポートに向けて接続が張られると、その接続はつねに安全な通信路に転送されるようになります。そして、ここでアプリケーションプロトコルが使われ、そのリモートマシンからどこに接続するかを決めることができます。今のところ SOCKS4 および SOCKS5 プロトコルが使われており、ssh は SOCKS サーバのようにふるまいます。特権ポートを転送できるのはスーパーユーザだけです。動的ポート転送は設定ファイルでも指定できます。

IPv6 アドレスはブラケット [ ] で囲むことで指定できます。特権ポートを転送できるのはスーパーユーザだけです。デフォルトでは、ローカル側のポートはGatewayPortsの設定に従って bind されますが、bindするアドレス を明示的に使うことで特定のアドレスに接続を bind することもできます。bindするアドレス が"localhost"になっている場合、そのポートはローカルホストのみが使用可能であることを示します。いっぽう、空のアドレスや `*' を指定すると、そのポートはすべてのインターフェイスに対して使用可能になります。

-E ログファイル
デバッグ用ログを標準エラー出力ではなく、ログファイル に追加します。

-e エスケープ文字
仮想端末を使うセッションにおけるエスケープ文字を指定します(デフォルトは ~ )。エスケープ文字は行頭に来たときのみ認識されます。エスケープ文字のあとにドット . がきた場合その接続は閉じられ、control-Z がきた場合にはその接続はサスペンドされます。このエスケープ文字自身が続いたときには、この文字が 1 回だけ送られます。エスケープ文字を"none"に指定するとあらゆるエスケープ機能が禁止され、セッションは完全に透過になります。

-F 設定ファイル
ユーザ毎の設定ファイルに別のファイルを指定します。設定ファイルがコマンドラインから与えられた場合、システム全体の設定ファイル
/etc/ssh/ssh_config
は無視されます。デフォルトでは、ユーザ毎の設定ファイルは~/.ssh/configになっています。

-f
ssh がコマンドを実行する直前に、バックグラウンドに移行するよう指示します。これはssh にパスワードあるいはパスフレーズを入力する必要はあるものの、そのコマンド自体はバックグラウンドで実行させたいときに便利です。これは-n オプションも含んでいます。リモートサイトで X11 プログラムを起動させる場合には、
ssh -fhostxterm
などとやるのがおすすめです。

もしExitOnForwardFailure設定項目が"yes"になっている場合、-f で開始されたクライアントはすべてのポート転送の確立が成功するまで待ってから、バックグラウンドに移行します。

-G
ssh は、設定ファイル中のHostおよびMatchブロックを評価して表示し、すぐに終了します。

-g
リモートホストが転送されたローカルなポートに接続することを許可します。このオプションを分岐した接続に使用する場合は、マスター接続のプロセスに対して指定してください。

-I pkcs11
ssh がユーザの RSA 秘密鍵を提供する PKCS#11 トークンと通信するときに使う、PKCS#11 共有ライブラリを指定します。

-i identityファイル
公開鍵認証の際にidentity (秘密鍵) を読むファイルを指定します。デフォルトは、プロトコル 1 の場合ユーザのホームディレクトリにある~/.ssh/identity、プロトコル 2 の場合は~/.ssh/id_dsa ,~/.ssh/id_ecdsa ,~/.ssh/id_ed25519および~/.ssh/id_rsaになっています。identity ファイルは設定ファイルによって、ホストごとに指定することもできます。複数の-i オプションを指定することも可能です。(設定ファイルで複数の鍵を指定することもできます。)証明書がCertificateFile設定項目で明示的に指定されていない場合、ssh は末尾に-cert.pubのついたファイル名からも証明書を読み込もうとします。

-J
[ユーザ @] ホスト [:ポート ] 対象のホストに接続します。まずssh 接続をジャンプ用ホスト に接続し、そこから最終的な到達先に対してTCP 転送を確立します。カンマで区切って、複数のプロキシを指定することもできます。これはProxyJump設定項目の簡略形です。

-K
GSSAPI ベース認証および、GSSAPI 証明書 (credential) のサーバへの転送 (委譲、delegation) を許可します。

-k
GSSAPI 証明書 (credential) をサーバに転送 (委譲、delegation) することを禁止します。

-L
[bindするアドレス :] ポート :ホスト:ホスト側ポート

-L
[bindするアドレス :] ポート :リモート側ソケット

-L
ローカル側ソケット :ホスト:ホスト側ポート

-L
ローカル側ソケット :リモート側ソケット与えられたローカル (クライアント) ホスト上の指定の TCP ポートまたはUnixソケットが、与えられたリモートホスト上のポートに転送されるよう指定します(ローカル→リモートのポート転送)。これはローカル側で、TCP のポート に listen (接続受け付け) 用のソケットを割り当てることによりおこなわれます。さらにbindするアドレス または Unix ソケットが与えられている場合は、そのアドレスに bind されます。このポートまたはソケットに向けておこなわれた接続はつねに安全な通信路を経由してリモートマシン上に到達し、そこからホスト のポートホスト側ポート か、あるいは Unix ソケットリモート側ソケット に接続されるようになります。

ポート転送は設定ファイルによっても指定できます。特権ポートを転送できるのはスーパーユーザだけです。IPv6 アドレスはブラケット [ ] で囲むことで指定できます。デフォルトでは、ローカル側のポートはGatewayPortsの設定に従って bind されますが、bindするアドレス を明示的に指定することで、特定のアドレスに接続をふり向けることができます。bindするアドレス として"localhost"を指定すると、ポートを listen するのはローカルな使用のみに限ることになります。いっぽう、空のアドレスまたは `*' を指定すると、そのポートはすべてのインターフェイスに対して使用可能になります。

-l ログイン名
リモートマシン上でログインするユーザ名を指定します。これは設定ファイルによって、ホストごとに指定することもできます。

-M
ssh を、接続を共有するための"master"モードにします。-M オプションを複数個つけるとssh は"master"モードになり、slave 接続を受けつける前に確認を求めます。詳細についてはssh_config (5)ControlMasterの項を参照してください。

-m MAC指定
カンマで区切ったリストで、使用する MAC (message authentication code、メッセージ認証コード) を優先順位をつけて指定することができます。MAC についての詳しい情報はMACsの項をご覧ください。

-N
リモートコマンドを実行しません。これはポート転送のみをおこないたい場合に便利です。

-n
標準入力を/dev/nullからリダイレクトするように(つまり標準入力からの読み込みを禁止した状態に) します。ssh をバックグラウンドで走らせるときには、このオプションが不可欠です。よくある手としては、リモートマシン上で X11 のプログラムを走らせるときにこれを使うことです。たとえば、
ssh -nshadows.cs.hut.fiemacs&
で emacs を立ち上げると、X11 接続は暗号化された経路を介して自動的に転送されます。ssh プログラムはこの後バックグラウンドに移行するでしょう。(これはssh がパスワードあるいはパスフレーズを訊いてくるときには使えません。-f オプションを参照してください。)

-O 制御コマンド
マスタープロセスから分岐した現在使用中の接続を制御します。-O オプションが指定されている場合、制御コマンド の指令はマスタープロセスに渡されます。使用可能なコマンドは以下のとおりです:"check"(マスタープロセスが走っているかどうかチェックする)"forward"(コマンドを実行せずにポート転送を要求する)"cancel"(ポート転送をキャンセルする)"exit"(マスタープロセスを終了するよう指示する)および"stop"(マスタープロセスにこれ以上の分岐を止めるよう要求する)

-o オプション
設定ファイルと同じ形式でオプションを与えたいときに使用します。これはコマンドラインオプションでは指定できないオプションを指定したいときに便利です。以下のオプションの詳細と、これらがとりうる値についてはssh_config (5) を参照してください。

AddKeysToAgent

AddressFamily

BatchMode

BindAddress

CanonicalDomains

CanonicalizeFallbackLocal

CanonicalizeHostname

CanonicalizeMaxDots

CanonicalizePermittedCNAMEs

CertificateFile

ChallengeResponseAuthentication

CheckHostIP

Cipher

Ciphers

ClearAllForwardings

Compression

CompressionLevel

ConnectionAttempts

ConnectTimeout

ControlMaster

ControlPath

ControlPersist

DynamicForward

EscapeChar

ExitOnForwardFailure

FingerprintHash

ForwardAgent

ForwardX11

ForwardX11Timeout

ForwardX11Trusted

GatewayPorts

GlobalKnownHostsFile

GSSAPIAuthentication

GSSAPIDelegateCredentials

HashKnownHosts

Host

HostbasedAuthentication

HostbasedKeyTypes

HostKeyAlgorithms

HostKeyAlias

HostName

IdentitiesOnly

IdentityAgent

IdentityFile

Include

IPQoS

KbdInteractiveAuthentication

KbdInteractiveDevices

KexAlgorithms

LocalCommand

LocalForward

LogLevel

MACs

Match

NoHostAuthenticationForLocalhost

NumberOfPasswordPrompts

PasswordAuthentication

PermitLocalCommand

PKCS11Provider

Port

PreferredAuthentications

Protocol

ProxyCommand

ProxyJump

ProxyUseFdpass

PubkeyAcceptedKeyTypes

PubkeyAuthentication

RekeyLimit

RemoteForward

RequestTTY

RhostsRSAAuthentication

RSAAuthentication

SendEnv

ServerAliveInterval

ServerAliveCountMax

StreamLocalBindMask

StreamLocalBindUnlink

StrictHostKeyChecking

TCPKeepAlive

Tunnel

TunnelDevice

UpdateHostKeys

UsePrivilegedPort

User

UserKnownHostsFile

VerifyHostKeyDNS

VisualHostKey

XAuthLocation

-p ポート
リモートホストに接続するポートを指定します。これは設定ファイルによって、ホストごとに指定することもできます。

-Q 問い合わせオプション
ssh がプロトコル 2 の特定の機能をサポートするかどうか問い合わせます。問い合わせ可能な機能は、cipher (サポートされている対称暗号の種類)、cipher-auth (認証つき暗号化をサポートする対称暗号)、mac (サポートされているメッセージ認証コードの種類)、kex (鍵交換アルゴリズム)、key (鍵の形式)key-cert (証明書の鍵の形式),key-plain (証明書でない鍵の形式)protocol-version (サポートされている SSH のプロトコル)です。

-q
静かなモード。ほとんどの警告メッセージや診断メッセージは抑制されます。

-R
[bindするアドレス :] ポート :ホスト:ホスト側ポート

-R
[bindするアドレス :] ポート :ローカル側ソケット

-R
リモート側ソケット :ホスト:ホスト側ポート

-R
リモート側ソケット :ローカル側ソケット与えられたリモート (サーバ) ホスト上の指定の TCP ポートまたはUnixソケットが、与えられたローカルホスト上のポートに転送されるよう指定します(リモート→ローカルのポート転送)。これはリモート側で、TCPのポート または Unix ソケットに listen (接続受け付け) 用のソケットを割り当てることによりおこなわれます。このポートまたは Unix ソケットに向けておこなわれた接続は、つねに安全な通信路を経由してローカルマシン上に到達し、ここからホスト のポートホスト側ポート またはローカル側ソケット に接続されるようになります。

ポート転送は設定ファイルによっても指定できます。特権ポートを転送できるのは、リモートマシン上に root としてログインしているときだけです。IPv6 アドレスはブラケット [ ] で囲むことで指定できます。

デフォルトでは、サーバ側の TCP で listen するソケットはループバックインターフェイスのみに bind されます。これはbindするアドレス を指定することによって上書きすることができます。空のbindするアドレス または * をアドレスとして指定すると、サーバ側のソケットはすべてのインターフェイスに対して listen するようになります。bindするアドレス にループバック以外の値が指定できるのは、GatewayPortsオプションが許可されているときのみです (sshd_config (5) を参照してください)。

ポート 引数に 0 を指定した場合、listen するポートはサーバ側で動的に割り当てられ、実行時にクライアント側にその値が報告されます。

-O forward
オプションと一緒に使用すると、割り当てられたポートが標準出力に表示されます。

-S 制御用パス名
接続を共有する際の制御用ソケットの位置を指定します。ここで"none"を指定すると、接続共有は禁止されます。詳細についてはssh_config (5)ControlMasterおよびControlPathの項を参照してください。

-s
リモート側でサブシステムの実行を要求するときに使われます。サブシステムを使うと SSH を他のアプリケーション (sftp (1) など) への安全な通信路として利用することができます。この場合、サブシステム名はリモートコマンドとして指定します。

-T
仮想端末の割り当てを禁止します。

-t
強制的に仮想端末を割り当てます。これはリモートマシン上で任意の画面ベースのプログラムを実行するとき(たとえば、メニューサービスを実装するときなど)に非常に便利です。複数の-t をつけると、たとえssh がローカル側での端末を持っていない場合でも強制的に仮想端末を割り当てます。

-V
バージョン番号を表示して終了します。

-v
冗長表示モード。ssh が進行中のデバッグメッセージを表示するようにします。これは接続や認証、設定の問題をデバッグするときに助けとなります。複数の-v オプションをつけると出力が増えます。最大は 3 個です。

-W ホスト :ポート
クライアントの標準入力と標準出力を、安全な通信路を通してホストポート 上に接続します。このオプションは、-N ,-T ,ExitOnForwardFailureおよびClearAllForwardingsを暗黙のうちに含んでいますが、これらは設定ファイルまたは-o オプションにより上書きすることができます。

-w
ローカルtun [:リモートtun ] クライアント側のローカルtun と、サーバ側のリモートtuntun (4) デバイスを使ったトンネリングを要求します。これらのデバイスは数値か、あるいはキーワード"any"によって指定します。このキーワードを指定すると、現在の次に使用可能なトンネルデバイスが使われます。Ifリモートtun が指定されない場合は、デフォルトで"any"になります。ssh_config (5)TunnelDevice項目も参照してください。Tunnel項目が指定されていない場合、トンネルモードはデフォルトの"point-to-point"になります。

-X
X11 の転送を許可します。これは設定ファイルによって、ホストごとに指定することもできます。

X11 の転送には注意が必要です。リモートホスト上で (そのユーザの X 認証のための) ファイルアクセス権限を無視できてしまうユーザがいる場合は、転送された接続を介してローカル側のX11 ディスプレイにアクセスできてしまうことになります。すると攻撃側はキーストロークを盗み見るなどの行為が可能になってしまうかもしれません。

このため、デフォルトでは X11 転送は X11 SECURITY 拡張機能の制約をうけるようになっています。詳しくは、ssh-Y オプション、およびssh_config (5)ForwardX11Trusted項目を参照してください。

-x
X11 の転送を禁止します。

-Y
信頼された X11 転送を許可します。信頼された X11 転送は、X11 SECURITY 拡張機能の制約をうけることはありません。

-y
syslog (3) システムモジュールを使用してログ情報を送ります。デフォルトでは、この情報は標準エラー出力に送られます。

さらにssh は、設定情報をユーザごとの設定ファイルおよび、システム全体にわたる設定ファイルから取得します。このファイルの形式と設定項目はssh_config (5) で説明されています。


認証

OpenSSH SSH クライアントは SSH プロトコル 1 とプロトコル 2 をサポートしています。デフォルトでは、プロトコル 2 のみを使います。これはssh_config (5)Protocol設定項目で変更するか、あるいは-1 または-2 オプション (上記参照) によって指定できます。プロトコル 1 は使うべきではありません。これはレガシー・デバイスのサポート用のみに提供されています。これにはいくつもの暗号上の弱点があり、プロトコル 2 で使用可能な多くの機能も提供されていません。

認証方式として使用可能なのは、GSSAPIベースの認証 (GSSAPI-based authentication)、ホストベースド認証 (host-based authentication)、公開鍵認証 (public key authentication)、チャレンジ・レスポンス認証 (challenge-response authentication)およびパスワード認証 (password authentication) です。認証方式はここに示した順序で使用されます。ただしPreferredAuthentications設定項目によりこのデフォルトの順序を変更することもできます。

ホストベースド認証 (hostbased authentication) は以下のように動作します:ユーザがssh を実行するマシンが、リモートマシン側の/etc/hosts.equivあるいは/etc/shosts.equivに記載されており、さらにそのユーザ名が双方で同じか、あるいはリモートマシン上のそのユーザのホームディレクトリに~/.rhostsあるいは~/.shostsが存在して、クライアントマシンの名前とそのマシン上でのそのユーザ名が記載されている場合、そのユーザのログインが考慮されます。サーバはさらに、このクライアントのホスト鍵(以下の/etc/ssh/ssh_known_hosts~/.ssh/known_hostsを参照)が必ず正しいことを要求します。これが正しければログインが許可されます。この認証方式により IP 詐称、DNS 詐称やルーティング詐称などの攻撃が迂回できます。[管理者のかたに注意: 一般的にいって、/etc/hosts.equiv 、~/.rhosts およびrlogin/rsh プロトコルは本質的に危険であり、セキュリティを考慮するのであれば禁止すべきです。]

公開鍵認証 (public key authentication) は以下のようにして動作します:このやりかたは公開鍵暗号技術に基づいており、暗号化と復号をそれぞれ別の鍵を使っておこなうことができ、さらに復号用の鍵から暗号化用の鍵を推測することは現実的にできないような暗号方式を使っています。このアイデアは、まず各ユーザが認証のための「秘密鍵」と「公開鍵」とよばれる鍵の対をつくります。サーバは公開鍵を知っていますが、秘密鍵のほうはユーザだけが知っているものとします。ssh は公開鍵認証を実装しており、DSA, ECDSA, Ed25519 あるいは RSA 方式を使用しています。ssl (8) の「歴史」セクションでは、DSA および RSA アルゴリズムについて簡単に説明しています。

~/.ssh/authorized_keysファイルには、ログインが許可されている公開鍵の一覧が書かれています。ユーザがログインする際、ssh プログラムは、そのユーザがどの鍵の対を使って認証しようとしているかをサーバに伝えます。クライアントは自分が秘密鍵にアクセスできることをサーバに対して証明し、サーバはそれに対応する公開鍵がそのアカウントを受け入れる権限をもっているかどうかを調べます。

ユーザはssh-keygen (1) を使って自分の鍵の対をつくります。このプログラムは、秘密鍵をユーザのホームディレクトリ内の~/.ssh/identity(プロトコル 1)、~/.ssh/id_dsa(DSA 方式)、~/.ssh/id_ecdsa(ECDSA 方式)、~/.ssh/id_ed25519(Ed25519 方式)、あるいは~/.ssh/id_rsa(プロトコル 2、RSA 方式) に格納し、公開鍵を~/.ssh/identity.pub(プロトコル 1)、~/.ssh/id_dsa.pub(DSA 方式) 、~/.ssh/id_ecdsa.pub(ECDSA 方式)~/.ssh/id_ed25519.pub(Ed25519 方式)あるいは~/.ssh/id_rsa.pub(RSA 方式) に格納します。ユーザはこの公開鍵をリモートマシン上の自分のホームディレクトリにある~/.ssh/authorized_keysファイルにコピーする必要があります。authorized_keysファイルは従来の~/.rhostsファイルに相当し、1 行ごとにひとつの鍵を格納します。各行はかなり長くなることもあります)。この後、ユーザはパスワードなしでログインすることができます。

公開鍵認証の変形として、証明書 (certificate) を使った認証が使用できます。これは、公開鍵・秘密鍵の対を使うかわりに、署名された証明書を用います。この方法の利点は、多くの公開鍵・秘密鍵ペアのかわりに、単一の信頼された認証局 (CA) を使えることです。より詳しい情報についてはssh-keygen (1) の「証明書」セクションを参照してください。

公開鍵認証や証明書を使う際に、いちばん便利なのは「認証エージェント」と呼ばれるものを使うことでしょう。詳しくはssh-agent (1) および (追加で)ssh_config (5) におけるAddKeysToAgent設定項目のマニュアルページをごらんください。

チャレンジ・レスポンス認証は以下のようにして動作します:サーバは任意の"チャレンジ"文字列を送り、応答 (レスポンス) を求めます。チャレンジ・レスポンス認証の例としては、BSD認証 (login.conf (5) を参照) や PAM (以外のいくつかのシステム)などがあります。

もし他の認証方法が失敗した場合、ssh はユーザにパスワードを要求します。このパスワードは検査のためリモートホストに送られますが、すべての通信は暗号化されているため、ネットワークを盗聴している何者かによってパスワードが見られてしまうようなことはありません。

ssh はこれまでに使った鍵すべてが入っているデータベースを自動的に保持し、検査します。これらのうち、ホスト鍵はユーザのホームディレクトリにある~/.ssh/known_hostsに格納されます。これらに加え、/etc/ssh/ssh_known_hostsも既知のホストとして自動的に検査されます。新しいホストは、ユーザ側のファイルに自動的に追加されていきます。もしあるホストの鍵がこれまでと変わっていた場合、ssh は警告を発してパスワード認証を禁止します。これはサーバの詐称やなりすまし攻撃を防ぐためです。StrictHostKeyChecking設定項目はホスト鍵が知られていなかったり、それが変更されていた場合のログインを防ぐために使われます。

そのユーザが本人であることが確認できると、サーバは非対話型セッションで与えられたコマンドを実行するか、あるいは、コマンドが指定されていない場合はユーザをそのマシンにログインさせてリモートマシンでの標準的なシェルを与えます。リモートのシェルやコマンドにおけるすべての通信は自動的に暗号化されます。

対話型のセッションが要求された場合、ssh はデフォルトで、その対話型セッションに使うクライアント側の仮想端末 (pty) があれば要求します。-T および-t オプションでこのふるまいを変更することができます。

仮想端末が割り当てられている場合、ユーザは以下のエスケープ文字を使うことができます。

仮想端末が割り当てられていない場合、そのセッションは透過になります。そのため、バイナリデータでも確実に転送できます。ほとんどのシステムでは、たとえ仮想端末が割り当てられている場合でもエスケープ文字に"none"を設定することによって、そのセッションを透過にすることができます。

セッションは、リモートマシン上のコマンドやシェルが完了し、すべての X11 や TCP 接続が閉じられると終了します。


エスケープ文字

仮想端末が割り当てられている場合、ssh ではエスケープ文字を使った機能がいくつかサポートされています。

チルダ記号そのものを 1 回入力するには

~~
を押すか、上で述べられている以外の文字をチルダに続けます。エスケープ文字は、つねに改行の直後に来なければ特別な文字とは見なされません。エスケープ文字は、設定ファイルのEscapeChar設定項目あるいはコマンドラインの-e オプションで変更できます。

現在サポートされているエスケープ機能(エスケープ文字はデフォルトの ~ と仮定します) :

~.
接続を切断します。

~^Z
sshをバックグラウンドに移行させます。

~#
いま転送されている接続の一覧を表示します。

~&
ssh をバックグラウンドに移行させ、転送された接続あるいは X11 のセッションが終了するのを待ってログアウトします。

~?
エスケープ文字の一覧を表示します。

~B
リモートホストに BREAK 信号を送信します(相手もこれをサポートしている場合にのみ有効)。

~C
コマンドラインをオープンします。現在これは-L-R および-D オプション (上記参照) を使っていて、ポート転送を追加したい場合に有効です。また、これはローカルポートの場合、-KL [bindするアドレス :] ポート リモートの場合、-KR [bindするアドレス :] ポート 動的ポート転送の場合、-KD [bindするアドレス :] ポート を使うことによって、すでに有効になっているポート転送を中止することも可能です。
! command
を使うと、ssh_config (5)
PermitLocalCommand
設定項目が許可されている場合、ユーザはローカルなコマンドを実行することができます。基本的なヘルプは-h オプションを使ってください。

~R
その接続の rekeying を要求します(相手もこれをサポートしている場合にのみ有効)。

~V
標準エラー出力に表示されるログの
LogLevel
を下げます。

~v
標準エラー出力に表示されるログの
LogLevel
を上げます。

TCP 転送

安全な通信路を使った任意の TCP/IP 接続への転送は、コマンドラインあるいは設定ファイルで指定します。TCP 転送の応用として、メールサーバへの安全な接続が考えられます。ほかにもファイヤーウォールをまたいで通信するなどの使いみちがあるでしょう。

以下の例では、IRC クライアントとサーバの通信を暗号化する方法を紹介します。たとえ IRC サーバが暗号化を直接サポートしていなくても、通信を暗号化することができます。これは以下のようにして動作します:まず、ユーザがリモートホストにssh で接続し、リモートのサーバに接続を転送するために使うポート番号を指定します。このあと、クライアントマシン上で暗号化のサービスを開始し、ローカルな同じポートに接続すると、ssh はその接続を暗号化して転送します。

以下の例では IRC のセッションをクライアントマシン"127.0.0.1"(localhost)からリモートのサーバ"server.example.com"へとトンネリングします:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10$ irc -c '#users' -p 1234 pinky 127.0.0.1

これはポート 1234 を使って IRC サーバ"server.example.com"への接続をトンネリングし、ニックネーム"pinky"で"#users"チャンネルに join します。ポート番号は、1024 以上であり(特権ポートを使用できるのは root だけです)、他のポートとかち合わなければどこでもかまいません。この接続はリモートサーバ上のポート 6667 に転送されます。これが IRC サービスの標準的なポート番号だからです。

-f オプションはssh をバックグラウンド化させるために利用し、リモートコマンド"sleep 10"はトンネリングするサービスが開始されるまでに一定の時間 (この例では 10 秒) を与えています。もしここで指定された時間内に接続が行われない場合、ssh は終了するでしょう。


X11 転送

ForwardX11項目が"yes"に設定されており (または上記の-X および-x オプションを参照してください)、ユーザが X11 を使っている (環境変数DISPLAY が設定されている) 場合、X11 ディスプレイへの接続は自動的にリモート側に転送されます。つまり、シェル (あるいはコマンド) から起動された X11 プログラムはみな暗号化された通信路を通り、本来の X サーバへの接続はローカルマシン上からなされるようになります。ユーザはDISPLAY を手動で設定すべきではありません。X11 接続の転送はコマンドラインあるいは設定ファイルによって設定できます。

ssh によって設定されたDISPLAY の値はサーバマシン上を指すようになっていますが、ディスプレイ番号は 0 より大きい値になっているでしょう。これは正常な状態です。ssh は暗号化された通信路を介して接続を転送します。そのため、サーバマシン上に X サーバの"プロキシ"をつくるのでこうなるのです。

また、ssh はサーバマシン上で Xauthority 情報を自動的に用意します。ssh はこのためにランダムな認証クッキーを生成し、サーバ側のXauthority に格納し、接続が転送されるときはすべてこのクッキーを持たせるようにします。そして接続が開かれるときに、これが本物のクッキーと置き換わるようにするのです。本物の認証クッキーがサーバ側に送られることは決してありません(し、暗号化されないままでクッキーが送られることもありません)。

ForwardAgent設定項目が"yes"になっていて、ユーザが認証エージェントを使っている場合、認証エージェントに対する接続は自動的にリモート側に転送されます。(以下で説明する-A and-a オプションも参照のこと)。


ホスト鍵の検証

あるサーバに最初に接続したとき、(StrictHostKeyChecking設定項目で禁止されていない限り)ユーザにはそのサーバの公開鍵の指紋 (fingerprint) が提示されます。指紋はssh-keygen (1) コマンドによって得ることができます:

$ ssh-keygen-l-f/etc/ssh/ssh_host_rsa_key

もしこの指紋がすでにわかっている場合、これが一致するかどうかを見て、その鍵を受け入れるか拒否するかを決めることができます。サーバ上で利用可能な指紋がレガシーなもの (MD5) のみである場合、ssh-keygen (1) -E オプションを使うと指紋のアルゴリズムをマッチするものにダウングレードできる場合があります。2つのホスト鍵が一致しているかどうかを、指紋の文字列だけを見比べて判断することは難しいため、random art技術を使って、これらのホスト鍵を視覚的に比較することができます。VisualHostKey設定項目を"yes"にすると、サーバにログインするたびに (そのセッションが対話的であるかないかに関わらず)小さなアスキーアートが表示されます。あらかじめ、既知のサーバが返すパターンを見ておくことにより、ユーザはそのホスト鍵が完全に違うパターンになっているかどうかを容易に判定することができます。これらのパターンに曖昧性がないわけではありません。あるパターンが以前のものに似ている場合、それは高い確率でホスト鍵が同じであるとはいえますが、それが完全に保証されているわけではありません。

既知のすべてのホスト鍵に対して、それらの指紋の random art パターンを表示したい場合は、以下のコマンドを使ってください:

$ ssh-keygen-lv-f~/.ssh/known_hosts

指紋がまだわかっていない場合、別の方法として、SSH の指紋を DNS によって検証することができます。追加の資源レコード (RR) である SSHFP を zone ファイルに追加し、接続するクライアントが提示された公開鍵とその指紋を照合することができます。

以下の例では、あるクライアントがサーバ"host.example.com"に接続するものとします。まずSSHFP 資源レコードを host.example.com の zone ファイルに追加する必要があります:

$ ssh-keygen -r host.example.com.

ここで出力された行を zone ファイルに追加します。このゾーンが指紋の問い合わせに応答するかどうかは、以下のようにしてチェックできます。

$ dig-tSSHFPhost.example.com

最後に、クライアントが以下のようにして接続します:

$ ssh -o "VerifyHostKeyDNS ask" host.example.com[...]Matching host key fingerprint found in DNS.Are you sure you want to continue connecting (yes/no)?

詳しくはssh_config (5)VerifyHostKeyDNS設定項目を参照してください。


SSHを使った仮想プライベートネットワーク (VPN)

ssh は、仮想ネットワークデバイスであるtun (4) を使った、仮想プライベートネットワーク (VPN) のトンネリングをサポートしています。これにより、異なる 2 つのネットワークを安全に結合することができます。sshd_config (5) ファイルにあるPermitTunnel設定項目は、サーバがこの機能をサポートするかどうか、およびサポートするレベル (レイヤ 2 あるいはレイヤ 3)を指定します。

以下の例では、SSH サーバがリモートのネットワークのゲートウェイとして 192.168.1.15 で動いていると仮定した場合にクライアント側のネットワーク 10.0.50.0/24 と、リモート側のネットワーク 10.0.99.0/24 とを、10.1.1.1 から 10.1.1.2 への point-to-point 接続を使って結合します。このときリモート側ネットワークのゲートウェイでは 192.168.1.15 でSSH サーバが走っており、この接続を許可しているものとします。

クライアント側:

# ssh -f -w 0:1 192.168.1.15 true# ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252# route add 10.0.99.0/24 10.1.1.2

サーバ側:

# ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252# route add 10.0.50.0/24 10.1.1.1

クライアントのアクセス権限はサーバ側の/root/.ssh/authorized_keysファイル (下記参照)、およびサーバのPermitRootLogin設定項目でより細かく制御できます。以下のエントリは、PermitRootLogin項目が"forced-commands-only"に設定されている場合のもので、ユーザ jane に対してはtun (4) デバイス 1番 への接続を許可し、ユーザ john に対してはtun デバイス 2 番 への接続を許可します:

tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... janetunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

SSH 経由の VPN は大きなオーバーヘッドをともなうため、これはワイヤレス VPN などの、一時的な設定にのみ使うのが望ましいでしょう。より長期的な VPN 接続は、ipsecctl (8)isakmpd (8) といったツールを使うほうが優れています。


環境変数

ssh はふつう以下の環境変数を設定します:

DISPLAY
環境変数DISPLAY は X11 サーバの場所を示しています。これはssh によって、"hostname:n"という形の値が自動的に設定されます。ここで"hostname"の部分はシェルが走っているホストを表しており、 `n' [Ge] 1 の整数です。ssh は X11 接続を安全な通信路で転送するために、この特別な値を使います。X11 の接続が安全でなくなってしまうため、ユーザは環境変数DISPLAY を自分で設定すべきではありません(また、それをやってしまうとユーザは認証に必要なクッキーを手でコピーしなければならなくなります)。

HOME
ユーザのホームディレクトリのパス名が設定されます。

LOGNAME
環境変数USER と同じです。これは、この変数を使うシステムで互換性を保つために設定されます。

MAIL
ユーザのメールボックスのパス名が設定されます。

PATH
デフォルトのPATH です。これはssh のコンパイル時に指定されます。

SSH_ASKPASS
パスフレーズを入力する際、ssh が端末から起動されているとssh はパスフレーズをその端末から要求します。ssh が制御できる端末を持っておらず、環境変数DISPLAY およびSSH_ASKPASS が設定されている場合、sshSSH_ASKPASS によって指定されるプログラムを起動し、X11 ウインドウを使ってパスフレーズを要求します。これはssh.xsessionやそれに類するスクリプトから呼び出す際にとくに役に立ちます。(マシンによっては、これがうまく動くためには標準入力を/dev/nullにリダイレクトする必要があるかもしれません)

SSH_AUTH_SOCK
認証エージェントと通信するのに使われるUnixドメインソケットのパスを表しています。

SSH_CONNECTION
接続の両端にあるクライアントとサーバの識別子です。この変数にはスペースで区切られた 4 つの値が入っています:クライアントの IP アドレス、クライアントのポート、サーバの IP アドレス および サーバのポートです。

SSH_ORIGINAL_COMMAND
強制コマンドが実行されると、この変数には、元々指定されていたコマンドラインの値が入ります。ここから本来の引数を取り出すことができます。

SSH_TTY
現在のシェルあるいはコマンドに割り当てられている tty の名前(端末装置へのパス) に設定されます。現在のセッションが端末を持たない場合、この変数は設定されません。

TZ
デーモンが起動したとき、現在の時間帯を表すタイムゾーン変数が設定されていると、それがここに入ります (つまりデーモンはその値を新規の接続に渡します)。

USER
ログインしているユーザ名に設定されます。

これらに加えて、ssh~/.ssh/environmentファイルが存在してユーザがその変更を許可されていればそれを読み込み、"VARNAME=value"という形式の行を環境変数に追加します。より詳しい情報については、sshd_config (5)PermitUserEnvironment設定項目を参照してください。


関連ファイル

~/.rhosts
このファイルはホストベースド認証(host-based authentication、上記参照) で使われます。ユーザのホームディレクトリが NFS パーティション上にあるようなマシンでは、このファイルは誰にでも読み込み可能でなければなりません。なぜならsshd (8) はこれを root として読むからです。また、このファイルはそのユーザの所有でなければならず、他の人が書き込み可能であってはいけません。ほとんどのマシンにおける推奨されるパーミッションは、所有者は読み書き可能であるが、他の人はアクセス不可能というものです。

~/.shosts
このファイルは.rhostsとまったく同じように扱われます。このファイルを使うと、rlogin や rsh ではログインできないようにしつつ、ホストベースド認証を許可することができます。

~/.ssh/
このディレクトリはユーザ用のすべての設定や認証用の情報が入るデフォルトの場所です。一般的に、このディレクトリの内容をまるごと隠しておくという必要があるわけではありませんが、推奨されるパーミッションは、所有者に対しては read/write/execute を許可し、他の人にはアクセスさせないようにしておく、というものです。

~/.ssh/authorized_keys
このユーザのログインに使われる公開鍵 (DSA, ECDSA, Ed25519, RSA) の一覧です。この形式はsshd (8) のマニュアルで説明されています。これは特に見られてまずいというものではないのですが、できれば所有者からは読み/書きが可能で、他人からはアクセス不可能なパーミッションに設定しておくのがよいでしょう。

~/.ssh/config
ユーザごとの個人用設定ファイルです。このファイルの形式と設定項目はssh_config (5) で説明されています。このファイルは潜在的に悪用される危険性があるため、パーミッションは厳しくしておくのがいいでしょう。所有者のみが読み書き可能で、他者は書き込みできないようにしておくべきです。

~/.ssh/environment
環境変数の追加定義を格納します。上の環境変数のセクションを見てください。

~/.ssh/identity

~/.ssh/id_dsa

~/.ssh/id_ecdsa

~/.ssh/id_ed25519

~/.ssh/id_rsa
認証のための秘密鍵が格納されています。これらのファイルには他人に見られてはいけないデータが入っているため、そのユーザには読めても、他人からはアクセスできないようにしてください(読み込み/書き込み/実行属性ともに)。ssh は、他人にアクセスできるようになっている秘密鍵ファイルは無視するので注意してください。鍵を作成するときにパスフレーズを指定することも可能です。このパスフレーズはファイル中の見られるべきでない部分を、3DES を使って暗号化するのに用いられます。

~/.ssh/identity.pub

~/.ssh/id_dsa.pub

~/.ssh/id_ecdsa.pub

~/.ssh/id_ed25519.pub

~/.ssh/id_rsa.pub
認証のための公開鍵が格納されています。これらのファイルは見られてもよいため、他人が読めるようにしておいてもかまいません (が、別にそうする必要はありません)。

~/.ssh/known_hosts
にはユーザがこれまでにログインしたホスト鍵のうち、システム全体の known_hosts 一覧にないものが格納されます。このファイルの形式に関する詳しい情報はsshd (8) を参照してください。

~/.ssh/rc
このファイルのコマンドは、ユーザがログインしてシェル(あるいはコマンド) が開始する直前にssh によって実行されます。より詳しい情報についてはsshd (8) のマニュアルを見てください。

/etc/hosts.equiv
このファイルはホストベースド認証(host-based authentication、上記参照) で使われます。このファイルは root だけが書き込めるようにしておくべきです。

/etc/shosts.equiv
このファイルは/etc/hosts.equivとまったく同じように扱われます。このファイルを使うと、rlogin や rsh ではログインできないようにしつつ、ホストベースド認証を許可することができます。

/etc/ssh/ssh_config
システム全体にわたる設定ファイルです。このファイルの形式と設定項目はssh_config (5) で説明されています。

/etc/ssh/ssh_host_key

/etc/ssh/ssh_host_dsa_key

/etc/ssh/ssh_host_ecdsa_key

/etc/ssh/ssh_host_ed25519_key

/etc/ssh/ssh_host_rsa_key
これらのファイルにはホスト秘密鍵が格納されています。これらは、ホストベースの認証に使われます。

/etc/ssh/ssh_known_hosts
システム全体の known_hosts ファイルです。このファイルはシステム管理者によって用意され、その組織内で使われるすべてのマシン用の公開ホスト鍵を格納するようになっているべきです。このファイルは誰でも読めるようになっている必要があります。このファイルの詳しい形式はsshd (8) のマニュアルで説明されています。

/etc/ssh/sshrc
このファイル中のコマンドは、ユーザがログインしたあと、そのユーザのシェル (あるいはコマンド) が開始する直前にssh によって実行されます。より詳しい情報についてはsshd (8) のマニュアルを見てください。

終了状態

ssh はリモートで実行されたコマンドの終了状態か、もしエラーが発生した場合は 255 を終了状態として返します。

関連項目

scp (1), sftp (1), ssh-add (1), ssh-agent (1), ssh-keygen (1), ssh-keyscan (1), tun (4), ssh_config (5), ssh-keysign (8,) sshd (8)

標準


作者

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 の貢献によるものです。