SSHクライアントのカスタム接続オプションを構成する方法

提供:Dev Guides
移動先:案内検索

序章

SSH、またはセキュアシェルは、リモート管理のためにLinuxホストに接続する最も一般的な方法です。 多くの場合、単一のホストへの接続の基本はかなり単純ですが、多数のリモートシステムで作業を開始すると、これは扱いにくく、はるかに複雑な作業になる可能性があります。

幸い、OpenSSHを使用すると、カスタマイズされたクライアント側の接続オプションを提供できます。 これらは、ホストごとの値を定義するために使用できる構成ファイルに保存できます。 これにより、ホストごとに使用するさまざまな接続オプションを分離して整理し、接続する必要があるときにコマンドラインで広範なオプションを提供する必要がなくなります。

このガイドでは、SSHクライアント構成ファイルの基本について説明し、いくつかの一般的なオプションについて説明します。

前提条件

このガイドを完了するには、SSHの実用的な知識と、接続時に提供できるいくつかのオプションが必要です。 また、少なくともテスト目的で、一部のユーザーまたはホストに対してSSHキーベースの認証を構成することもできます。

SSH構成ファイルの構造と解釈アルゴリズム

ローカルシステムの各ユーザーは、クライアント側のSSH構成ファイルを維持できます。 これらには、接続パラメーターを指定するためにコマンドラインで使用するオプションを含めることができます。これにより、共通の接続項目を保存し、接続時にそれらを自動的に処理できます。 sshコマンドへの通常のフラグを介して、接続時に構成ファイルで定義された値をオーバーライドすることは常に可能です。

SSHクライアント構成ファイルの場所

クライアント側の構成ファイルはconfigと呼ばれ、.ssh構成ディレクトリ内のユーザーのホームディレクトリにあります。 多くの場合、このファイルはデフォルトでは作成されないため、自分で作成する必要があります。

touch ~/.ssh/config

構成ファイルの構造

configファイルはホストごとに編成されています。 各ホスト定義は、特定の一致するホストの接続オプションを定義できます。 より広い範囲を持つべきオプションを可能にするワイルドカードも利用できます。

各セクションは、続く構成オプションと一致する必要があるホストを定義するヘッダーで始まります。 次に、その一致するホストの特定の構成項目を以下に定義します。 ホストは未定義のアイテムのデフォルトを継承するため、デフォルト値とは異なるアイテムのみを指定する必要があります。 セクションは、Hostヘッダーから次のHostヘッダーまで定義されます。

通常、組織的な目的と読みやすさのために、各ホストに設定されているオプションはインデントされています。 これは難しい要件ではありませんが、一目で簡単に解釈できる便利な規則です。

一般的な形式は次のようになります。

Host firsthost
    SSH_OPTION_1 custom_value
    SSH_OPTION_2 custom_value
    SSH_OPTION_3 custom_value

Host secondhost
    ANOTHER_OPTION custom_value

Host *host
    ANOTHER_OPTION custom_value

Host *
    CHANGE_DEFAULT custom_value

ここでは、問題のホストが一致するかどうかに応じて、各接続試行に適用される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 firsthost
    SSH_OPTION_1 custom_value
    SSH_OPTION_2 custom_value
    SSH_OPTION_3 custom_value

Host secondhost
    ANOTHER_OPTION custom_value

Host *host
    ANOTHER_OPTION custom_value

Host *
    CHANGE_DEFAULT custom_value

ここでは、最初の2つのセクションがリテラルのホスト名(またはエイリアス)によって定義されていることがわかります。つまり、ワイルドカードは使用されていません。 ssh firsthostを使用して接続すると、最初のセクションが最初に適用されます。 これにより、この接続にSSH_OPTION_1SSH_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デーモンが実行されているホスト名、ユーザー名、およびポートです。

apolloという名前のユーザーとして、コマンドラインからポート4567でSSHデーモンを実行するexample.comというホストに接続するには、さまざまな方法で変数情報を提供できます。方法。 最も一般的なのはおそらく次のとおりです。

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セクションがない)接続は、ユーザー名diffdefaultを受け取ります。

ファイル内で最も具体的なものから最も具体的でないものへの順序を保持していることに注意してください。 ファイルが解釈される順序のために、デフォルトではなく、フォールバックとして、あまり具体的でないホストセクションを考えるのが最善です。

一般的なSSH構成オプション

これまで、接続を確立するために必要ないくつかの基本的なオプションについて説明してきました。 これらのオプションについて説明しました。

  • HostName :接続を確立するために使用する必要がある実際のホスト名。 これにより、Hostヘッダーで定義されているエイリアスが置き換えられます。 Host定義で接続する実際の有効なホスト名が指定されている場合、このオプションは不要です。
  • User :接続に使用されるユーザー名。
  • ポート:リモートSSHデーモンが実行されているポート。 このオプションは、リモートSSHインスタンスがデフォルトポート22で実行されていない場合にのみ必要です。

探索する価値のある他の多くの便利なオプションがあります。 機能ごとに分けて、より一般的なオプションのいくつかについて説明します。

一般的な調整と接続アイテム

おそらくHost *セクションで、幅広いレベルで構成したいその他の微調整を以下に示します。

  • ServerAliveInterval :このオプションは、サーバーからの応答をテストするためにパケットを送信するタイミングをSSHに通知するように構成できます。 これは、接続の信頼性が低く、接続がまだ利用可能かどうかを知りたい場合に役立ちます。
  • LogLevel :これは、SSHがクライアント側にログオンする詳細レベルを構成します。 これは、特定の状況でロギングをオフにしたり、デバッグしようとしたときに冗長性を高めたりするために使用できます。 最小から最も冗長なレベルまで、レベルはQUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG1、DEBUG2、およびDEBUG3です。
  • StrictHostKeyChecking :このオプションは、sshSSHが~/.ssh/known_hostsファイルにホストを自動的に追加するかどうかを構成します。 デフォルトでは、これは「ask」に設定されます。これは、リモートサーバーから受信したホストキーがknown_hostsファイルにあるものと一致しない場合に警告することを意味します。 多数の一時的なホストに常に接続している場合は、これを「いいえ」に変更することをお勧めします。 SSHは、ホストをファイルに自動的に追加します。 これはセキュリティに影響を与える可能性があるため、有効にする前に慎重に検討してください。
  • UserKnownHostsFile :このオプションは、SSHが接続しているホストに関する情報を保存する場所を指定します。 通常、この設定について心配する必要はありませんが、上記の厳密なホストチェックをオフにしている場合は、これを/dev/nullに設定することをお勧めします。
  • VisualHostKey :このオプションは、接続時にリモートホストのキーのASCII表現を表示するようにSSHに指示できます。 これをオンにすると、ホストのキーに慣れるための簡単な方法になり、将来別のコンピューターから接続する必要がある場合に、ホストのキーを簡単に認識できるようになります。
  • 圧縮:圧縮をオンにすると、接続が非常に遅い場合に役立ちます。 ほとんどのユーザーはこれを必要としません。

上記の構成項目を念頭に置いて、いくつかの便利な構成の調整を行うことができます。

たとえば、クラウドプロバイダーでホストを非常に迅速に作成および破棄する場合は、次のようなものが役立つ場合があります。

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 :このオプションを使用して、各ホストに使用するキーの場所を指定できます。 キーがデフォルトの場所にある場合、それぞれが試され、これを調整する必要はありません。 それぞれが異なる目的に使用される多数のキーがある場合、これを使用して、正しいキーを見つけることができる正確なパスを指定できます。
  • IdentitysOnly :このオプションを使用すると、SSHがconfigファイルで提供されたIDのみに依存するように強制できます。 これは、SSHエージェントのメモリ内に問題のホストに対して無効な代替キーがある場合に必要になることがあります。

これらのオプションは、さまざまなホストの多数のキーを追跡し、1つ以上のSSHエージェントを使用して支援する必要がある場合に特に役立ちます。

単一のTCP接続を介したSSHの多重化

SSHには、同じホストマシンへの複数のSSH接続に単一のTCP接続を使用する機能があります。 これは、リモートエンドへのTCPハンドシェイクを確立するのに時間がかかる場合に役立ちます。これにより、追加のSSH接続からこのオーバーヘッドが除去されます。

次のオプションを使用して、SSHによる多重化を構成できます。

  • ControlMaster :このオプションは、可能な場合に多重化を許可するかどうかをSSHに指示します。 通常、このオプションを使用する場合は、接続が遅いホストセクションまたは汎用Host *セクションのいずれかで「自動」に設定する必要があります。
  • ControlPath :このオプションは、接続の制御に使用されるソケットファイルを指定するために使用されます。 ファイルシステム上の場所にある必要があります。 通常、これはSSH変数を使用して与えられ、ホストごとにソケットに簡単にラベルを付けます。 ユーザー名、リモートホスト、およびポートに基づいてソケットに名前を付けるには、/path/to/socket/%r@%h:%pを使用できます。
  • ControlPersist :このオプションは、最後のSSH接続が閉じられた後にTCP接続が開いたままになる時間を秒単位で設定します。 これを高い数値に設定すると、最初の接続を閉じた後に新しい接続を開くことができますが、未使用のTCP接続を開いたままにしないように、通常は「1」などの低い値に設定できます。

通常、これは次のようなセクションを使用して設定できます。

Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

その後、ディレクトリが作成されていることを確認する必要があります。

mkdir -p ~/.ssh/multiplex

特定の接続に多重化を使用しない場合は、次のようにコマンドラインで多重化なしを選択できます。

ssh -S none user@host

結論

ここまでで、リモートホストへの接続に使用するオプションを大幅にカスタマイズできることは明らかです。 SSHが値を解釈する方法を念頭に置いている限り、妥当なフォールバックで特定の値の豊富なセットを確立できます。