未知のSSHホスト鍵の受け入れ

Paramikoで未知のSSHホスト鍵を受け入れる設定

説明

SSHはホスト鍵を使って接続先サーバーの身元を確認します。鍵を検証せず自動的に受け入れると、中間者攻撃を許すおそれがあります。

paramiko.SSHClient.set_missing_host_key_policy(AutoAddPolicy)は、未知のホスト鍵を自動的に受け入れます。そのため、サーバーになりすませる攻撃者に接続を傍受される可能性があります。

想定される影響

  • サーバーへのなりすまし: 偽のSSHサーバーに送った認証情報を取得されるおそれがあります。
  • セッションの侵害: 悪意のある接続相手がコマンドを受け取り、返す応答を操作できる可能性があります。
  • データ改ざん: 通信データを傍受・改ざんされるおそれがあります。

対処方法

  1. set_missing_host_key_policy(AutoAddPolicy)で未知のホスト鍵を自動的に信頼しないでください。RejectPolicyで、信頼済みではない鍵を拒否してください。
  2. load_host_keys()またはknown_hostsファイルから信頼する鍵を読み込んでください。登録前に別の信頼できる経路でフィンガープリントを確認してください。鍵が変わった場合は原因を調べ、承認済みの値に更新してください。同じ接続で受け取ったという理由だけで鍵を信頼しないでください。

例

変更前

python
from paramiko.client import SSHClient, AutoAddPolicy

client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy) # 未知のホスト鍵を受け入れる
client.connect("example.com")

変更後

python
from paramiko.client import SSHClient, RejectPolicy

client = SSHClient()
client.load_system_host_keys() # known_hostsから信頼するホスト鍵を読み込む
client.set_missing_host_key_policy(RejectPolicy) # 未知のホスト鍵を拒否
client.connect("example.com")

説明:

  • 変更前: AutoAddPolicyが、未検証の未知のホスト鍵を受け入れます。
  • 変更後: load_system_host_keys()でローカルの~/.ssh/known_hostsから信頼する鍵を読み込み、set_missing_host_key_policy(RejectPolicy)で未知の鍵を拒否します。接続前に信頼する鍵のエントリーを用意してください。

参考資料