ansible SSH認証チェックを無視する方法は?


164

Ansibleによって行われたSSH認証チェックを無視する方法はありますか?たとえば、新しいサーバーをセットアップしたばかりの場合、この質問に「はい」と答える必要があります。

GATHERING FACTS ***************************************************************
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:yy:zz:....
Are you sure you want to continue connecting (yes/no)?

これは一般的には悪い考えですが、これをスクリプトに組み込んで、最初にクラウドプロバイダーで新しい仮想サーバーを作成し、次にansibleプレイブックを自動的に呼び出して構成します。スクリプトの実行中に人間の介入を避けたいです。

回答:


247

2つのオプション-最初の方法は、あなた自身の答えで述べたように、環境変数ANSIBLE_HOST_KEY_CHECKINGをFalseに設定することです。

これを設定する2番目の方法は、ansible.cfgファイルに配置することです。これは、グローバルに(システムレベルまたはユーザーレベルで、/etc/ansible/ansible.cfgまたはで~/.ansible.cfg)、または同じディレクトリの設定ファイルで設定できるため、非常に便利なオプションです。あなたが実行しているプレイブックとして。

これを行うには、ansible.cfgこれらの場所のいずれかにファイルを作成し、これを含めます。

[defaults]
host_key_checking = False

また、プレイの開始時にファクトを収集するかどうか、複数の場所で宣言されたハッシュをマージするか、別の場所でハッシュを置き換えるかなど、他にも多くの便利なデフォルトを設定できます。オプションの全体の大きなリストがありますここ Ansibleドキュメントでは。


編集:セキュリティに関するメモ。

SSHホストキーの検証は、永続的なホストにとって意味のあるセキュリティレイヤーです。同じマシンに何度も接続する場合は、ホストキーをローカルで受け入れることが重要です。

寿命の長いEC2インスタンスの場合、インスタンスの最初の作成時に一度だけ実行されるタスクでホストキーを受け入れることは理にかなっています。

  - name: Write the new ec2 instance host key to known hosts
    connection: local
    shell: "ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts"

動的に立ち上がってプレイブックの実行直後に削除するインスタンスのホストキーをチェックするセキュリティ値はありませんが、永続マシンのホストキーをチェックするセキュリティ値はあります。そのため、論理環境ごとに異なる方法でホストキーチェックを管理する必要があります。

  • デフォルトでチェックを有効のままにします(~/.ansible.cfg
  • エフェメラルインスタンスに対して実行する./ansible.cfgPlaybook の作業ディレクトリでホストキーチェックを無効にします(Vagrant VMに対する単体テストのPlaybookとともに、有効期間の短いec2インスタンスの自動化)

5
ここでベストプラクティスは何か知っていますか?たとえば、スクリプトを定期的に実行して既知のホストをリセットすることができます(既知のホストはリセットされます(そのウィンドウの間にMITM攻撃を受けない限り)。デフォルトで認証を無視すると、SSHプライマリセキュリティメカニズムの1
つがなくなります

3
私のチームが使用するパターンが好きです:ホストキーチェックを無効にするansible.cfgファイルを、一時インスタンスに対して実行するプレイブックの作業ディレクトリに配置し(迷惑なVM、AWS ec2インスタンスなどで実行される単体テスト)、チェックを有効のままにしますシステムレベル。
ニコベリア2017年

1
これにより、論理環境ごとにホストキーチェックを管理できます。動的に立ち上がってプレイブックの実行直後に削除するインスタンスのホストキーをチェックするセキュリティ値はありませんが、永続マシンのホストキーをチェックするセキュリティ値はあります。したがって、それらの異なるユースケースには異なるデフォルトを設定する必要があります。
ニコベリア2017年

2
永続的または一時的なメカニズムを使用して新しいマシンをプロビジョニングする場合、そのメカニズムにより、このマシンのSSH公開鍵が提供されます。その後known_hosts、SSHおよびAnsibleがマシンを認識するために、さまざまなローカルファイルに保存できます。そうしないと、特にホストキーチェックを無効にすると、SSHのセキュリティがほぼゼロに低下し、MITM攻撃が可能になります。「内部ネットワーク」にあると思われる多くのマシンは、実際にはインターネットに接続されており、単一のより高速なDNS応答により、ターゲットではなく攻撃者と話すことができます。
aef

2
@TonyH AWS CloudformationとAnsibleを介して多くのホストをセットアップするときssh-keyscan <ip list>、同じネットワーク内の信頼できるマシン(私にとってはそれは要塞/ジャンプホストです)で実行し、結果をknown_hosts その信頼できるホストをセットアップするためにAWSが公開しますインスタンスの起動ログにホストキーがあるので、そのキーを探すのは手動の1つの手順であり、環境を完全に再現している場合は切り捨てることはありませんでした。しかし、そのホストは通常​​削除する必要はありませんでした。これは役立つかもしれません。
dcc310

34

答えを見つけました。環境変数ANSIBLE_HOST_KEY_CHECKINGをに設定する必要がありますFalse。例えば:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
はい、しかし、あなたはこれをあなたがセットアップしたばかりの新しいサーバーに使用していると言いました。今回はホストキーを処理する必要はありませんが、後続のSSH接続はどうですか?セットアップスクリプトが実行され、サーバーが構成されます。これで、他のプレイブックを実行したり、SSHを使用するスクリプトを作成したりできます。今、彼らはしているホストキーがknown_hostsファイルにはまだないので、壊れました。問題を遅らせただけです。要するに、あなたがここで書いたことは、あなたが尋ねた質問に対する良い答えのようには聞こえません。
トッドウォルトン

これは、新しいサーバーを作成するときにbashスクリプトで使用されます。他の目的には使用されません。
ヨハン

8

転送nikobelia

jenkinsを使用してプレイブックを実行する人のために、環境変数ANSIBLE_HOST_KEY_CHECKING = Falseたとえば次のように、ansible-playbookを実行する前にjenkinsジョブに追加しました。

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv

6

すべてのホストhost_key_checkingfalseに変更することは非常に悪い考えです。

あなたがそれを無視したい唯一の時は、これらの2つのタスクが成し遂げる「最初の接触」の上です:

    - name: Check SSH known_hosts for {{ inventory_hostname }}
      local_action: shell ssh-keygen -F {{ inventory_hostname }}
      register: checkForKnownHostsEntry
      failed_when: false
      changed_when: false
      ignore_errors: yes
    - name: Add {{ inventory_hostname }} to SSH known hosts automatically
      when: checkForKnownHostsEntry.rc == 1
      changed_when: checkForKnownHostsEntry.rc == 1
      set_fact:
        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

したがって、known_hostsファイルにホストキーがない場合にのみ、ホストキーチェックをオフにします。


3

プレイブックの実行中にコマンドライン引数として渡すことができます:

ansible-playbook play.yml --ssh-common-args='-o StrictHostKeyChecking=no'


2

あなたが変更したくない場合ansible.cfgplaybook.yml、あなただけの環境変数を設定することができます。

export ANSIBLE_HOST_KEY_CHECKING=False

0

validate_certsという名前のパラメーターを使用して、ssh検証を無視します。

- ec2_ami:
    instance_id: i-0661fa8b45a7531a7
    wait: yes
    name: ansible
    validate_certs: false
    tags:
      Name: ansible
      Service: TestService

これを行うことにより、ssh検証プロセスを無視します


このvalidate_certsパラメーターは、AWS API HTTPS証明書を検証しないようにbotoに指示するだけです。SSHキーの検証には影響しません。
マシューダットン

0

私は質問が回答されており、それも正しいことを知っていますが、それぞれのチェックをいつ、なぜ追加する必要があるかが明確に説明されているansible docをリンクしたいと思います:host-key-checking


0

プレイブックの動的ホスト(add_hostモジュールを介して)に新しいホストを追加するときに、最も問題が発生します。フィンガープリントのホストチェックを永続的に無効にしたくないので、グローバル構成ファイルでフィンガープリントのホストチェックを無効にするような解決策は私には適切ではありません。ANSIBLE_HOST_KEY_CHECKINGプレイブックを実行する前のようにvarをエクスポートすることは、実行する前に覚えておかなければならないもう1つのことです。

プレイブックと同じディレクトリにローカル設定ファイルを追加することをお勧めします。という名前のファイルを作成しansible.cfg、次のテキストを貼り付けます。

[defaults]
host_key_checking = False

環境変数に何かを追加したり、ansible-playbookオプションに追加したりすることを覚えておく必要はありません。このファイルをansible git repoに配置するのは簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.