web-dev-qa-db-ja.com

動的IPを使用したSSHknown_hosts

ファイアウォールの背後にマシンがあります。 sshを介して転送されるポートを使用してVPNトンネリングを使用してリモートで接続します。マシンに接続するには、VPNの外部IPと、個人用および一時的に割り当てられたポートを使用します。私が使用するコマンドは次のとおりです。

ssh USER@VPN_IP -p PORT

VPN_IPPORTは頻繁に変更されるため、ホストキーをknown_Hostに保存して中間者攻撃を排除する利点は得られませんが、同時にホストキーは私にはよく知られており、現在のVPN_IPPORTの組み合わせに使用するためにsshに提供できます。それは可能ですか?どうやって?

2
Ilmanowar

known_hostsファイルはこれらのキーを提供するためのものであり、直接のコマンドラインの代替手段はありません(とにかく、それほど便利ではありません)。ただし、known_hostsファイルを使用すると、目標を完全に達成できます。

man sshdの-​​ ssh_known_hostsファイル形式 を読み通します。

ホスト認証を実行するとき、一致する行に適切なキーがある場合、認証が受け入れられます。完全に一致するもの、またはサーバーが認証用の証明書を提示した場合は、証明書に署名した認証局のキー。

~/.ssh/known_hosts(および/etc/ssh/ssh_known_hosts)でワイルドカードを使用することができます。

これらのファイルの各行には、マーカー(オプション)、ホスト名、キータイプ、base64でエンコードされたキー、コメントのフィールドが含まれています。フィールドはスペースで区切られます。

ホスト名はパターンのコンマ区切りリストです(*および?はワイルドカードとして機能します)。次に、各パターンは、正規のホスト名(クライアントを認証する場合)またはユーザー指定の名前(サーバーを認証する場合)と照合されます。パターンの前に!を付けて、否定を示すこともできます。ホスト名が否定されたパターンと一致する場合、その行の別のパターンと一致しても、(その行では)受け入れられません。ホスト名またはアドレスは、オプションで[および]括弧で囲み、その後に「:」と非標準のポート番号を続けることができます。

信頼できるキーを作成することが可能です

  • わかっている場合は、ネットワーク範囲。 TEST-NET-2の場合:

    198.51.100.* ssh-rsa AAAAB3Nza...2iQ==
    
  • カンマ区切りのリストを使用した複数の範囲(例:すべてのTEST-NETs):

    192.0.2.*,198.51.100.*,203.0.113.* ssh-rsa AAAAB3Nza...2iQ==
    
  • またはどこにでも接続する場合:

    * ssh-rsa AAAAB3Nza...2iQ==
    

このキーが存在しない場合でも、yesと答えると、他のキーの信頼性について警告し、指紋を表示して自動的に追加します。比較は行ごとに行われます。

5
Esa Jokinen

Esa Jokinenの有用な答えを使用し、ここでプロセスを自動化する私の解決策:

#!/bin/sh
previous_IP_OR_known_Host_key_line=$1
current_IP=$2
user=$3
port=$4

#random extension to avoid collision by multiple script execution
temp_file="/tmp/temp_Host_file.$(hexdump -n 2 -e '/2 "%u"' /dev/urandom)"

if [ "$(echo "$previous_IP_OR_known_Host_key_line"|wc -w)" -gt 1 ]; then 
 echo "$previous_IP_OR_known_Host_key_line"|sed "s/^[^ ]*/$current_IP/">"$temp_file"
else
 ssh-keygen -F "$previous_IP_OR_known_Host_key_line"|grep -v "^#"|sed "s/^[^ ]*/$current_IP/">"$temp_file"
fi

ssh "$user"@"$current_IP" -p "$port" -o UserKnownHostsFile="$temp_file"

rm "$temp_file"

スクリプトは、sshに提供する一時的なknown_Hostファイルを生成します。スクリプトには、次のパラメーターが必要です(順序に従う)。

-マシンが以前に受け入れた接続で持っていた宛先IP OR known_Hostファイルからのキーを持つ対応するRAW行。

-現在のIP(VPN /ファイアウォールの背後)。

-ユーザー。

-ポート。

1
Ilmanowar