序章

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

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

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

前提条件

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

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

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

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

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

touch ~/.ssh/config

構成ファイルの構造

The 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_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デーモンが実行されているホスト名、ユーザー名、およびポートです。

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

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 で終わるホストに接続しようとしているSSH接続に一致するホストセクションへの定義 apollo. で終わらない接続 apollo (そしてそれ自身なしで Host を定義するセクション User)ユーザー名を受け取ります 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がで提供されたIDのみに依存するように強制できます。 config ファイル。 これは、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が値を解釈する方法を念頭に置いている限り、妥当なフォールバックで特定の値の豊富なセットを確立できます。