SSHクライアントのカスタム接続オプションを構成する方法
紹介
SSH、またはSecure Shellは、リモート管理のためにLinuxサーバーに接続する最も一般的な方法です。コマンドラインを介して単一のサーバーに接続することは比較的簡単ですが、複数のリモートシステムに接続するための多くのワークフロー最適化があります。
OpenSSHは、ほとんどのシステムで最も一般的に使用されるコマンドラインSSHクライアントであり、カスタマイズされた接続オプションを提供することができます。これらのオプションは、サーバーごとに異なるオプションが含まれた設定ファイルに保存できます。これにより、各ホストに対して使用する異なる接続オプションを分けて整理でき、接続する必要があるたびにコマンドラインで広範なオプションを提供しなくても済むようになります。
このガイドでは、SSHクライアント構成ファイルの構造について説明し、一般的なオプションについても解説します。
前提条件
このガイドを完了するには、SSHの知識と接続時に提供できるオプションのいくつかについての理解が必要です。また、少なくともテスト目的のために、一部のユーザーまたはサーバーにSSHキー基盤の認証を設定する必要があります。
SSH設定ファイルの構造と解釈アルゴリズム
あなたのシステムの各ユーザーは、自分のホームディレクトリ内に独自のSSH設定ファイルを維持できます。これには、接続パラメータを指定するためにコマンドラインで使用する任意のオプションを含めることができます。接続時に、sshコマンドに追加のフラグを追加することで、設定ファイルで定義された値を上書きすることも常に可能です。
SSHクライアント設定ファイルの場所
クライアント側の設定ファイルは ~/.ssh/config にあります – ~ はホームディレクトリへの汎用的なショートカットです。多くの場合、このファイルはデフォルトでは作成されていないため、自分で作成する必要があります。touch コマンドを使用すれば、存在しない場合はファイルを作成し(存在する場合は最終更新日時を更新します)ます。
- touch ~/.ssh/config
構成ファイルの構造
configファイルはホスト、すなわちリモートサーバーによって整理されています。各ホスト定義は、特定の一致するホストの接続オプションを定義できます。また、より広範な範囲を持つべきオプションにはワイルドカードもサポートされています。
各セクションは、続く設定オプションと一致するホストを定義するヘッダーから始まります。その一致するホストの具体的な設定項目は下に定義されます。デフォルト値と異なる項目のみを指定する必要があり、各エントリは未定義項目のデフォルトを継承します。各セクションは、1つのHostヘッダーから次のHostヘッダーまでにわたります。
通常、組織的な目的と可読性のために、各ホストに設定されるオプションはインデントされています。これは厳密な要件ではありませんが、一目で解釈できる便利な慣習です。
一般的なフォーマットは次のようになります:
Host firsthost
Hostname your-server.com
User username-to-connect-as
IdentityFile /path/to/non/default/keys.pem
Host secondhost
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
ここでは、問題のホストが一致するかどうかに応じて、各接続試行に適用される4つのセクションがあります。
解釈アルゴリズム
SSHがファイルをどのように解釈して設定値を適用するかを理解することは重要です。これは、ワイルドカードやHost *の汎用ホスト定義を使用する際に影響があります。
SSHは、コマンドラインに提供されたホスト名を、設定セクションを定義する各Hostヘッダーと照合します。
例えば、この定義を考えてみてください:
Host devel
HostName devel.example.com
User tom
このホストは、コマンドラインにこれを入力することで tom@devel.example.com として接続することを許可しています:
- ssh devel
SSHは設定ファイルの先頭から始まり、各Host定義がコマンドラインで与えられた値と一致するかどうかを確認します。最初の一致するHost定義が見つかると、関連するSSHオプションが次の接続に適用されます。
SSHは次にファイルを下に移動し、他のHost定義も一致するか確認します。コマンドラインで指定された現在のホスト名と一致する別の定義が見つかった場合、新しいセクションに関連付けられたSSHオプションを考慮します。その後、以前のセクションによって既に定義されていない新しいセクションのために定義されたSSHオプションが適用されます。
これは重要な点です。SSHは、コマンドラインで指定されたホスト名に一致する各Hostセクションを順番に解釈します。このプロセスでは、各オプションに対して常に最初に指定された値を使用します。以前に一致したセクションによって既に与えられた値を上書きする方法はありません。
これは、あなたのconfigファイルが最も具体的な設定を上部に置くというルールに従うべきであることを意味します。より一般的な定義は、その後に来て、前の一致したセクションで定義されていないオプションを適用するために使用されるべきです。
前のセクションの例をもう一度見てみましょう:
Host firsthost
Hostname your-server.com
User username-to-connect-as
IdentityFile /path/to/non/default/keys.pem
Host secondhost
ANOTHER_OPTION custom_value
Host *host
ANOTHER_OPTION custom_value
Host *
CHANGE_DEFAULT custom_value
ここでは、最初の2つのセクションが文字通りのホスト名(またはエイリアス)によって定義されていることがわかります。つまり、ワイルドカードは使用されていません。ssh firsthostを使用して接続すると、最初のセクションが最初に適用されます。これにより、この接続のためにHostname、User、およびIdentityFileが設定されます。
それは第二のセクションをチェックし、一致していないことを確認して次に進みます。次に、第三のセクションを見つけ、一致していることを確認します。次に、ANOTHER_OPTIONをチェックして、以前のセクションからその値が既にあるかどうかを確認します。それがないことを確認すると、このセクションからの値を適用します。その後、Host *の定義がすべての接続と一致するため、最後のセクションも一致します。他のセクションからのモックCHANGE_DEFAULTオプションの値がないため、このセクションからの値を取ります。接続は、このプロセスから収集したオプションで行われます。
もう一度やってみましょう、コマンドラインからssh secondhostを呼び出すふりをします。
再び、最初のセクションから始まり、それが一致するかどうかを確認します。これは firsthost への接続のみに一致するため、このセクションはスキップされます。次に、2番目のセクションに進みます。このセクションがリクエストに一致すると判断されると、この接続に対して ANOTHER_OPTION の値を収集します。
SSHは次に3番目の定義を見て、ワイルドカードが現在の接続と一致することを確認します。その後、ANOTHER_OPTIONの値が既にあるかどうかをチェックします。このオプションはすでに一致した第2セクションで定義されているため、第3セクションの値は破棄され、影響を与えません。
SSHは次に第四セクションを確認し、以前に一致したセクションによって未定義のオプションを適用します。次に、収集した値を使用して接続を試みます。
接続オプション
構成ファイルを書き方のアイデアができたので、コマンドラインでそれらを指定するために使用する一般的なオプションとフォーマットについて話しましょう。
最初にカバーするのは、リモートホストに接続するために必要な最小限の設定です。具体的には、ホスト名、ユーザー名、およびSSHサーバーが動作しているポートです。
コマンドラインから、ユーザー名 apollo として、SSH デーモンがポート 4567 で動作しているホスト example.com に接続するには、次のように ssh を実行できます:
ssh -p 4567 apollo@example.com
ただし、次のように -o フラグを使って完全なオプション名を使用することもできます:
ssh -o "User=apollo" -o "Port=4567" -o "HostName=example.com"
SSHのマニュアルページには、利用可能なオプションの完全なリストがあります。
これらをあなたのconfigファイルに設定するには、homeのようなHostヘッダー名を選択する必要があります:
Host home
HostName example.com
User apollo
Port 4567
一般的なSSH設定オプション
これまでに、接続を確立するために必要な選択肢のいくつかについて議論してきました。これらの選択肢について説明しました:
- ホスト名: 接続を確立するために使用すべき実際のホスト名。このホスト名は、
Hostヘッダーで定義されたエイリアスを置き換えます。このオプションは、Host定義が接続するための実際の有効アドレスを指定している場合には必要ありません。 - 接続に使用されるユーザー名。
- ポート: リモートSSHデーモンが実行されているポート。このオプションは、リモートSSHインスタンスがデフォルトポート
22ではなく、別のポートで実行されている場合のみ必要です。
探索する価値のある他の多くの便利なオプションがあります。私たちは、機能に応じて区別された一般的なオプションのいくつかについて話し合います。
一般的な調整と接続項目
ServerAliveInterval: このオプションは、SSHがサーバーからの応答をテストするためにパケットを送信するタイミングを設定するために構成できます。これは、接続が不安定な場合や、接続がまだ有効かどうかを確認したい場合に便利です。LogLevel: これはSSHがクライアント側でログを記録する詳細度のレベルを設定します。特定の状況でログ記録をオフにしたり、デバッグの際に冗長性を増やしたりするために使用できます。最も控えめなものから最も詳細なものまで、レベルはQUIET(静か)、FATAL(致命的)、ERROR(エラー)、INFO(情報)、VERBOSE(冗長)、DEBUG1(デバッグ1)、DEBUG2(デバッグ2)、DEBUG3(デバッグ3)です。StrictHostKeyChecking: このオプションは、sshが自動的にホストを~/.ssh/known_hostsファイルに追加するかどうかを設定します。デフォルトでは、「ask」に設定されており、リモートサーバーから受信したホストキーがknown_hostsファイルにあるものと一致しない場合に警告します。一時的なホスト(テストサーバーなど)に頻繁に接続する場合は、これを「no」に設定することをお勧めします。その場合、SSHは自動的にファイルにホストを追加します。既知のホストが本来変わるべきでないときにアドレスが変更されると、セキュリティに影響を及ぼす可能性があるため、有効にする前によく考えてください。UserKnownHostsFile: このオプションは、SSHが接続したホストの情報を保存する場所を指定します。この設定について心配する必要は通常ありませんが、上記の厳密なホストチェックをオフにした場合は、/dev/nullに設定することをお勧めします。その場合、情報が破棄されます。VisualHostKey: このオプションを使用すると、SSHが接続時にリモートホストの鍵のASCII表現を表示することができます。これをオンにすると、ホストの鍵に慣れるための便利な方法となり、将来別のコンピュータから接続する際にそれを認識できるようになります。圧縮: 圧縮をオンにすると、非常に遅い接続に役立つことがあります。ほとんどのユーザーにはこれが必要ないでしょう。
上記の構成アイテムを考慮に入れると、有用な構成調整をいくつか行うことができます。
例えば、クラウドプロバイダーでホストを非常に迅速に作成および削除している場合、このようなものが役立ちます:
Host home
VisualHostKey yes
Host cloud*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel QUIET
Host *
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
LogLevel INFO
ServerAliveInterval 120
これにより、ホーム接続のためのビジュアルホストキーがオンになり、それに慣れて変化を認識したり、異なるマシンから接続する際にそれを認識できるようになります。また、cloud*で始まるホストはホストをチェックせず、失敗をログしないように設定しました。他のホストについては、適切なフォールバック値を用意しています。
接続転送
SSHの一般的な使用法の一つは、接続の転送です。これは、ローカル接続がリモートホストを通じてトンネルを通すことを許可したり、リモートマシンがローカルマシンを通じてトンネルを通すことを許可したりします。これは、ファイアウォールの背後にあるリモートマシンに接続する必要がある場合に、別の指定された「ゲートウェイ」サーバーを介して接続する必要がある場合に時々必要です。SSHは、リモートホストの転送情報を含むSOCKS5のようなプロトコルを使用して動的転送も行うことができます。
この動作を制御するオプションは次のとおりです:
LocalForward: このオプションは、ローカルポートのトラフィックをリモートマシンに転送し、リモートネットワークにトンネリングする接続を指定するために使用されます。最初の引数はトラフィックを向けたいローカルポートで、2番目の引数はリモート側でそのトラフィックを向けたいアドレスとポートです。RemoteForward: このオプションは、トラフィックをローカルマシンからトンネルするために指向するリモートポートを定義するために使用されます。最初の引数は、トラフィックがリモートシステムで指向されるリモートポートです。2番目の引数は、トラフィックがローカルシステムに到着したときに指向するアドレスとポートです。DynamicForward: これは、SOCKS5のような動的転送プロトコルで使用できるローカルポートを構成するために使用されます。動的転送プロトコルを使用するトラフィックは、その後、ローカルマシンのこのポートに向けられ、リモート側では、含まれている値に従ってルーティングされます。
これらのオプションは、ここに見られるように、両方向でポートを転送するために使用できます。
This will allow us to use port 8080 on the local machine
in order to access example.com at port 80 from the remote machine
Host local_to_remote
LocalForward 8080 example.com:80
This will allow us to offer access to internal.com at port 443
to the remote machine through port 7777 on the other side
Host remote_to_local
RemoteForward 7777 internal.com:443
これは、SSH経由でアクセスする以外に直接アクセスできないサーバー上でプライベートダッシュボードや他のウェブアプリケーションを開く必要がある場合に特に便利です。
その他の転送
接続転送に加えて、SSHは他の種類の転送も可能です。
ローカルマシンに保存されたエージェントのSSHキーを転送できるため、ローカルシステムに保存された認証情報を使用してリモートシステムから接続できます。また、リモートシステムでアプリケーションを起動し、X11転送を使用してそのグラフィカルディスプレイをローカルシステムに転送することもできます。X11はLinuxディスプレイサーバーであり、Linuxデスクトップシステムがないと非常に直感的ではありませんが、リモートおよびローカルのLinux環境の両方を使用する場合には非常に便利です。
これらは、これらの能力に関連する指示です:
ForwardAgent: このオプションにより、ローカルマシンに保存されている認証キーを接続しているシステムに転送することができます。これにより、自宅のキーを使用してホストからホストへと移動することが可能になります。ForwardX11: リモートシステムで実行中のアプリケーションのグラフィカル画面を転送できるようにしたい場合は、このオプションをオンにすることができます。
キーを指定する
ホスト用にSSHキーが設定されている場合、これらのオプションを使用して各ホストにどのキーを使用するかを管理することができます。
IdentityFile: このオプションは、各ホストに使用する鍵の場所を指定するために使用できます。SSHはデフォルトで~/.sshにある鍵を使用しますが、サーバーごとに鍵が割り当てられている場合、そこにある正確なパスを指定するために使用できます。IdentitiesOnly: このオプションを使用すると、SSHがconfigファイルに提供されたアイデンティティのみに依存するように強制することができます。これは、SSHエージェントに対象のホストに対して無効な代替キーがメモリに存在する場合に必要になることがあります。
これらのオプションは、異なるホストの多数の鍵を管理しなければならない場合や、1つ以上のSSHエージェントを使用してサポートを受ける場合に特に役立ちます。
結論
SSHが値を解釈する方法を念頭に置いておけば、合理的なフォールバックを伴った特定の値の豊富なセットを確立することができます。
非常に悪いまたは不安定な接続、例えば飛行機のWi-FiなどでSSHを使用する必要がある場合は、逆境の中でSSHを機能させるために設計されたmoshを使ってみることもできます。