前書き
SSH(セキュアシェル)は、リモート管理のためにLinuxホストに接続する最も一般的な方法です。 単一のホストへの接続の基本はかなり単純ですが、多くのリモートシステムで作業を始めると、これは扱いにくくなり、はるかに複雑なタスクになる可能性があります。
幸いなことに、OpenSSHでは、カスタマイズされたクライアント側の接続オプションを提供できます。 これらは、ホストごとの値を定義するために使用できる構成ファイルに保存できます。 これにより、各ホストで使用するさまざまな接続オプションを分けて整理したり、接続する必要があるときにコマンドラインで広範なオプションを提供したりする必要がなくなります。
このガイドでは、SSHクライアント構成ファイルの基本について説明し、いくつかの一般的なオプションについて説明します。
前提条件
このガイドを完了するには、SSHに関する実用的な知識と、接続時に提供できるオプションのいくつかが必要です。 少なくともテスト目的のために、一部のユーザーまたはホストに対してSSHキーベースの認証を構成することもできます。
SSH構成ファイルの構造と解釈アルゴリズム
ローカルシステムの各ユーザーは、クライアント側のSSH構成ファイルを管理できます。 これらには、コマンドラインで接続パラメーターを指定するために使用するオプションを含めることができます。これにより、共通の接続項目を保存し、接続時に自動的に処理できます。 `+ ssh +`コマンドへの通常のフラグを通じて、接続時に設定ファイルで定義された値を上書きすることは常に可能です。
SSHクライアント構成ファイルの場所
クライアント側の設定ファイルは「+ config 」と呼ばれ、ユーザーのホームディレクトリの「 .ssh +」設定ディレクトリ内にあります。 多くの場合、このファイルはデフォルトでは作成されないため、自分で作成する必要があります。
touch ~/.ssh/config
構成ファイルの構造
`+ config +`ファイルはホストごとに整理されています。 各ホスト定義は、特定の一致するホストの接続オプションを定義できます。 ワイルドカードを使用して、より広い範囲のオプションを許可することもできます。
各セクションは、続く構成オプションに一致するホストを定義するヘッダーで始まります。 次に、一致するホストの特定の構成アイテムを以下に定義します。 ホストは未定義のアイテムのデフォルトを継承するため、デフォルト値と異なるアイテムのみを指定する必要があります。 セクションは、 `+ Host `ヘッダーから次の ` Host +`ヘッダーまで定義されます。
通常、組織上の目的と読みやすさのために、各ホストに設定されているオプションはインデントされています。 これは厳しい要件ではありませんが、一目で簡単に解釈できる便利な規則です。
一般的な形式は次のようになります。
Host
Host
Host
Host *
ここでは、問題のホストが一致するかどうかに応じて、各接続試行に適用される4つのセクションがあります。
解釈アルゴリズム
SSHがファイルを解釈して、内部で定義された構成値を適用する方法を理解することは非常に重要です。 これは、ワイルドカードと「+ Host * +」汎用ホスト定義を使用する場合に大きな意味を持ちます。
SSHは、コマンドラインで指定されたホスト名を、構成セクションを定義する各 `+ Host +`ヘッダーと一致させます。 これはファイルの先頭から下に向かって行われるため、順序は非常に重要です。
これは、 `+ Host +`定義のパターンが、接続する実際のホストと一致する必要がないことを指摘する良い機会です。 基本的にこれらの定義を使用して、実際のホスト名の代わりに使用できるホストのエイリアスを設定できます。
たとえば、次の定義を検討してください。
Host devel
HostName devel.example.com
User tom
このホストを使用すると、コマンドラインで次のように入力して、「+ [email protected]+」として接続できます。
ssh devel
これを念頭に置いて、SSHがファイルを下に移動するときに各構成オプションを適用する方法について説明することができます。 先頭から開始し、各 `+ Host +`定義をチェックして、コマンドラインで指定された値と一致するかどうかを確認します。
最初に一致する `+ Host +`定義が見つかると、関連付けられた各SSHオプションが今後の接続に適用されます。 しかし、解釈はここで終わりません。
次に、SSHはファイルを下に移動し、他の `+ Host +`定義も一致するかどうかを確認します。 コマンドラインで指定された現在のホスト名と一致する別の定義が見つかった場合、新しいセクションに関連付けられたSSHオプションが考慮されます。 次に、*前のセクションでまだ定義されていない*新しいセクションに定義されたSSHオプションを適用します。
この最後のポイントは、内部化するために非常に重要です。 SSHは、コマンドラインで指定されたホスト名に一致する各 `+ Host +`セクションを順番に解釈します。 このプロセスでは、各オプションに指定された_first_値が常に使用されます。 以前に一致したセクションによって既に指定された値をオーバーライドする方法はありません。
これは、 `+ config +`ファイルが最も具体的な設定を上部に持つという単純なルールに従うべきであることを意味します。 以前の一致するセクションで定義されていなかったオプションを適用するために、より一般的な定義を後で行う必要があります。
前のセクションで使用したモックアップの「+ config +」ファイルをもう一度見てみましょう。
Host
Host
Host
Host *
ここでは、最初の2つのセクションがリテラルホスト名(またはエイリアス)によって定義されていることがわかります。つまり、ワイルドカードを使用していません。 `+ ssh firsthost `を使用して接続する場合、最初のセクションが最初に適用されます。 これにより、この接続に対して「 SSH_OPTION_1 」、「 SSH_OPTION_2 」、および「 SSH_OPTION_3 +」が設定されます。
2番目のセクションをチェックし、一致しないことを確認して先に進みます。 次に、3番目のセクションを見つけ、一致することを見つけます。 `+ ANOTHER_OPTION `をチェックして、前のセクションの値がすでにあるかどうかを確認します。 そうでない場合は、このセクションの値が適用されます。 ` Host * `定義はすべての接続に一致するため、最後のセクションに一致します。 他のセクションのモックの ` CHANGE_DEFAULT +`オプションの値がないため、このセクションの値を使用します。 その後、このプロセスから収集されたオプションを使用して接続が確立されます。
コマンドラインから `+ ssh secondhost +`を呼び出すふりをして、これをもう一度試してみましょう。
繰り返しますが、最初のセクションから開始し、一致するかどうかを確認します。 これは `+ firsthost `への接続にのみ一致するため、このセクションはスキップします。 2番目のセクションに進みます。 このセクションがリクエストに一致すると、この接続の ` ANOTHER_OPTION +`の値を収集します。
次に、SSHは3番目の定義を調べて、ワイルドカードが現在の接続と一致することを見つけます。 次に、 `+ ANOTHER_OPTION +`の値が既にあるかどうかを確認します。 このオプションはすでに一致した2番目のセクションで定義されているため、3番目のセクションの値は削除され、効果はありません。
次に、SSHは4番目のセクションをチェックし、以前に一致したセクションで定義されていないオプションを適用します。 次に、収集した値を使用して接続を試行します。
基本的な接続オプション
構成ファイルを設計する際に使用する一般的な形式について理解できたので、いくつかの一般的なオプションと、それらをコマンドラインで指定するために使用する形式について説明します。
最初に説明するのは、リモートホストに接続するために必要な基本情報です。 つまり、SSHデーモンが実行されているホスト名、ユーザー名、およびポート。
コマンドラインからポート「4567」でSSHデーモンを実行する「+ example.com 」というホストに「 apollo +」という名前のユーザーとして接続するには、さまざまな方法で変数情報を指定できます。 最も一般的なものはおそらく次のとおりです。
ssh -p 4567 [email protected]
ただし、次のように、完全なオプション名と `+ -o +`フラグを使用することもできます。
ssh -o "User=apollo" -o "Port=4567" -o "HostName=example.com" anything
ここでは、使用したいすべてのオプションを `+ -o `フラグで設定しました。 上記で説明したように、設定ファイルでできるように、ホストをエイリアスとして「anything」として指定しました。 実際のホスト名は、設定している ` HostName +`オプションから取得されます。
2番目の形式で使用している大文字のオプション名は、 `+ config +`ファイルで使用する必要があるものと同じです。 次のように入力すると、使用可能なオプションの完全なリストを見つけることができます。
man ssh_config
`+ config +`ファイルでこれらを設定するには、まずこれらのオプションを使用するホストを決定する必要があります。 問題のホストに固有のオプションについて説明しているので、おそらくリテラルホストの一致を使用する必要があります。
この時点で、この接続のエイリアスを割り当てる機会もあります。 それを活用して、ホスト名全体を毎回入力する必要がないようにします。 エイリアス「home」を使用して、この接続と関連オプションを参照します。
Host home
これで、このホストの接続の詳細を定義できます。 上記で使用した2番目の形式を使用して、このセクションに何を入れるべきかを通知できます。
Host home
HostName example.com
User apollo
Port 4567
キーと値のシステムを使用してオプションを定義します。 各ペアは別々の行にある必要があります。 キーは、空白、またはオプションの空白を含む等号によって、関連付けられた値から分離できます。 したがって、これらはすべて、SSHクライアントによって解釈されるものと同一です。
Port 4567
Port=4567
Port = 4567
唯一の違いは、オプションと値に応じて、スペースなしで等号を使用すると、引用符なしでコマンドラインでオプションを指定できることです。 `+ config +`ファイルに焦点を合わせているので、これはあなたの好み次第です。
共有オプションの構成
これまでのところ、設計した構成は非常に単純です。 全体として、次のようになります。
Host home
HostName example.com
User apollo
Port 4567
職場のコンピューターと自宅のコンピューターの両方で同じユーザー名を使用するとどうなりますか? 次のように作業マシンを定義するセクションで冗長オプションを追加できます。
Host home
HostName example.com
User apollo
Port 4567
Host work
HostName company.com
User apollo
これは機能しますが、値を繰り返しています。 これは単一のオプションであるため、大したことではありませんが、多くのオプションを共有したい場合があります。 そのための最善の方法は、共有オプションを個別のセクションに分割することです。
接続するすべてのマシンでユーザー名「apollo」を使用する場合、すべての接続に一致する単一の「+ * +」でマークされた汎用の「ホスト」定義にこれを配置できます。 より一般的なセクションは、さらに下に行く必要があることに注意してください。
Host home
HostName example.com
Port 4567
Host work
HostName company.com
Host *
User apollo
これにより、設定の繰り返しの問題が解消され、「apollo」が接続するほとんどの新しいシステムのデフォルトのユーザー名である場合に機能します。
このユーザー名を使用しないシステムがある場合はどうなりますか? ユーザー名がどれだけ広く共有されているかに応じて、これにアプローチできるいくつかの異なる方法があります。
「ほぼすべての」ホストで「apollo」ユーザー名が使用されている場合は、一般的な「+ Host * +」セクションに残しておくことをお勧めします。 これは、上記のセクションからユーザー名を受け取っていないホストに適用されます。 別のユーザー名を使用する異常なマシンの場合、代替を提供することでデフォルトをオーバーライドできます。 これは、ジェネリックセクションの前に定義されている限り優先されます。
Host home
HostName example.com
Port 4567
Host work
HostName company.com
Host oddity
HostName weird.com
User zeus
Host *
User apollo
`+ oddity `ホストの場合、SSHはユーザー名「zeus」を使用して接続します。 他のすべての接続は、一般的な ` Host * +`定義に到達するまでユーザー名を受け取りません。
「apollo」ユーザー名がいくつかの接続で共有されているが、デフォルト値として使用するほど一般的ではない場合はどうなりますか? 使用しているエイリアスの名前をより一般的な形式に変更する場合は、ワイルドカードを使用して、これら2つのホストだけに追加オプションを適用できます。
`+ home `エイリアスを ` hapollo `のようなものに変更し、作業接続を ` wapollo `のようなものに変更できます。 このようにして、両方のホストはエイリアスの「 apollo +」部分を共有し、ワイルドカードを使用して別のセクションでターゲットを設定できます。
Host hapollo
HostName example.com
Port 4567
Host wapollo
HostName company.com
Host *apollo
User apollo
Host *
User diffdefault
ここでは、共有の `+ User `定義を、 ` apollo `で終わるホストに接続しようとするSSH接続に一致するホストセクションに移動しました。 「 apollo 」で終了しない接続(および「 User」を定義する独自の「+ Host 」セクションがない接続)は、ユーザー名「 diff default」を受け取ります。
このファイルでは、最も具体的なものから最も具体的なものへの順序を保持していることに注意してください。 ファイルが解釈される順序に起因するデフォルトではなく、特定性の低いホストセクションをフォールバックと考えるのが最善です。
一般的なSSH設定オプション
これまで、接続を確立するために必要ないくつかの基本的なオプションについて説明してきました。 これらのオプションについて説明しました。
-
* HostName *:接続の確立に使用される実際のホスト名。 これは、 `+ Host `ヘッダーで定義されたエイリアスを置き換えます。 ` Host +`定義が接続する実際の有効なホスト名を指定している場合、このオプションは必要ありません。
-
ユーザー:接続に使用されるユーザー名。
-
ポート:リモートSSHデーモンが実行されているポート。 このオプションは、リモートSSHインスタンスがデフォルトのポート「22」で実行されていない場合にのみ必要です。
探索する価値のある他の多くの便利なオプションがあります。 機能に応じて分けられた、より一般的なオプションのいくつかについて説明します。
一般的な調整と接続項目
おそらく `+ Host * +`セクションで、幅広いレベルで設定したいその他の微調整を以下に示します。
-
*
+ ServerAliveInterval +
*:このオプションは、サーバーからの応答をテストするためにパケットを送信するタイミングをSSHに知らせるように構成できます。 これは、接続が信頼できず、接続がまだ使用可能かどうかを知りたい場合に役立ちます。 -
*
+ LogLevel +
*:これは、SSHがクライアント側でログオンする詳細レベルを設定します。 これは、特定の状況でロギングをオフにしたり、デバッグしようとしたときに冗長性を高めたりするために使用できます。 最小から最大まで、レベルはQUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG1、DEBUG2、およびDEBUG3です。 -
*
+ StrictHostKeyChecking +
*:このオプションは、ssh SSHがホストを `〜/ .ssh / known_hosts +`ファイルに自動的に追加するかどうかを設定します。 デフォルトでは、これは「尋ねる」に設定されます。これは、リモートサーバーから受信したホストキーが ` known_hosts +`ファイルで見つかったものと一致しない場合に警告することを意味します。 多数の一時的なホストに常に接続している場合は、これを「いいえ」に変更することをお勧めします。 SSHは、ホストをファイルに自動的に追加します。 これはセキュリティに影響する可能性があるため、有効にする前に慎重に検討してください。 -
*
+ UserKnownHostsFile +
*:このオプションは、SSHが接続先のホストに関する情報を保存する場所を指定します。 通常、この設定について心配する必要はありませんが、上記の厳密なホストチェックをオフにしている場合は、これを「+ / dev / null +」に設定することをお勧めします。 -
*
+ VisualHostKey +
*:このオプションは、接続時にリモートホストのキーのASCII表現を表示するようSSHに指示できます。 これをオンにすると、ホストのキーを簡単に把握できるため、将来別のコンピューターから接続する必要がある場合に簡単に認識できます。 -
*
+ Compression +
*:圧縮をオンにすると、接続が非常に遅い場合に役立ちます。 ほとんどのユーザーはこれを必要としません。
上記の構成項目を念頭に置いて、いくつかの便利な構成調整を行うことができます。
たとえば、クラウドプロバイダーでホストを非常に迅速に作成および破棄する場合、次のようなものが便利です。
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の一般的な使用法の1つは、接続の転送です。これは、ローカル接続がリモートホストをトンネリングできるようにするか、リモートマシンがローカルマシンをトンネリングできるようにします。 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キーを転送して、ローカルシステムに保存されている資格情報を使用してリモートシステムから接続できます。 リモートシステムでアプリケーションを起動し、X11転送を使用してグラフィカルシステムをローカルシステムに転送することもできます。
これらは、これらの機能に関連付けられているディレクティブです。
-
*
+ ForwardAgent +
*:このオプションを使用すると、ローカルマシンに保存されている認証キーを接続先のシステムに転送できます。 これにより、ホームキーを使用してホスト間をホップできます。 -
*
+ ForwardX11 +
*:リモートシステムで実行されているアプリケーションのグラフィカル画面を転送できるようにする場合は、このオプションをオンにできます。
これらは両方とも「はい」または「いいえ」のオプションです。
キーを指定する
ホストにSSHキーが構成されている場合、これらのオプションは各ホストに使用するキーの管理に役立ちます。
-
*
+ IdentityFile +
*:このオプションを使用して、各ホストで使用するキーの場所を指定できます。 キーがデフォルトの場所にある場合、それぞれが試行され、これを調整する必要はありません。 それぞれが異なる目的に専念するキーが多数ある場合、これを使用して、正しいキーが見つかる正確なパスを指定できます。 -
*
+ IdentitiesOnly +
*:このオプションを使用すると、SSHが `+ config +`ファイルで提供されたIDのみに依存するように強制できます。 これは、SSHエージェントのメモリに、問題のホストに対して無効な代替キーがある場合に必要になることがあります。
これらのオプションは、さまざまなホストの多数のキーを追跡し、1つ以上のSSHエージェントを使用して支援する必要がある場合に特に役立ちます。
単一のTCP接続でのSSHの多重化
SSHには、同じホストマシンへの複数のSSH接続に単一のTCP接続を使用する機能があります。 これは、追加のSSH接続からこのオーバーヘッドを削除するため、リモートエンドへのTCPハンドシェイクの確立に時間がかかる場合に役立ちます。
次のオプションを使用して、SSHで多重化を構成できます。
-
*
+ ControlMaster +
*:このオプションは、可能な場合に多重化を許可するかどうかをSSHに指示します。 一般に、このオプションを使用する場合は、接続が遅いホストセクションまたは一般的な「+ Host * +」セクションで「自動」に設定する必要があります。 -
*
+ ControlPath +
*:このオプションは、接続の制御に使用されるソケットファイルを指定するために使用されます。 ファイルシステム上の場所にある必要があります。 通常、これはSSH変数を使用して与えられ、ホストごとにソケットに簡単にラベルを付けます。 ユーザー名、リモートホスト、ポートに基づいてソケットに名前を付けるには、 `+ / path / to / socket / +`を使用できます。 -
*
+ ControlPersist +
*:このオプションは、最終的なSSH接続が閉じられた後、TCP接続が開いたままになる時間を秒単位で設定します。 これを高い値に設定すると、最初の接続を閉じた後に新しい接続を開くことができますが、通常は未使用のTCP接続を開いたままにしないように「1」のような低い値に設定できます。
通常、次のようなセクションを使用してこれを設定できます。
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
その後、ディレクトリが作成されていることを確認する必要があります。
mkdir -p ~/.ssh/multiplex
特定の接続に多重化を使用しない場合は、次のようにコマンドラインで多重化を選択しないでください。
ssh -S none @
結論
今では、リモートホストへの接続に使用するオプションを大幅にカスタマイズできることは明らかです。 SSHが値を解釈する方法を念頭に置いている限り、合理的なフォールバックで特定の値の豊富なセットを確立できます。