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
は単なるエイリアスであり、User
とPort
はそれぞれHostName
コマンドで指定されます。 HostName
、User
、および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