web-dev-qa-db-ja.com

要塞を介したssh-keyscan

Openstackの要塞の背後でいくつかのテストサーバーを実行しています。テストスタックは頻繁に削除および作成されます。スタックが作成された後、Ansibleスクリプトのセットを実行してサーバーをインストールおよび構成します。プロセスはほぼ完全に自動化されていますが、リモートホストが踏み台インスタンスの背後にある場合、ssh-keyscanを機能させることができません。

これが私の~/.ssh/configにあります

Host bastion
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/private_key.pem

Host remote-Host1
  HostName 192.168.0.123
  User myuser
  IdentityFile ~/.ssh/private_key.pem
  ProxyCommand ssh -W %h:%p bastion

ssh-keyscan remote-Host1を実行しようとすると、

getaddrinfo remote-Host1: Name or service not known

ssh remote-Host1の実行は機能しますが、プロンプトが表示されます

The authenticity of Host '192.168.0.123 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?

これを避けようとしています。

SSHオプション-o StrictHostKeyChecking=noがあり、ssh_args構成オプションを使用してこれをAnsibleに渡すことは可能です。私はそれを使いたくありませんが。指紋を確認せずにssh-keyscanを使用すると、中間者攻撃が可能になることも知っています。このテスト環境のシナリオでは、自分のIPのみがアクセス用のホワイトリストに登録されているので、リスクを冒してもかまいません。

5
Steve

クイックグーグル suggests ssh-keyscanはssh設定ファイルと他のすべてのsshトリックを尊重しません。 (このスレッドはかなり古いですが)。

Ansibleを使用すると、キースキャンタスクを踏み台インスタンスに委任して、known_hostsファイルをローカルに追加できます。

- hosts: localhost
  gather_facts: no
  tasks:
    - command: "ssh-keyscan {{ new_Host }}"
      register: new_Host_fingerprint
      delegate_to: bastion
    - lineinfile:
        dest: /root/ssh/known_hosts
        line: "{{ item }}"
      with_items: "{{ new_Host_fingerprint.stdout_lines }}"

どこ new_Hostは、作成されたホストのIPアドレスです(例では192.168.0.123)。

5

要塞にSSH接続し、そこからssh-keyscanを実行します。

ssh bastion ssh-keyscan remote-Host1
0
womble