Solaris のシステム管理 (セキュリティサービス)

Secure Shell の使用

公開鍵と非公開鍵のペアを作成する方法

Secure Shell 公開鍵と非公開鍵のペアを作成するときの、標準的な手順について説明します。追加のオプションについては、ssh-keygen(1) を参照してください。

  1. 鍵の生成プログラムを起動します。


    myLocalHost% ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key(/home/johndoe/.ssh/id_rsa): 
  2. 鍵が格納されるファイルのパスを入力します。

    デフォルトでは、RSA v2 の鍵を表すファイル名 id_rsa がカッコ内に表示されます。このファイルを選択するときは、Return キーを押します。また、別のファイル名を入力することもできます。


    Enter file in which to save the key(/home/johndoe/.ssh/id_rsa): 
    <Return キーを押す> 
    

    公開鍵の名前が自動的に作成され、文字列 .pub が非公開鍵の名前に付加されます。

  3. 鍵に使用するパスフレーズを入力します。

    このパスフレーズは、非公開鍵を暗号化するときに使用されます。パスフレーズは、10 〜 30 文字の英数字を混在させて指定してください。単純な英語の文や英語の名前の使用は避けてください。空文字を入力すると、パスフレーズを使用しないことを意味しますが、ユーザーアカウントには、できるだけパスフレーズを使用するようにしてください。入力したパスフレーズは表示されません。


    Enter passphrase(empty for no passphrase):  <パスフレーズを入力>
    
  4. 確認のためにパスフレーズを再入力します。


    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
  5. 結果を確認します。

    鍵のフィンガープリント (コロンで区切られた 2 桁の 16 進数値列) が表示されます。鍵へのパスが正しいことを確認します。この例では、パスは /home/johndoe/.ssh/id_rsa.pub です。この時点で公開鍵と非公開鍵のペアが作成されました。

  6. 公開鍵をコピーして、$HOME/.ssh/authorized_keys ファイルに鍵を追加します。このファイルは、リモートホスト上のユーザーのホームディレクトリにあります。

Secure Shell を使用して別のホストにログインする方法

  1. ssh コマンドを使用して、リモートホストの名前を指定します。


    myLocalHost% ssh myRemoteHost
    
    ssh を初めて実行すると、リモートホストの認証を要求するプロンプトが次のように表示されます。


    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 を使用したことがあるのに、この警告メッセージが表示される場合は、セキュリティ違反が発生している可能性があります。

  2. 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 オプションを指定して使用します。


  3. リモートセッションが完了したら、exit を入力するか、通常の方法でシェルを終了します。


    myRemoteHost% exit
    myRemoteHost% logout
    Connection to myRemoteHost closed
    myLocalHost%

パスワードを使用せずに ssh-agent を使用してログインする方法

Secure Shell を使用するときに、パスフレーズとパスワードを省略する場合は、エージェントデーモンを使用します。セッションを開始するときに、ssh-agent コマンドを使用してください。次に、エージェントを使用して非公開鍵を格納するために、ssh-add を使用します。ホストごとにアカウントが異なる場合は、セッションで使用する非公開鍵を追加します。エージェントの起動は、次の手順で説明するように、必要に応じて手動で行うことができます。各セッションを開始するときに、エージェントが自動的に動作するように設定することもできます (ssh-agent が自動的に動作するように設定する方法」を参照)。

  1. エージェントデーモンを起動します。

    ssh-agent コマンドがエージェントデーモンを起動し、そのプロセス ID が表示されます。


    myLocalHost% eval `ssh-agent`
    Agent pid 9892
    myLocalHost% 
  2. 使用する非公開鍵をエージェントデーモンに追加します。

    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%
  3. Secure Shell セッションを起動します。


    myLocalHost% ssh myRemoteHost
    

例 - ssh-add オプションを使用する

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)

ssh-agent が自動的に動作するように設定する方法

Secure Shell を使用するときにパスフレースとパスワードを入力しないようにするには、.dtprofile スクリプトを使用してエージェントデーモン (ssh-agent) を起動します。

  1. エージェントデーモンを自動的に起動するには、$HOME/.dtprofile スクリプトの最後に次の行を追加します。


    if [ "$SSH_AUTH_SOCK" = "" -a -x /usr/bin/ssh-agent ]; then
                    eval `/usr/bin/ssh-agent`
    fi
  2. 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 エージェントは使用できなくなります。

  3. Secure Shell セッションを起動します。


    myLocalHost% ssh myRemoteHost
    

    パスフレーズのプロンプトは表示されません。

Secure Shell のポート転送を使用する方法

リモートホストに転送されるローカルポートを指定することができます。指定すると、ソケットはローカル側で、そのポートを待機します。このポートからリモートホストへの接続は、セキュリティ保護されたチャネルを介して行われます。たとえば、IMAP4 で電子メールを安全にリモート受信するためにポート 143 を指定します。また、リモート側のポートを指定することもできます。

  1. 転送元のローカルポートを設定するには、待機するローカルポートと、転送先のリモートホストとポートを指定します。


    myLocalHost% ssh -L localPort:remoteHost:remotePort 
    
  2. セキュリティ保護された接続で受信するためのリモートポートを設定するには、待機するリモートポートと、転送先のローカルホストとポートを指定します。


    myLocalHost% ssh -R remotePort:localHost:localPort 
    

例 - ローカルポート転送を使用してメールを受信する

次の例は、ローカルポート転送を使用して、リモートサーバーからのメールを安全に受信する方法を示しています。


myLocalHost% ssh -L 9143:myRemoteHost:143 myRemoteHost 

このコマンドは、myLocalHost のポート 9143myRemoteHost のポート 143 (IMAP v2 のサーバーポート) に接続を転送します。ユーザーがメールアプリケーションを起動するときは、ローカルポート番号を指定する必要があります。dtmail コマンドの使用例を 図 4-1 に示します。

この例と 「例 - リモートポート転送を使用してファイアウォールの外部と通信する」で使用されている localhost は、ユーザーのローカルホストを指定するキーワードです。localhostmyLocalHost を混同しないでください。myLocalHost は、この章の例でローカルホストを識別するために使用した仮のホスト名です。

図 4-1 電子メールに使用するポート転送を指定する

Graphic

例 - リモートポート転送を使用してファイアウォールの外部と通信する

この例では、エンタープライズ環境のユーザーが、外部ネットワーク上のホストから企業のファイアウォール内部のホストに接続を転送する方法を示しています。


myLocalHost% ssh -R 9022:myLocalHost:22 myOutsideHost

このコマンドは、myOutsideHost 上のポート 9022 への接続をローカルホストのポート 22 (sshd サーバー) に転送します。


myOutsideHost% ssh -p 9022 localhost
myLocalHost%

このコマンドを使用すると、リモート転送接続が確立されたあとで、ssh を使用してリモートホストから安全に接続できます。

Secure Shell を使用してファイルをコピーする方法

scp コマンドを使用して、暗号化されたファイルをホスト間でコピーします。暗号化されたファイルは、ローカルホストとリモートホストとの間、または 2 つのリモートホスト間でコピーできます。このコマンドは、rcp コマンドと同様に動作しますが、パスワードを要求するプロンプトを表示します。詳細は、scp(1) のマニュアルページを参照してください。

  1. セキュリティ保護されたコピープログラムを起動します。

    ソースファイル、リモートコピー先のユーザー名、およびコピー先ディレクトリを指定します。


    myLocalHost% scp myfile.1 johndoe@myRemoteHost:~
    
  2. 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 を使用したファイルのリモート転送

sftp コマンドの動作は、ftp と類似していますが、使用するコマンドセットが異なります。次の表に、代表的なコマンドを示します。

表 4-3 対話型 sftp のサブコマンド
 カテゴリ

サブコマンド 

説明 

移動 

cd path

リモートディレクトリを path に変更する

 

lcd path

ローカルディレクトリを path に変更する

所有権 

chgrp group file

file のグループを group (数値 GID) に変更する

 

chmod mode file

file のアクセス権を変更する

 ファイルのコピー

get remote_file [local-path ]

remote_file を取得してローカルホストに格納する

 

put local_file [remote_path ]

ローカルファイルをリモートホストに格納する 

 

rename old_filenew_file

ローカルファイルの名前を変更する 

ディレクトリのリスト表示 

ls [path]

リモートディレクトリの内容を一覧表示する 

ディレクトリの作成 

mkdir path

リモートディレクトリを作成する 

その他 

exitquit

sftp コマンドを終了する

ファイアウォール外部のホストにデフォルト接続を設定する方法

Secure Shell を使用して、ファイアウォール内部のホストからファイアウォール外部のホストに接続することができます。接続するには、構成ファイル内またはコマンド行オプションに ssh のプロキシコマンドを指定します。詳細は、「例 - コマンド行からファイアウォール外部のホストに接続する」を参照してください。

通常は、個人用構成ファイル $HOME/.ssh/config または管理構成ファイル/etc/ssh/ssh_config を使用して、ssh の対話操作をカスタマイズできます (ssh_config(4) マニュアルページを参照)。プロキシコマンドには 2 種類あり、一方が HTTP 接続用、もう一方が SOCKS5 接続用です。

  1. 構成ファイルにプロキシコマンドとホストを指定します。

    次の構文を使用して、必要なプロキシコマンドとホストの数に応じて行を追加します。


    [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 オプションには、それぞれプロキシサーバーとプロキシポートを指定します。これらのオプションを指定した場合は、プロキシサーバーとプロキシポートを指定する環境変数 (HTTPPROXYHTTPPROXYPORThttp_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 が起動するたびにプロキシコマンドがホスト引数に適用されます。

  2. 外部のホストを指定して、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 プロキシコマンドに置き換え、ポート 8080myProxyServer をプロキシサーバーとして使用し、 myOutsideHost のポート 22 に接続します。