如何忽略Anssh 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剧本进行配置。我想在脚本执行过程中避免任何人为干预。

Answers:


247

两种选择-第一种,如您在自己的答案中所述,设置环境变量 ANSIBLE_HOST_KEY_CHECKING为False。

设置它的第二种方法是将其放在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.cfg针对针对无用的VM进行单元测试,针对短期EC2实例的自动化的剧本,以及针对剧本的剧本)

5
有人知道这里的最佳做法是什么?例如,您可以定期运行脚本来重置您的已知主机,这将更加安全(除非在该窗口期间遭受MITM攻击)。默认情况下,忽略真实性会消除SSH主要安全机制之一
TonyH,2017年

3
我喜欢团队使用的模式:我们将ansible.cfg文件放在工作目录中,以针对短暂实例(在无业游民的VM,AWS ec2实例等上运行的单元测试)运行的剧本禁用主机密钥检查,并在以下位置启用检查功能:系统级别。
nikobelia's

1
这样,您可以按逻辑环境管理主机密钥检查。检查动态站起来并在剧本执行后立即删除的实例上的主机密钥没有安全性价值,但是检查持久性计算机的主机密钥有安全性价值。因此,对于那些不同的用例,您应该具有不同的默认值。
nikobelia's

2
如果使用某种机制配置永久性或临时性的新计算机,则该机制应为您提供该计算机的SSH公共密钥。然后,您可以将其存储在各种本地known_hosts文件中,以供SSH和Ansible识别该计算机。否则,特别是通过禁用主机密钥检查,将SSH的安全性降低到几乎为零,并允许MITM攻击。实际上,很多位于“内部网络”中的计算机都已连接到Internet,Internet上的单个更快的DNS响应使您可以与攻击者进行通信,而不是与目标服务器进行通信。
AEF

2
@TonyH通过AWS Cloudformation和Ansible设置多台主机的时候,我跑了ssh-keyscan <ip list>一个值得信赖的机器上(对我来说,这是一个堡垒/跳跃主机)在同一个网络内,并把结果known_hosts 对于建立受信任主机,AWS公开实例启动日志中的主机密钥,因此寻找该密钥是一个手动步骤,如果我要完全重新创建我的环境,我将永远不会中断它。但是该主机通常不需要删除。可能会有所帮助。
dcc310 '18

34

我找到了答案,您需要将环境变量设置ANSIBLE_HOST_KEY_CHECKINGFalse。例如:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

2
是的,但是您说您正在将其用于刚刚设置的新服务器。这样可以避免这次必须处理主机密钥,但是后续的SSH连接又如何呢?您的安装脚本将运行,配置服务器,并已完成。现在,您拥有运行的其他剧本,或者说拥有使用SSH的脚本。现在它们已损坏,因为主机密钥仍不在known_hosts中。您只是延迟了您的问题。简而言之,您在这里写的内容听起来并不能很好地回答您提出的问题。
托德·沃尔顿

创建服务器时,在bash脚本中使用此命令,而在其他操作中则不使用。
约翰

8

转发到nikobelia

对于那些使用jenkins来运行剧本的人,我只是在运行ansible-playbook之前将其添加到我的jenkins工作中,他的环境变量ANSIBLE_HOST_KEY_CHECKING = False例如:

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

6

更改host_key_checkingfalse所有主机是一个非常糟糕的主意。

您唯一要忽略它的时间是在“首次联系”上,这两个任务将完成:

    - 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.cfg或,playbook.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参数只是告诉boto不验证AWS API HTTPS证书。它不会影响SSH密钥验证。
马修·达顿

0

我知道这个问题已经得到了回答,而且也是正确的,但是我只想链接ansible文档,在该文档中清楚地说明了何时以及为什么应该添加相应的检查:host-key-checking


0

当您要将新主机添加到剧本中的动态清单(通过add_host模块)时,出现最多的问题。我不想永久禁用指纹主机检查,因此对我而言,诸如在全局配置文件中禁用指纹主机之类的解决方案并不可行。像ANSIBLE_HOST_KEY_CHECKING在运行playbook之前一样导出var是在运行之前要做的另一件事,需要记住。

最好在剧本所在的目录中添加本地配置文件。创建名为的文件ansible.cfg并粘贴以下文本:

[defaults]
host_key_checking = False

无需记住在env vars中添加某些内容或添加到ansible-playbook选项中。将此文件放入ansible git repo很容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.