ジャンプボックスを介してSSHを実行しようとしていますが、SSHはジャンプボックスのホストキーを確認するように指示しているにもかかわらず、通常の-o StrictHostKeyChecking=no -o UserKnownHostsFile=no
コマンドラインオプション。
ジャンプボックスに直接SSHで接続する場合、SSHで期待どおりにエラーを無視することができます。
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa jumpuser@jumpbox
しかし、プロキシジャンプオプションを追加すると、突然エラーが発生します。エラーはジャンプボックスからではなく、ジャンプボックスの.sshディレクトリにknown_hostsファイルがなく、jumpuserとしてログインしていません。
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa -J jumpuser@jumpbox [email protected]
エラーメッセージ:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE Host IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a Host key has just been changed.
The fingerprint for the ECDSA key sent by the remote Host is
<redacted>.
Please contact your system administrator.
Add correct Host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:10
remove with:
ssh-keygen -f "/home/user/.ssh/known_hosts" -R jumpbox
ECDSA Host key for jumpbox has changed and you have requested strict checking.
Host key verification failed.
ssh_exchange_identification: Connection closed by remote Host
ここで、user
は通常のユーザーであり、SSHを試行しているユーザーではありません。
ここで何が起こっているのか、私には手がかりがありません。 SSHには、プロキシジャンプの状況に対してホストキーチェックを強制する特別なオーバーライドがありますか?もしそうなら、それはローカルをVMプロビジョニングに本当の苦痛を与えることになるため、非常に苛立たせています。
ProxyJump
は、別のssh
プロセスを発行します。このプロセスは、最初のssh
コマンドのコマンドラインで指定したコマンドライン引数を継承しません。 2つの可能な方法があります。
~/.ssh/config
の設定ファイルでこれらのオプションを使用してください-入力の手間も大幅に節約できます!
Host jumpbox
User jumpuser
StrictHostKeyChecking=no
UserKnownHostsFile=/dev/null
IdentityFile ~/.ssh/id_jumpuser_rsa
その後、ssh -J jumpbox [email protected]
と同じように接続できます。
代わりにProxyCommand
オプションを使用してください-これは同じ働きをしますが、より透過的に、そこで実際に何が行われているのかを確認できます。
ssh -o ProxyCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/id_jumpuser_rsa -W %h:%p jumpuser@jumpbox" -i ~/.ssh/id_jumpuser_rsa [email protected]
@Jakujeの優れた回答から、要塞ホストを介した一般的なファイルの取得用に次のスクリプトを作成しました。
#!/usr/bin/env bash
set -e
ME=$(basename $0)
log_() { echo "[$ME] $@"; }
PRIVATE_IP=$1
BASTION=$2
SOURCE=$3
TARGET=$4
USER=${5:-ubuntu}
BASTION_USER=${6:-$USER}
log_ Copying ${USER}@${PRIVATE_IP}:${SOURCE} to ${TARGET} via ${BASTION_USER}@${BASTION}
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
-o ProxyCommand="ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l ${BASTION_USER} -W ${PRIVATE_IP}:22 ${BASTION}" \
${USER}@${PRIVATE_IP}:${SOURCE} ${TARGET}
データセンター内にプライベートホストをプロビジョニングする場合に役立ちます。