この章の内容は次のとおりです。
Secure Shell を使用すると、セキュリティ保護されていないネットワークを介した場合でも、リモートホストに安全にアクセスすることができます。認証は、パスワードまたは公開鍵、あるいはその両方を使用して行われます。すべてのネットワークトラフィックは暗号化されます。このため、Secure Shell では、悪意を持つ侵入者が傍受した通信を読んだり、偽装したりすることはできません。
Secure Shell には、リモートログインおよびリモートファイル転送を行うコマンドが組み込まれています。Secure Shell はオンデマンドタイプの Virtual Private Network (VPN) として使用することもでき、ローカルマシンとリモートマシンとの間で X Window System のトラフィックやポート番号を、暗号化されたネットワーク接続を介して転送することができます。
Secure Shell では、次の操作を行うことができます。
セキュリティ保護されていないネットワークを介して、別のホストに安全にログインする
2 つのホスト間でファイルを安全にコピーする
リモートホスト上でコマンドを安全に実行する
Solaris Secure Shell では、2 つのバージョンの Secure Shell プロトコルを利用できます。バージョン 1 は、Secure Shell プロトコルのオリジナルバージョンです。バージョン 2 は、安全性が向上し、バージョン 1 の基本的なセキュリティ設計上の欠点が修正されています。そのためバージョン 1 は、バージョン 2 に移行するユーザーを支援する目的だけに提供しています。バージョン 1 は、できるだけ使用しないでください。
このマニュアルでは、v1 はバージョン 1、v2 はバージョン 2 を表しています。
ユーザー認証 – ユーザーは、次のいずれかによって認証されます。
パスワード – ユーザーは、ログインプロセスアカウントのパスワードを入力します。
公開鍵 – ユーザーは、公開鍵と非公開鍵のペアを作成します。これらは、ローカルホストに格納されます。リモートホストには公開鍵が渡されます。公開鍵は、認証を完了するために必要です。
非公開鍵を管理するホストから、認証を行うホストに必要な公開鍵が渡されます。公開鍵認証は、パスワード認証よりも強力な認証メカニズムです。これは、非公開鍵がネットワーク上を移動しないためです。公開鍵と非公開鍵のペアは、ユーザーのホームディレクトリの .ssh サブディレクトリの下に格納されます。次の表に、公開鍵と非公開鍵を格納する ID ファイルのデフォルト名を示します。
表 5–1 ID ファイルの命名規則
非公開鍵、公開鍵 |
暗号化方式とプロトコルのバージョン |
---|---|
identity、identity.pub |
RSA v1 |
id_rsa、 id_rsa.pub |
RSA v2 |
id_dsa、id_dsa.pub |
DSA v2 |
ホスト認証 – ホスト認証では、ローカルホストの公開鍵に対するアクセス権をリモートホストに与える必要があります。ローカルホストの公開鍵のコピーは、リモートホストの $HOME/.ssh/known_hosts に格納されます。
次の表は、認証方式、互換性のあるプロトコルのバージョン、ローカルホストとリモートホストの要件、およびセキュリティレベルの一覧です。デフォルトの認証方式は、パスワードベースの認証です。
表 5–2 Secure Shell の認証方式
認証方式 (プロトコルのバージョン) |
ローカルホストの要件 |
リモートホストの要件 |
セキュリティレベル |
---|---|---|---|
パスワードベース (v1 または v2) |
ユーザーアカウント |
ユーザーアカウント |
中 |
RSA/DSA 公開鍵 (v2) |
ユーザーアカウント $HOME/.ssh/id_rsa または $HOME/.ssh/id_dsa に非公開鍵 $HOME/.ssh/id_rsa.pub または $HOME/.ssh/id_dsa.pub に公開鍵 |
ユーザーアカウント $HOME/.ssh/authorized_keys にユーザーの公開鍵 (id_rsa.pub または id_dsa.pub ) |
強 |
RSA 公開鍵 (v1) |
ユーザーアカウント $HOME/.ssh/identity に非公開鍵 $HOME/.ssh/identity.pub に公開鍵 |
ユーザーアカウント $HOME/.ssh/authorized_keys にユーザーの公開鍵 (identity.pub ) |
強 |
.rhosts と RSA (v1) |
ユーザーアカウント |
ユーザーアカウント /etc/hosts.equiv、 /etc/shosts.equiv、$HOME/.rhosts、または $HOME/.shosts にローカルホスト名 $HOME/.ssh/known_hosts または /etc/ssh/ssh_known_hosts にローカルホスト公開鍵 |
中 |
.rhosts のみ (v1 または v2) |
ユーザーアカウント |
ユーザーアカウント /etc/hosts.equiv、 /etc/shosts.equiv、$HOME/.rhosts、または $HOME/.shosts にローカルホスト名 | 弱 |
作業 |
説明 |
参照先 |
---|---|---|
公開鍵と非公開鍵のペアを作成する |
公開鍵と非公開鍵のペアを使用することは、ユーザー自身を証明し、通信を暗号化するので望ましい方法である | |
Secure Shell を使用してログインする | 暗号化された Secure Shell 通信を有効にするには、rsh を使用する場合と同様の方法で、リモートログインする | |
パスワードを使用せずに Secure Shell を使用してログインする |
ssh-agent を使用してパスワードを入力しなくても、Secure Shell を使用してログインできる。ssh-agent コマンドは、手動でまたは起動時スクリプトから実行できる | |
Secure Shell にポート転送する | Secure Shell 接続で使用されるローカルポートまたはリモートポートを指定できる | |
Secure Shell を使用してファイルをコピーする |
リモートファイルを安全にコピーできる | |
Secure Shell を使用してファイルを転送する |
ftp と同様に、Secure Shell が稼動するリモートホストに転送用コマンドを使用してログインできる | |
ファイアウォールの内部のホストから外部のホストに接続する |
Secure Shell には、HTTP または SOCKS5 と互換性のあるコマンドが組み込まれており、構成ファイルまたはコマンド行に指定できる |
Secure Shell 公開鍵と非公開鍵のペアを作成するときの、標準的な手順について説明します。追加のオプションについては、ssh-keygen(1) のマニュアルページを参照してください。
鍵の生成プログラムを起動します。
myLocalHost% ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key(/home/johndoe/.ssh/id_rsa): |
鍵が格納されるファイルのパスを入力します。
デフォルトでは、RSA v2 の鍵を表すファイル名 id_rsa がカッコ内に表示されます。このファイルを選択するときは、Return キーを押します。また、別のファイル名を入力することもできます。
Enter file in which to save the key(/home/johndoe/.ssh/id_rsa): <Return キーを押す> |
公開鍵の名前が自動的に作成され、文字列 .pub が非公開鍵の名前に付加されます。
鍵に使用するパスフレーズを入力します。
このパスフレーズは、非公開鍵を暗号化するときに使用されます。パスフレーズは、10 〜 30 文字の英数字を混在させて指定してください。単純な英語の文や英語の名前の使用は避けてください。空文字を入力すると、パスフレーズを使用しないことを意味しますが、ユーザーアカウントには、できるだけパスフレーズを使用するようにしてください。入力したパスフレーズは表示されません。
Enter passphrase(empty for no passphrase): <パスフレーズを入力> |
確認のためにパスフレーズを再入力します。
Enter same passphrase again: <パスフレーズを入力> Your identification has been saved in /home/johndoe/.ssh/id_rsa. Your public key has been saved in /home/johndoe/.ssh/id_rsa.pub. The key fingerprint is: 0e:fb:3d:57:71:73:bf:58:b8:eb:f3:a3:aa:df:e0:d1 johndoe@myLocalHost |
結果を確認します。
鍵のフィンガープリント (コロンで区切られた 2 桁の 16 進数値列) が表示されます。鍵へのパスが正しいことを確認します。この例では、パスは /home/johndoe/.ssh/id_rsa.pub です。この時点で公開鍵と非公開鍵のペアが作成されました。
公開鍵をコピーして、$HOME/.ssh/authorized_keys ファイルに鍵を追加します。このファイルは、リモートホスト上のユーザーのホームディレクトリにあります。
ssh コマンドを使用して、リモートホストの名前を指定します。
myLocalHost% ssh myRemoteHost |
The authenticity of host 'myRemoteHost' can't be established. RSA key fingerprint in md5 is: 04:9f:bd:fc:3d:3e:d2:e7:49:fd:6e:18:4f:9c:26 Are you sure you want to continue connecting(yes/no)? |
このプロンプトは正常であるので、yes を入力して処理を続行します。このリモートホスト上で ssh を使用したことがあるのに、この警告メッセージが表示される場合は、セキュリティ違反が発生している可能性があります。
Secure Shell のパスフレーズとアカウントのパスワードを要求するプロンプトが表示されたら、これらを入力します。
Enter passphrase for key '/home/johndoe/.ssh/id_rsa': <Return キーを押す> johndoe@myRemoteHost's password: <Return キーを押す> Last login: Fri Jul 20 14:24:10 2001 from myLocalHost myRemoteHost% |
リモートホストで任意のトランザクションを実行します。送信したコマンドと応答はすべて暗号化されます。
パスフレーズを後で変更する場合は、 ssh-keygen に -p オプションを指定して使用します。
リモートセッションが完了したら、exit を入力するか、通常の方法でシェルを終了します。
myRemoteHost% exit myRemoteHost% logout Connection to myRemoteHost closed myLocalHost% |
Secure Shell を使用するときに、パスフレーズとパスワードを省略する場合は、エージェントデーモンを使用します。セッションを開始するときに、ssh-agent コマンドを使用してください。次に、エージェントを使用して非公開鍵を格納するために、ssh-add を使用します。ホストごとにアカウントが異なる場合は、セッションで使用する非公開鍵を追加します。エージェントの起動は、次の手順で説明するように、必要に応じて手動で行うことができます。各セッションを開始するときに、エージェントが自動的に動作するように設定することもできます (ssh-agent が自動的に動作するように設定する方法を参照)。
エージェントデーモンを起動します。
ssh-agent コマンドがエージェントデーモンを起動し、そのプロセス ID が表示されます。
myLocalHost% eval `ssh-agent` Agent pid 9892 myLocalHost% |
使用する非公開鍵をエージェントデーモンに追加します。
ssh-add コマンドがエージェントデーモンに非公開鍵を追加します。このため、後続の Secure Shell の操作では、パスフレーズを要求するプロンプトは表示されません。
myLocalHost% ssh-add Enter passphrase for /home/johndoe/.ssh/id_rsa: Identity added: /home/johndoe/.ssh/id_rsa(/home/johndoe/.ssh/id_rsa) myLocalHost% |
Secure Shell セッションを起動します。
myLocalHost% ssh myRemoteHost |
ssh-add を使用して、別の鍵をデーモンに追加することもできます。たとえば、DSA v2、RSA v2、および RSA v1 の鍵を同時に使用したい場合があります。デーモンに格納されているすべての鍵を表示するには、-l オプションを使用します。デーモンから 1 つの鍵を削除するには、-d オプションを使用します。すべての鍵を削除するには、-D オプションを使用します。
myLocalHost% eval `ssh-agent` Agent pid 3347 myLocalHost% ssh-add Enter passphrase for /home/johndoe/.ssh/id_rsa: Identity added: /home/johndoe/.ssh/id_rsa(/home/johndoe/.ssh/id_rsa) myLocalHost% ssh-add /home/johndoe/.ssh/id_dsa Enter passphrase for /home/johndoe/.ssh/id_dsa: <パスフレーズを入力> Identity added: /home/johndoe/.ssh/id_dsa(/home/johndoe/.ssh/id_dsa) myLocalHost% ssh-add -l md5 1024 0e:fb:3d:53:71:77:bf:57:b8:eb:f7:a7:aa:df:e0:d1 /home/johndoe/.ssh/id_rsa(RSA) md5 1024 c1:d3:21:5e:40:60:c5:73:d8:87:09:3a:fa:5f:32:53 /home/johndoe/.ssh/id_dsa(DSA) myLocalHost% ssh-add -d Identity removed: /home/johndoe/.ssh/id_rsa(/home/johndoe/.ssh/id_rsa.pub) /home/johndoe/.ssh/id_dsa(DSA) |
Secure Shell を使用するときにパスフレースとパスワードを入力しないようにするには、.dtprofile スクリプトを使用してエージェントデーモン (ssh-agent) を起動します。
エージェントデーモンを自動的に起動するには、$HOME/.dtprofile スクリプトの最後に次の行を追加します。
if [ "$SSH_AUTH_SOCK" = "" -a -x /usr/bin/ssh-agent ]; then eval `/usr/bin/ssh-agent` fi |
CDE セッションを終了するときに Secure Shell エージェントデーモンを終了するには、$HOME/.dt/sessions/sessionexit スクリプトに次の行を追加します。
if [ "$SSH_AGENT_PID" != "" -a -x /usr/bin/ssh-agent ]; then /usr/bin/ssh-agent -k fi |
このエントリにより、CDE セッションが終了したあとで、Secure Shell エージェントは使用できなくなります。
Secure Shell セッションを起動します。
myLocalHost% ssh myRemoteHost |
パスフレーズのプロンプトは表示されません。
リモートホストに転送されるローカルポートを指定することができます。指定すると、ソケットはローカル側で、そのポートを待機します。このポートからリモートホストへの接続は、セキュリティ保護されたチャネルを介して行われます。たとえば、IMAP4 で電子メールを安全にリモート受信するためにポート 143 を指定します。また、リモート側のポートを指定することもできます。
転送元のローカルポートを設定するには、待機するローカルポートと、転送先のリモートホストとポートを指定します。
myLocalHost% ssh -L localPort:remoteHost:remotePort |
セキュリティ保護された接続で受信するためのリモートポートを設定するには、待機するリモートポートと、転送先のローカルホストとポートを指定します。
myLocalHost% ssh -R remotePort:localHost:localPort |
次の例は、ローカルポート転送を使用して、リモートサーバーからのメールを安全に受信する方法を示しています。
myLocalHost% ssh -L 9143:myRemoteHost:143 myRemoteHost |
このコマンドは、myLocalHost のポート 9143 を myRemoteHost のポート 143 (IMAP v2 のサーバーポート) に接続を転送します。ユーザーがメールアプリケーションを起動するときは、ローカルポート番号を指定する必要があります。dtmail コマンドの使用例を 図 5–1 に示します。
この例と 例 — リモートポート転送を使用してファイアウォールの外部と通信するで使用されている localhost は、ユーザーのローカルホストを指定するキーワードです。localhost と myLocalHost を混同しないでください。myLocalHost は、この章の例でローカルホストを識別するために使用した仮のホスト名です。
この例では、エンタープライズ環境のユーザーが、外部ネットワーク上のホストから企業のファイアウォール内部のホストに接続を転送する方法を示しています。
myLocalHost% ssh -R 9022:myLocalHost:22 myOutsideHost |
このコマンドは、myOutsideHost 上のポート 9022 への接続をローカルホストのポート 22 (sshd サーバー) に転送します。
myOutsideHost% ssh -p 9022 localhost myLocalHost% |
このコマンドを使用すると、リモート転送接続が確立されたあとで、ssh を使用してリモートホストから安全に接続できます。
scp コマンドを使用して、暗号化されたファイルをホスト間でコピーします。暗号化されたファイルは、ローカルホストとリモートホストとの間、または 2 つのリモートホスト間でコピーできます。このコマンドは、rcp コマンドと同様に動作しますが、パスワードを要求するプロンプトを表示します。詳細は、scp(1) のマニュアルページを参照してください。
セキュリティ保護されたコピープログラムを起動します。
ソースファイル、リモートコピー先のユーザー名、およびコピー先ディレクトリを指定します。
myLocalHost% scp myfile.1 johndoe@myRemoteHost:~ |
Secure Shell パスフレーズを要求するプロンプト表示で、パスフレーズを入力します。
Enter passphrase for key '/home/johndoe/.ssh/id_rsa': <Return キーを押す> myfile.1 25% |******* | 640 KB 0:20 ETA myfile.1 |
パスフレーズを入力すると、進行状況インジケータが表示されます。上記の出力の 2 行目が進行状況インジケータです。進行状況インジケータには、次の項目が表示されます。
ファイル名
その時点で転送が完了しているファイルの割合 (%)
転送が完了した割合 (%) に対応したアスタリスク (*)
転送が完了したデータの量
ファイル全体が転送されるまでの推定時間 (ETA)。推定残り時間
sftp コマンドの動作は、ftp と類似していますが、使用するコマンドセットが異なります。次の表に、代表的なコマンドを示します。
表 5–3 対話型 sftp のサブコマンド
Secure Shell を使用して、ファイアウォール内部のホストからファイアウォール外部のホストに接続することができます。接続するには、構成ファイル内またはコマンド行オプションに ssh のプロキシコマンドを指定します。詳細は、例 — コマンド行からファイアウォール外部のホストに接続するを参照してください。
通常は、個人用構成ファイル $HOME/.ssh/config または管理構成ファイル/etc/ssh/ssh_config を使用して、ssh の対話操作をカスタマイズできます(ssh_config(4) のマニュアルページを参照)。プロキシコマンドには2 種類あり、 一方がHTTP 接続用、もう一方が SOCKS5 接続用です。
構成ファイルにプロキシコマンドとホストを指定します。
次の構文を使用して、必要なプロキシコマンドとホストの数に応じて行を追加します。
[Host outside_host] ProxyCommand proxy_command [-h proxy_server] \ [-p proxy_port] outside_host|%h outside_port|%p |
このホスト (ワイルドカードを使用した場合は複数のホスト) がコマンド行で指定されたときに、このプロキシコマンドの指定をインスタンスに限定するには、Host outside_host オプションを使用します。
proxy_command の指定は、次のいずれかに置き換えます。
HTTP 接続の場合は、/usr/lib/ssh/ssh-http-proxy-connect
SOCKS 接続の場合は、/usr/lib/ssh/ssh-socks5-proxy-connect
-h proxy_server と - p proxy_port オプションには、それぞれプロキシサーバーとプロキシポートを指定します。これらのオプションを指定した場合は、プロキシサーバーとプロキシポートを指定する環境変数 (HTTPPROXY、HTTPPROXYPORT、http_proxy (URLを指定する場合)、SOCKS5_SERVER、および SOCKS5_PORT) よりもオプションが優先されます。このオプションを指定しない場合は、関連する環境変数を設定する必要があります。ssh-socks5-proxy-connect(1)とssh-http-proxy-connect(1) のマニュアルページを参照してください。
outside_host を使用して接続先のホストを指定するか、%h を使用してコマンド行でホストを指定します。outside_port または %p を使用して、ポートを指定します。Host outside_host オプションを使用しないで %h と %p を指定すると、ssh が起動するたびにプロキシコマンドがホスト引数に適用されます。
外部のホストを指定して、Secure Shell を実行します。
たとえば、次のように入力します。
myLocalHost% ssh myOutsideHost |
このコマンドは、個人用構成ファイル内で myOutsideHost のプロキシコマンド指定を検索します。検出されない場合は、システム全体の構成ファイル ssh_config から検索します。プロキシコマンドが ssh に置き換わります。
ssh の -o オプションには、ssh 構成ファイル内で使用できる任意の行を入力できます。ここでは、前述の例のプロキシコマンド指定を使用します。
構成ファイルにプロキシコマンドとホストを指定します。
ssh を実行します。このとき、-o オプションにプロキシコマンドを指定してください。たとえば、次のように入力します。
% ssh -o'Proxycommand=/usr/lib/ssh/ssh-http-proxy-connect \ -h myProxyServer -p 8080 myOutsideHost 22' myOutsideHost |
このコマンドは、ssh を HTTP プロキシコマンドに置き換え、ポート 8080 と myProxyServer をプロキシサーバーとして使用し、 myOutsideHost のポート 22 に接続します。