SSHの動作

Fabricでは、接続の管理にピュアPythonのSSH再実装を利用しています。これはつまり、このライブラリーの機能に制限される箇所があるということを意味します。以下は ssh コマンドラインプログラムの動作とは同等ではないか、それほどには柔軟性がない、Fabricが示す動作の領域です。

未知のホスト

SSHのホストキートラッキングメカニズムは、接続を試行したすべてのホストを把握し、識別子(IPアドレスや、ときにはホスト名も)とSSHキーをマッピングして ~/.ssh/known_hosts で維持管理します。(この動作の詳細は OpenSSH documentation を御覧ください。)

paramiko ライブラリは known_hosts ファイルを読み込むことができ、このマッピングとともに、接続するすべてのホストを比較します。未知のホスト(ユーザー名やIPが known_hosts に見当たらないホスト名)に遭遇したときにどのように動作させるかを決定する設定があります:

  • Reject(拒否): そのホストキーが拒否され、接続は行われません。結果としてPythonの例外を発生させ、未知のホストであるというメッセージとともにFabricのセッションを終了させます。
  • Add(追加): 新しいホストキーが既知のホストのインメモリーリストに追加され、接続が行われ、通常通り動作が継続されます。これによってあなたのディスク上の known_hosts ファイルが変更されることは ありません !
  • Ask(尋ねる): Fabricのレベルではまだ実装されていません。これは paramiko ライブラリのオプションで、未知のキーについてそれを受け入れるかどうかユーザーに尋ねます。

上記のホストの拒否もしくは追加はFabricの env.reject_unknown_hosts オプション経由でコントロールされ、利便性のため、デフォルトではFalseに設定されています。これは利便性とセキュリティとの間の妥当なトレードオフだと私たちは感じています。そのようには感じない方は簡単にモジュールレベルでfabfileを変更し、 env.reject_unknown_hosts = True にセットすることができます。

変更されたキーの既知のホスト

SSHのキー/フィンガープリントのポイントは中間者攻撃を検知できることです。もしあなたのSSHトラフィックを攻撃者が自分のコントロール下にあるコンピュータにリダイレクトさせ、本物の目的サーバに見せかけようとしても、ホストキーがマッチしません。そして、SSH(とそのPython実装)のデフォルトの挙動では、 known_hosts に以前に記録されているホストが突然違ったホストキーの送信を始めると、その接続は直ちに切断されます。

EC2でのデプロイメントなどのいくつかのエッジケースでは、この潜在的な問題を無視するとよいでしょう。私たちのSSH層では、これを書いている時点では、この挙動を正確にコントロールすることはできません。ただし、 known_hosts の読み込みを単にスキップすることでこれを回避することができます。比較するこのホストリストが空なら問題は発生しない、ということです。この挙動にするには env.disable_known_hosts をTrueにセットします。デフォルトでは、SSHのデフォルト挙動を維持するため、Falseになっています。

警告

env.disable_known_hosts を有効にすると中間者攻撃に対して無防備になります! 注意して利用してください。