5 OpenSSHクライアント・ユーティリティの使用

OpenSSHクライアント・ユーティリティを使用して、リモート・システムへの接続、システム間でのファイルのコピー、パスフレーズの記憶、要塞ホストを介したアクセス、GUIアプリケーションのロード、およびポート転送を実行します。

sshコマンドの使用による別のシステムへの接続

デフォルトでは、OpenSSHユーティリティを使用してリモート・システムに接続するたびに、ユーザー名とパスワードを指定する必要があります。初めてOpenSSHサーバーに接続したときに、OpenSSHクライアントによって、適切なシステムに接続していることの確認が求められます。

sshコマンドを使用して、リモート・システムにログインするか、リモート・システム上でコマンドを実行します。

ssh [options] [user@]host [command]

コマンドのhostは、接続するリモートOpenSSHサーバーの名前です。

たとえば、ローカル・システムと同じユーザー名を使用して、host04にログインします。

ssh host04

リモート・システムによりそのシステムに対するパスワードが求められます。

別のユーザーとして接続するには、ユーザー名と、@記号の後にリモート・ホスト名を指定します。たとえば次のとおりです。

ssh joe@host04

リモート・システム上でコマンドを実行するには、そのコマンドを引数として指定します。

ssh joe@host04 ls ~/.ssh

sshコマンドにより、ユーザーのログインを実行し、コマンドを実行し、その後、その接続を閉じます。

例5-1 システムへの接続の例

次の例は、リモート・ホストhost04に接続する方法を示しています。接続が確立される前にコマンド・アクションを確認する必要があります。

ssh host04
The authenticity of host ‘host04 (192.0.2.104)’ can’t be
established.
RSA key fingerprint is 65:ad:38:b2:8a:6c:69:f4:83:dd:3f:8f:ba:b4:85:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘host04,192.0.2.104’ (RSA) to the
list of known hosts.

yesと入力してサーバーへの接続を受け入れると、クライアントはサーバーの公開ホスト・キーを$HOME/.ssh/known_hostsファイルに追加します。次にこのリモート・サーバーに接続したときに、クライアントは、このファイルにあるキーをサーバーが提供するキーと比較します。キーが一致しない場合は、次のような警告が表示されます。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for host has changed,
and the key for the according IP address IP_address
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:10
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is fingerprint
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:53
RSA host key for host has changed and you have requested strict checking.
Host key verification failed.

SSHソフトウェアやサーバーのアップグレードなどの既知の理由によりリモート・サーバーのホスト・キーが変更された場合を除き、この状況について管理者に問い合せるまでそのマシンへの接続は回避してください。

詳細は、ssh(1)マニュアル・ページを参照してください。

ホストに関するSSHクライアント構成オプションの設定

クライアント・システム上の$HOME/.ssh/configファイル内でHostのエントリを設定できます。多くの場合、異なるシステム上ではユーザー名は一致しません。場合によっては、特定のリモート・システム用に通常のキー・ペアとは異なるキー・ペアを使用することを選択できます。正しい資格証明でより簡単に接続するには、次の例のようなホスト・エントリを追加します:

Host server1
  Hostname server1.example.com
  User remote_user
  IdentityFile ~/.ssh/id_rsa_example

指定されている構成エントリを使用して、次を実行します。

ssh server1

SSHクライアントで、ユーザー名remote_userでリモート・サーバーserver1.example.comへの接続が実行され、~/.SSH/id_rsa_exampleにある秘密キー・ファイルが使用されます。

この構成エントリにより、接続が必要になるたびに、正しい資格証明を使用して接続できるようになります。この構成エントリがない場合は、次を入力する必要があります。

ssh -i ~/.ssh/id_rsa_example remote_user@server1.example.com 

$HOME/.ssh/configファイルを使用すると、接続先のシステム用にその他の構成オプションを格納できます。たとえば、ForwardAgentまたはProxyJumpオプションを頻繁に使用する場合は、これらについてのエントリを、これらを使用するホストごとに追加することを検討してください。詳細は、ssh_config(5)マニュアル・ページを参照してください。

scpおよびsftpコマンドの使用によるシステム間でのファイルのコピー

scpの使用

注意:

セキュア・コピー・プロトコル(scp)は、Oracle Linux 9では非推奨です。Oracle Linux 9を使用している場合は、かわりにセキュアなファイル転送(SFTP)ユーティリティを使用します。Oracle Linux 9: Oracle Linux 9リリース・ノート非推奨の機能の章にあるセキュリティの項を参照してください。

scpコマンドを使用すると、ファイルまたはディレクトリをシステム間でコピーできます。scpでは、接続が確立され、ファイルがコピーされ、その後、その接続が閉じられます。

次の例は、scpコマンドの使用方法を示しています。

  • リモート・システムへのローカル・ファイルのアップロード

    scp [options] local_file [user @]host[: remote_file]

    次に例を示します。

    • testfilehost04のホーム・ディレクトリにコピーします。

      scp testfile host04
    • testfileを同じディレクトリにコピーしますが、その名前をnew_testfileに変更します。

      scp testfile host04:new_testfile
  • リモート・システムからローカル・システムへのファイルのダウンロード

    scp [options] [user@]host[:remote_file] local_file
  • ファイルの再帰的なコピー

    -rオプションを指定すると、ディレクトリの内容が再帰的にコピーされます。

    たとえば、ディレクトリのremdirとその内容をリモートのhost04にあるホーム・ディレクトリからローカル・ホーム・ディレクトリにコピーするには、次のように入力します:

    scp -r host04:~/remdir ~

sftpの使用

sftpコマンドは、システム間でファイルを転送するために使用されるftpコマンドの安全な代替法です。scpコマンドとは異なり、sftpコマンドでは、ファイルをコピーする前にリモート・サーバー上のファイル・システムを参照できます。

SSHを介してリモート・システムへのFTP接続を開くには、次のコマンドを使用します。

sftp [options] [user@]host

たとえば、次のように、システムhost04へのFTP接続を開きます。

sftp host04
Connecting to host04...
guest@host04’s password: password
sftp>

sftp>プロンプトに、sftpコマンドを入力します。

次の例では、putコマンドを使用してファイルnewfileをローカル・システムからリモート・システムにアップロードし、その後、lsコマンドを使用してそれを一覧表示します。

sftp> put newfile
Uploading newfile to /home/guest/newfile
foo                                           100% 1198     1.2KB/s   00:01    
sftp> ls newfile
newfile        

helpまたは?と入力して、使用可能なコマンドのリストを表示します。byeexitまたはquitと入力して接続を閉じ、sftpの対話型セッションを終了します。

詳細は、ssh(1)およびsftp(1)の各マニュアル・ページを参照してください。

SSHキー・エージェントの使用によるパスフレーズの記憶

SSHキー・エージェントを使用して、ログイン・セッションの間にいずれかのSSHキーのパスフレーズを1回入力します。このようにして、パスフレーズを使用せずにSSH キーを作成するという不適切なセキュリティ慣行を回避できます。

  1. ログインしたら、エージェントが起動されていることを確認します。

    ps -ef|grep -i ssh-agent
  2. 次のように、ssh-addコマンドを実行してSSHキーのどれかをエージェントに追加します。

    ssh-add $HOME/.ssh/id_rsa

    コマンドにより現在のパスフレーズの入力が求められます。パスフレーズはログイン・セッション全体を通して適用されます。キーを使用して別のシステムに接続すると、パスフレーズのプロンプトは表示されなくなります。

    注意:

    エラー・メッセージCould not open a connection to your authentication agentは、エージェントが実行されていないことを示します。eval $(ssh-agent -s)コマンドでそれを起動します。

  3. 追加するキーごとにこのコマンドを繰り返します。

  4. エージェントにキーを追加した後は、パスフレーズの入力を求められることなく、authorized_hostsファイル内で公開キーのペアが構成されているどのシステムへのSSH接続でも開くことができます。この動作は、ユーザーとして実行されるすべてのスクリプトにも適用されます。

要塞ホストを介したアクセスのためのSSHエージェント転送の使用

注意:

エージェント転送の有効化は慎重に実行してください。リモート・ホストでエスカレートされた権限を持つユーザーは、転送されたSSHセッションを介してエージェントにアクセスできます。悪意のあるユーザーは、キーに直接アクセスすることはできませんが、エージェント・セッションをハイジャックして、エージェント内のキーを使用して他のシステムに接続できます。信頼できないユーザーがいる可能性があるシステムに接続している場合は、エージェント転送の使用を回避してください。

SSHエージェント転送は、秘密キーを一元化して安全に保つことができる強力なツールです。秘密キーを他のシステムにコピーすることは、できるかぎり回避してください。SSHエージェント転送では、リモート・システムに接続してからそのシステム上のSSHクライアントを使用して、同じキー・ベースの認証によって別のシステムに接続できますが、最初に接続したホストに秘密キーをコピーする必要はありません。

サーバー側の構成

/etc/ssh/sshd_configファイルを変更して、SSHエージェント転送を構成します。サーバーで、SSHエージェント転送をアクティブ化し、デフォルトで有効になっているAllowAgentForwardingパラメータを確認します。

クライアント構成

この機能を有効にするには、接続先のホストのチェーン内の中間システムに接続するときに、ForwardAgentオプションを使用する必要があります。また、秘密キーがプライマリ・クライアント・ホスト上のSSHエージェントにすでにロードしてある必要があります。SSHキー・エージェントの使用によるパスフレーズの記憶を参照してください。

SSHエージェント転送を使用するには:

  1. SSHエージェントが実行中であり、SSHキーがロードされていることを確認します。クライアント・システムで次のコマンドを実行して、どのキーがエージェントによってロードされたかを確認します。
    ssh-add -L
  2. 次のように、ForwardAgent=yesオプションを使用してホストに接続します。
    ssh -o ForwardAgent=yes server1.example.com
  3. リモート・ホスト上のSSHクライアントを使用して、公開キーがauthorized_keysで構成されている別のサーバーに接続します。
    ssh server2.example.com

特定のサーバーに対してこのオプションを頻繁に使用する場合は、$HOME/.ssh/configファイル内のHost構成エントリにForwardAgentオプションを追加することを検討してください。詳細は、ホストに関するSSHクライアント構成オプションの設定を参照してください。

要塞ホストを介したアクセスのためのProxyJumpの使用

SSHエージェント転送では、秘密キーをチェーン内の各サーバーにコピーせずに、キーベースの認証を使用して、あるサーバーから別のサーバーに接続できます。この方法にはセキュリティ上の問題がいくつかあります。リモート・サーバーに対する適切な権限があるユーザーがエージェントをハイジャックして、認証を必要とせずに、この方法を使用して他のシステムに接続する可能性があるためです。

あるサーバーから別のサーバーにジャンプするためのよりセキュアな方法は、OpenSSHクライアントでのProxyJumpオプションの使用です。ProxyJumpオプションは、要塞またはジャンプ・ホストを介して直接すべてのトラフィックをプロキシするという意味では、SSHトンネルやポート転送と同様に機能します。ポート転送とは異なり、ProxyJumpオプションでは、サーバー側の構成が必要となることはありません。必要なのは、要塞またはジャンプ・ホストにSSHでアクセスできることのみです。

internal.example.comが、直接アクセスできない内部ネットワーク上のホストであるとします。bastion.example.comは、内部ネットワークに接続されている、クライアント・システムにもアクセスできるホストです。internal.example.comに接続するには、ProxyJumpオプションを使用して、bastion.example.comを介して直接接続します。次に例を示します。

ssh -o 'ProxyJump=bastion.example.com' internal.example.com

internal.example.comに頻繁に接続する場合は、$HOME/.ssh/configファイル内でこのホスト用にProxyJumpオプションを設定します。ホストに関するSSHクライアント構成オプションの設定を参照してください。

X11転送の使用によるリモート・グラフィカル・アプリケーションのロード

X11転送では、ユーザーが、リモートLinuxシステムにインストールされているグラフィカル・アプリケーションを起動して、ローカル・システムのデスクトップ環境内でそれらを表示できるようになります。リモート・システムでX11サーバーまたはグラフィカル・デスクトップ環境が実行されている必要はありませんが、ローカル・システムでX11互換サービスが実行されている必要があります。

サーバー側の構成

  1. /etc/ssh/sshd_configファイルを変更してX11転送を有効にします。サーバーで、次のパラメータを確認します。

    X11Forwarding

    X11転送を許可します。省略した場合、デフォルトはnoです。X11転送を有効にするには、このパラメータの値をyesに設定するエントリを追加します。

  2. 構成ファイルを編集する場合は、このサービスを再起動して変更内容を有効にする必要があります。

    sudo systemctl restart ssh
  3. リモート・システムでX11アプリケーションの実行およびX11セッションの認証ができる必要もあります。この目的のために、xorg-x11-xauthパッケージが必要です。

    dnf install xorg-x11-xauth
    リモート・サーバーでグラフィカル・アプリケーションを実行したことがない場合は、初めてX11転送を使用してリモートサーバーに接続すると、次の警告メッセージが表示されます。
    /usr/bin/xauth: file /home/user/.Xauthority does not exist

    .Xauthorityファイルは自動的に作成されるため、この警告は無視してかまいません。

クライアント構成

  1. リモート・サーバーに接続する場合は、SSHクライアントで-Xオプションを使用します。

    ssh -X user@server1.example.com
  2. SSH接続を介してグラフィカル・アプリケーションを実行するには、SSHターミナルからコマンドを直接起動します。端末が引き続き使用できるように、プロセスをバックグラウンドで実行することを選択できます。次に例を示します。

    gedit &

SSH経由のポート転送の設定

SSHポート転送では、クライアント・システムとサーバー・システムの間に暗号化されたSSHトンネルが作成されます。

次の3つのタイプのSSHポート転送を使用できます。

  • ローカル・ポート転送: ポートをクライアントからSSHサーバーに転送した後、宛先ポートに転送します。
  • 動的ポート転送: 様々なポートにわたる通信のためのSOCKSプロキシ・サーバーを作成します。
  • 逆ポート転送: ポートをサーバーからクライアントに転送してから、宛先ポートに転送します。

ポート転送を使用する理由

ポート転送では、リモート・サーバーからプライベート・ローカル・エリア・ネットワーク(LAN)内のデバイスにアクセスでき、その逆も可能です。

ポート転送を使用すると、パブリック・ネットワーク・インタフェースに公開されていないサービスにアクセスできます。リモート・サーバー上のサービス(データベースなど)にアクセスするためにローカル・ポート転送を設定できます。サーバー上のデータベースはパブリック・ネットワーク・インタフェースに公開されていませんが、ローカル・マシンから内部データベース・サーバー・ポートへのトンネルを作成できます。その後localhostに接続でき、すべてのトラフィックがSSHトンネルを介してリモート・データベースに転送されます。

逆ポート転送を使用すると、ローカル・ネットワーク外のユーザーが内部サービスにアクセスできるようになります。たとえば、自分がローカル・マシンで開発したWebアプリケーションを仲間の開発者に示すことができます。使用しているマシンにはパブリックIPがないため、他の開発者がインターネット経由でそのアプリケーションにアクセスすることはできません。しかしながら、自分がリモートSSHサーバーにアクセスできる場合は、逆ポート転送を設定して仲間の開発者がアクセスできるようにすることができます。

サーバー側の構成

/etc/ssh/sshd_configファイルを編集して、SSHポート転送を構成します。サーバー上で、少なくとも次のパラメータを確認します。

  • AllowTCPForwarding

    TCPポート転送を許可します。省略した場合、デフォルトはyesであり、単一のTCPポート転送およびSOCKSプロキシが有効になります

  • AllowStreamLocalForwarding

    UNIXドメイン・ソケットの転送を許可します。省略した場合、デフォルトはyesです。

ローカル・ポート転送

ダイレクトTCP転送トンネルを作成するには、次のように、sshで-Lオプションを使用します。

ssh -L [bind_address:]port:destination:destination_port [user@]remote_ssh_server
  • bind_addressはオプションであり、これにより、接続をリスニングするローカル・インタフェースを割り当てます。省略した場合は、sshにより、ループバック・インタフェースにのみバインドされます。すべてのインタフェースにバインドするには、0.0.0.0または::を使用します。
  • port: ローカル・ポート番号。1024より大きい任意のポート番号を使用できます。
  • destination: 宛先マシンのIPまたはホスト名。宛先がリモート・サーバー自体にある場合は、localhostを使用します。
  • destination_port: 宛先マシン上のポート。
  • [user@]remote_ssh_server: リモートSSHユーザーおよびサーバーIPアドレス。

次に例を示します。

ssh -L 8080:localhost:8888 user@192.168.1.20

これにより、192.168.1.20にあるリモート・サーバーへのSSH接続がオープンされ、localhostのポート8888へのトンネルがオープンされます。

動的ポート転送

動的ポート転送を使用して、指定したバインディング・ポートがSSHクライアントでリスニングされるようにし、SSHクライアントがSOCKSプロキシ・サーバーとして機能するようにします。指定したポート上のすべての着信接続がトンネルを介して宛先マシン上の動的ポートに転送されるため、宛先ホストを指定する必要はありません。

動的ポート転送を作成するには、sshで-Dオプションを使用します。

ssh -D [bind_address:]port [user@]remote_ssh_server

逆ポート転送

逆方向トンネルでは、リモートSSHサーバーで受信した接続がすべてローカル・クライアント・ネットワークに転送されます。

逆ポート転送を作成するには、sshで-Rオプションを使用します。

ローカル・ポート逆転送の場合:

ssh -R [bind_address:]port:destination:destination_port [user@]remote_ssh_server

動的ポート逆転送の場合:

ssh -R [bind_address:]port [user@]remote_ssh_server