SSHクライアント

導入

OpenSSH のクライアントはバイナリ プログラム ssh です。 Linux/Unix システム上の場所は /usr/local/bin/ssh です。

Linux システムには通常、ssh が付属しています。そうでない場合は、インストールする必要があります。

#Ubuntu と Debian
$ sudo apt install openssh-client

# CentOS と Fedora
$ sudo dnf install openssh-clients

インストール後、-Vパラメータを使用してバージョン番号を出力し、インストールが成功したかどうかを確認できます。

$ssh -V

基本的な使い方

ssh の最も一般的な使用法はサーバーにログインすることですが、そのためにはサーバーに SSH サーバー ソフトウェアがインストールされ、実行されている必要があります。

sshでサーバーにログインするコマンドは以下の通りです。

$sshホスト名

上記のコマンドのhostnameはホスト名で、ドメイン名、IP アドレス、または LAN 内のホスト名を使用できます。ユーザー名が指定されていない場合、クライアントの現在のユーザー名がリモート サーバーのログイン ユーザー名として使用されます。ユーザー名を指定する場合は、次の構文を使用できます。

$ ssh user@hostname

上記コマンドでは、ユーザー名とホスト名を@で区切って併記しています。

ssh-l パラメータを使用してユーザー名を指定することもできます。この場合、ユーザー名とホスト名を一緒に記述する必要はありません。

$ ssh -l username host

ssh はデフォルトでサーバーのポート 22 に接続しますが、-pパラメータで他のポートを指定できます。

$ ssh -p 8821 foo.com

上記のコマンドは、サーバーfoo.comのポート 8821 に接続します。

接続プロセス

ssh でリモート サーバーに接続した後、最初に、リモート サーバーが見慣れないアドレスであるかどうかを確認する検証プロセスが行われます。

特定のサーバーに初めて接続する場合、コマンド ラインにはマシンが認識されていないことを示すテキストが表示され、接続が必要かどうかを確認するようユーザーに通知されます。

The authenticity of host 'foo.com (192.168.121.111)' can't be established.
ECDSA key fingerprint is SHA256:Vybt22mVXuNuB5unE++yowF7lgA/9/2bLSiO3qmYWBY.
Are you sure you want to continue connecting (yes/no)?

上記のテキストは、サーバーfoo.comのフィンガープリントが見慣れないものであることをユーザーに伝え、ユーザーが接続を続行するかどうかを選択できるようにします (はいまたはいいえを入力します)。

いわゆるサーバー フィンガープリントは、SSH サーバーの公開キーのハッシュ値を指します。各 SSH サーバーにはクライアントとの通信に使用される一意のキーのペアがあり、公開キーのハッシュを使用してサーバーを識別できます。

次のコマンドは、特定の公開キーのフィンガープリントを表示できます。

$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 da:24:43:0b:2e:c1:3f:a1:84:13:92:01:52:b4:84:ff   (ECDSA)

上記の例では、ssh-keygen -l -fコマンドは公開鍵/etc/ssh/ssh_host_ecdsa_key.pubのフィンガープリントを出力します。

ssh は、こ​​のマシンに接続されているすべてのサーバーの公開鍵のフィンガープリントを、このマシンの ~/.ssh/known_hosts ファイルに保存します。サーバーに接続するたびに、このファイルは、それが奇妙なホスト (見慣れない公開キー) であるかどうかを判断するために使用されます。

上記のテキストの後にyesと入力すると、現在のサーバーのフィンガープリントがローカルの~/.ssh/known_hostsファイルに保存され、次のプロンプトが表示されます。今後再度接続すると、警告は表示されなくなります。

Warning: Permanently added 'foo.com (192.168.121.111)' (RSA) to the list of known hosts

次に、クライアントはサーバーとの接続を確立します。次に、ssh はユーザーに、ログインしたいアカウントのパスワードを入力するよう求めます。ユーザーがパスワードを入力して正しいことを確認すると、リモート サーバーのシェルにログインできます。

サーバーキーの変更

サーバー フィンガープリンティングにより、誰かが悪意を持ってリモート ホストになりすますのを防ぐことができます。サーバーのキーが変更された場合 (たとえば、SSH サーバーが再インストールされた場合)、クライアントが再度接続したときに公開キーのフィンガープリントが一致しなくなります。この時点で、クライアントは接続を終了し、警告メッセージを表示します。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
77:a5:69:81:9b:eb:40:76:7b:13:04:a9:6c:f4:9c:5d.
Please contact your system administrator.
Add correct host key in /home/me/.ssh/known_hosts to get rid of this message.
Offending key in /home/me/.ssh/known_hosts:36

上記のテキストの意味は、ホストの公開キーのフィンガープリントが ~/.ssh/known_hosts ファイルに保存されているものとは異なるため、接続を確立する前に処理する必要があるということです。このとき、公開キーのフィンガープリントが変更された原因が、悪意のあるハイジャックなのか、管理者が SSH サーバーの公開キーを変更したのかを確認する必要があります。

新しい公開キーが信頼できることが確認され、接続を続行する必要がある場合は、次のコマンドを実行して、元の公開キーのフィンガープリントを ~/.ssh/known_hosts ファイルから削除できます。

$ ssh-keygen -R hostname

上記のコマンドのhostnameは、公開鍵の変更が行われたホスト名です。

上記のコマンドの使用に加えて、known_hostsファイルを手動で変更して公開キーのフィンガープリントを削除することもできます。

元の公開キーのフィンガープリントを削除した後、ssh コマンドを再実行してリモート サーバーに接続し、新しいフィンガープリントを known_hosts ファイルに追加すると、スムーズに接続できるようになります。

リモートコマンドを実行する

SSH ログインが成功した後、ユーザーはリモート ホストのコマンド ライン環境に入ります。表示されるプロンプトはリモート ホストのプロンプトです。この時点で、リモート ホストで実行するコマンドを入力できます。

リモート コマンドを実行するもう 1 つの方法は、sshコマンドの直後にコマンドを記述することです。

$ ssh username@hostname command

上記のコマンドにより、SSH はログインに成功した直後にリモート ホスト上でコマンド command を実行します。

以下に例を示します。

$ ssh foo@server.example.com cat /etc/hosts

上記のコマンドは、ログインに成功した直後にコマンド cat /etc/hosts をリモートで実行します。

この構文を使用してコマンドを実行する場合、ssh クライアントは対話型のシェル環境を提供せず、リモート コマンドの実行結果をコマンド ラインに直接出力します。ただし、一部のコマンドは対話型シェル環境を必要とし、その場合は -t パラメータを使用する必要があります。

# エラーを報告する
$ ssh remote.server.com emacs
emacs: standard input is not a tty

# エラーは報告されませんでした
$ ssh -t server.example.com emacs

上記のコードでは、emacsコマンドは対話型シェルを必要とするため、エラーが報告されます。 -t パラメータを指定した場合のみ、ssh は対話型シェルを割り当てます。

暗号化パラメータ

SSH 接続のハンドシェイク フェーズ中に、クライアントはサーバーと暗号スイートについて合意する必要があります。

暗号化パラメータ セットには、アンダースコアで結合されたいくつかの異なる暗号化パラメータが含まれています。次に例を示します。

TLS_RSA_WITH_AES_128_CBC_SHA

その意味は次のとおりです。

  • TLS:暗号化通信プロトコル
  • RSA: 鍵交換アルゴリズム
  • AES: 暗号化アルゴリズム
  • 128: 暗号化アルゴリズムの強度
  • CBC: 暗号化アルゴリズムのモード
  • SHA: デジタル署名されたハッシュ関数

以下は、クライアントからサーバーに送信されるハンドシェイク メッセージの例です。

Handshake protocol: ClientHello
    Version: TLS 1.2
    Random
        Client time: May 22, 2030 02:43:46 GMT
        Random bytes: b76b0e61829557eb4c611adfd2d36eb232dc1332fe29802e321ee871
    Session ID: (empty)
    Cipher Suites
        Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”
        Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
        Suite: TLS_RSA_WITH_AES_128_GCM_SHA256
        Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA
        Suite: TLS_RSA_WITH_AES_128_CBC_SHA
        Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA
        Suite: TLS_RSA_WITH_RC4_128_SHA
    Compression methods
        Method: null
    Extensions
        Extension: server_name
            Hostname: www.feistyduck.com
        Extension: renegotiation_info
        Extension: elliptic_curves
            Named curve: secp256r1
            Named curve: secp384r1
        Extension: signature_algorithms
            Algorithm: sha1/rsa
            Algorithm: sha256/rsa
            Algorithm: sha1/ecdsa
            Algorithm: sha256/ecdsa”

上記のハンドシェイク メッセージ (ClientHello) では、Cipher Suitesフィールドはクライアントのオプションの暗号化パラメータ セットのリストであり、サーバーはサポートするパラメータ セットを選択します。

サーバーが選択されると、サーバーはクライアントに応答を送信します。

Handshake protocol: ServerHello
    Version: TLS 1.2
    Random
        Server time: Mar 10, 2059 02:35:57 GMT”
        Random bytes: 8469b09b480c1978182ce1b59290487609f41132312ca22aacaf5012
    Session ID: 4cae75c91cf5adf55f93c9fb5dd36d19903b1182029af3d527b7a42ef1c32c80
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    Compression method: null
    Extensions
        Extension: server_name
        Extension: renegotiation_info”

上記の応答メッセージ (ServerHello) のCipher Suiteフィールドは、サーバーによって最終的に選択された暗号化パラメータです。

ssh コマンドライン設定項目

ssh コマンドには、デフォルトの動作を変更するための多くの構成項目があります。

-c

-c パラメータは暗号化アルゴリズムを指定します。

$ ssh -c blowfish,3des server.example.com
# または
$ ssh -c blowfish -c 3des server.example.com

上記のコマンドは、使用する暗号化アルゴリズム blowfish または 3des を指定します。

-C

-Cパラメータは、圧縮されたデータ送信を示します。

$ ssh -C server.example.com

-D

-D パラメータは、ローカル Socks リスニング ポートを指定します。このポートで受信したリクエストは、動的ポート転送とも呼ばれ、リモート SSH ホストに転送されます。詳細については、ポート転送の章を参照してください。

$ ssh -D 1080 server

上記のコマンドは、ローカル マシンの 1080 ポートで受信したすべてのリクエストをサーバー server に転送します。

-f

-fパラメータは、SSH 接続がバックグラウンドで実行されることを意味します。

-F

-F パラメータは設定ファイルを指定します。

$ ssh -F /usr/local/ssh/other_config

上記のコマンドは、設定ファイル other_config の使用を指定します。

-私

-i パラメータは秘密鍵を指定するために使用されます。これはidentity_fileを意味します。デフォルト値は ~/.ssh/id_dsa (DSA アルゴリズム) および ~/.ssh/id_rsa (RSA アルゴリズム) です。対応する公開キーはサーバーに保存する必要があることに注意してください。詳細については、キー ログインの章を参照してください。

$ ssh -i my-key server.example.com

-J

-J はジャンプサーバーを指定します。ローカル コンピュータが SSH サーバーと直接通信できないことを想定して、-J を使用してジャンプ サーバーを指定できます。

$ ssh -J root@J1,root@J2 root@S1

上の例では、マシンは最初に J1 経由で S1 サーバーにログインし、次に J2 経由でログインします。

-l

-l パラメータは、リモート ログインのアカウント名を指定します。

$ ssh -l sally server.example.com
# に相当
$ ssh sally@server.example.com

-L

-L パラメータはローカル ポート フォワーディングを設定します。詳細については、ポート フォワーディングの章を参照してください。

$ ssh  -L 9999:targetServer:80 user@remoteserver

上記のコマンドでは、ローカルの9999ポートに送信されたすべてのリクエストは、remoteserverを介して targetServer の 80 ポートに送信されます。これは、targetServer の 80 ポートに直接接続するのと同じです。

-m

-m パラメータは、データの整合性を検証するためのアルゴリズム (MAC と呼ばれるメッセージ認証コード) を指定します。

$ ssh -m hmac-sha1,hmac-md5 server.example.com

上記のコマンドは、データ検証アルゴリズムを hmac-sha1 または hmac-md5 として指定します。

-N

-Nパラメータはポート転送に使用されます。これは、確立された SSH がポート転送にのみ使用され、リモート コマンドを実行できないことを意味します。詳細については、ポート転送の章を参照してください。

-o

-o パラメータは、設定コマンドを指定するために使用されます。

$ ssh -o "Keyword Value"

たとえば、構成ファイルには次の内容が含まれます。

ユーザーサリー
ポート220

-oパラメータを使用すると、上記の 2 つの設定コマンドをコマンド ラインから渡すことができます。

$ ssh -o "User sally" -o "Port 220" server.example.com

等号を使用する場合、コンフィグレーションコマンドを引用符で囲む必要はありませんが、等号の前後にスペースを入れないでください。

$ ssh -o User=sally -o Port=220 server.example.com

-p

-p パラメータは、SSH クライアントが接続するサーバー ポートを指定します。

$ ssh -p 2035 server.example.com

上記のコマンドはサーバーのポート 2035 に接続します。

-q

-q パラメータは、ユーザーに警告情報を出力しないクワイエット モード (静か) を示します。

$ ssh –q foo.com
root’s password:

上記のコマンドは、-qパラメータを使用して、ユーザーにパスワードの入力を求めるプロンプトのみを出力します。

-R

-R パラメータはリモート ポート フォワーディングを指定します。詳細については、ポート フォワーディングの章を参照してください。

$ ssh -R 9999:targetServer:902 local

上記のコマンドは、ローカル コンピューターlocalを指定して、独自の 9999 ポートをリッスンするように指定して、スプリングボード サーバー上で実行する必要があります。このポートに送信されるすべての要求は、targetServer の 902 ポートに転送されます。

-t

-t パラメータは、ssh がリモート コマンドを直接実行するときに対話型シェルを提供します。

$ ssh -t server.example.com emacs

-v

-v パラメータは詳細情報を表示します。

$ ssh -v server.example.com

-vv-vvvのように、-vを複数回繰り返して情報の詳細レベルを示すことができます。

$ ssh -vvv server.example.com
# または
$ ssh -v -v -v server.example.com

上記のコマンドは、最も詳細な接続情報を出力します。

-V

-V パラメータは ssh クライアントのバージョンを出力します。

$ ssh –V
ssh: SSH Secure Shell 3.2.3 (non-commercial version) on i686-pc-linux-gnu

上記のコマンドは、ネイティブ ssh クライアントのバージョンがSSH Secure Shell 3.2.3であることを出力します。

-X

-X パラメータは、X ウィンドウ転送をオンにすることを意味します。

$ ssh -X server.example.com

-1、-2

-1 パラメータは、SSH 1 プロトコルの使用を指定します。

-2 パラメータは、SSH 2 プロトコルの使用を指定します。

$ ssh -2 server.example.com

-4、-6

-4 は、デフォルト値である IPv4 プロトコルを使用することを指定します。

$ ssh -4 server.example.com

-6 は、IPv6 プロトコルを使用することを指定します。

$ ssh -6 server.example.com

クライアント設定ファイル

位置

SSH クライアントのグローバル設定ファイルは /etc/ssh/ssh_config で、ユーザーの個人設定ファイルは ~/.ssh/config にあり、グローバル設定ファイルよりも優先されます。

~/.ssh ディレクトリには、設定ファイルに加えて、いくつかのユーザー個人キー ファイルやその他のファイルも含まれています。以下に一般的なファイルの一部を示します。

  • ~/.ssh/id_ecdsa: ユーザーの ECDSA 秘密鍵。
  • ~/.ssh/id_ecdsa.pub: ユーザーの ECDSA 公開キー。
  • ~/.ssh/id_rsa: SSH プロトコル バージョン 2 の RSA 秘密キー。
  • ~/.ssh/id_rsa.pub: SSH プロトコル バージョン 2 の RSA 公開キー。
  • ~/.ssh/identity: SSH プロトコル バージョン 1 の RSA 秘密キー。
  • ~/.ssh/identity.pub: SSH プロトコル バージョン 1 の RSA 公開キー。
  • ~/.ssh/known_hosts: SSH サーバーの公開キーのフィンガープリントが含まれます。

ホスト設定

ユーザーの個人設定ファイル ~/.ssh/config には、さまざまなサーバーに応じた接続パラメータをリストできるため、ログインするたびにパラメータを繰り返し入力する必要はありません。以下に例を示します。

Host remoteserver
     HostName remote.example.com
     User neo
     Port 2112

Host *
     Port 2222

上記のコードで、ホストリモートサーバーは、次の設定がホストリモートサーバーにのみ有効であることを意味します。 remoteserverは単なるエイリアスであり、UserPortはそれぞれHostNameコマンドで指定されます。 HostNameUser、およびPortの前のインデントは必須ではありませんが、異なるホストの設定を視覚的に識別しやすくするためだけです。

次のHost *は、すべてのホストで有効であることを意味し、*はワイルドカード文字です。たとえば、Host *.eduは、第 1 レベルのドメイン名が であるホストでのみ有効であることを意味します。 .edu。このコマンドの下のポート 2222は、すべてのホストのデフォルトの接続ポートが 2222 であることを示しているため、ログイン時にポートを指定する必要はありません。

Host *Host reverseserver に同じ設定がある場合 (たとえば、両方に Port 設定がある場合)、最初に表示される値が有効になることに注意してください。この例では、remoteserver に接続するとき、デフォルトのポートは 2222 ではなく 2112 になります。これは、Host * が設定ファイルの先頭に配置されている場合は 2222 になります。

今後、remote.example.comにログインする際は、ssh Remoteserverコマンドを実行すれば、設定ファイルに指定したパラメータが自動的に適用されるようになります。

$ ssh remoteserver
# イコール
$ ssh -p 2112 neo@remote.example.com

コンフィグレーションコマンドの構文

SSH クライアント設定ファイルの各行は設定コマンドです。設定コマンドと対応する値の間にはスペースまたは等号を使用できます。

Compression yes
# イコール
Compression = yes

#で始まる行はコメントを表し、無視されます。空行はコメントに相当します。

主な設定コマンド

以下に、ssh クライアントの主な設定コマンドの一部とその値の例を示します。

  • AddressFamily inet: IPv4 プロトコルのみが使用されることを示します。 inet6に設定すると、IPv6 プロトコルのみを使用することを意味します。
  • BindAddress 192.168.10.235: このマシンの IP アドレスを指定します (このマシンに複数の IP アドレスがある場合)。
  • CheckHostIP yes: SSH サーバーの IP アドレスが公開鍵データベースと一致するかどうかを確認します。
  • Ciphers bullfish,3des: 暗号化アルゴリズムを指定します。
  • Compression yes: 送信信号を圧縮するかどうか。
  • ConnectionAttempts 10: クライアントが接続する際の最大試行回数。
  • ConnectTimeout 60: クライアントが接続するときに、指定された秒数以内にサーバーが応答しない場合、接続の試行は中断されます。
  • DynamicForward 1080: 動的転送ポートを指定します。
  • GlobalKnownHostsFile /users/smith/.ssh/my_global_hosts_file: グローバル公開鍵データベース ファイルの場所を指定します。
  • Host server.example.com: 接続のドメイン名または IP アドレスを指定します。エイリアスも使用でき、ワイルドカードもサポートされます。 Hostコマンドに続くすべての設定は、次のHostコマンドが実行されるまで、このホストに固有です。
  • HostKeyAlgorithms ssh-dss,ssh-rsa: 鍵アルゴリズムを優先順位の高い順に指定します。
  • HostName myserver.example.com: Host コマンドがエイリアスを使用する場合、HostName はドメイン名または IP アドレスを指定します。
  • IdentityFile keyfile: 秘密鍵ファイルを指定します。
  • LocalForward 2001 localhost:143: ローカル ポート転送を指定します。
  • LogLevel QUIET: ログの詳細レベルを指定します。 QUIETに設定すると、ほとんどの警告とプロンプトが出力されなくなります。
  • MACs hmac-sha1,hmac-md5: データ検証アルゴリズムを指定します。
  • NumberOfPasswordPrompts 2: ユーザーがパスワードを使用してログインするときに、間違ったパスワードの入力を試行する最大回数。
  • PasswordAuthentication no: パスワードによるログインをサポートするかどうかを指定します。ただし、これはクライアントの禁止のみであり、実際の禁止は SSH サーバーで設定する必要があります。
  • ポート 2035: クライアント接続用の SSH サーバー ポートを指定します。
  • PreferredAuthentications publickey,hostbased,password: さまざまなログイン方法の優先順位を指定します。
  • プロトコル 2: サポートされている SSH プロトコルのバージョン。複数のバージョンを区切るにはカンマを使用します。
  • PubKeyAuthentication yes: キーログインをサポートするかどうか。これはクライアントの設定のみであり、対応する設定を SSH サーバーで行う必要があります。
  • RemoteForward 2001 サーバー:143: リモート ポート転送を指定します。
  • SendEnv COLOR: SSH クライアントによってサーバーに送信される環境変数の名前。複数の環境変数を区切るにはスペースを使用します。環境変数の値は、クライアントの現在の環境からコピーされます。
  • ServerAliveCountMax 3: サーバーからの応答が受信されない場合、クライアントが切断するまでに何回キープアライブ信号を送信するか。この項目のデフォルト値は 3 です。
  • ServerAliveInterval 300: クライアントが接続を確立した後、指定された秒数以内にサーバーからメッセージを受信しない場合、クライアントはサーバーに keepalive メッセージを送信します。クライアントに送信させたくない場合は、この項目を0に設定します。つまり、クライアントは積極的に切断しません。
  • StrictHostKeyChecking yes: yes は、サーバーの公開キーが不明であるか変更されている場合、接続が拒否されることを意味します。 noは、サーバー公開鍵が不明な場合、公開鍵が変更された場合にクライアント公開鍵データベースに追加され、クライアント公開鍵データベースは変更されず、警告が出力され、接続が切断されることを意味します。まだ継続することが許可されています。 ask (デフォルト) は、続行するかどうかをユーザーに尋ねることを意味します。
  • TCPKeepAlive yes: クライアントが定期的にサーバーにキープアライブ情報を送信するかどうか。
  • User userName: リモートログイン用のアカウント名を指定します。
  • UserKnownHostsFile /users/smith/.ssh/my_local_hosts_file: 現在のユーザーの known_hosts ファイル (サーバー公開キーのフィンガープリントのリスト) の場所を指定します。
  • VerifyHostKeyDNS yes: SSH サーバーの DNS レコードをチェックして、公開キーのフィンガープリントが known_hosts ファイルに保存されているフィンガープリントと一致するかどうかを確認するかどうか。

作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0