Ansible - 禁用 ssh 密码验证

Posted

技术标签:

【中文标题】Ansible - 禁用 ssh 密码验证【英文标题】:Ansible - disable ssh password authentication 【发布时间】:2021-03-21 12:03:07 【问题描述】:

我正在尝试制作正确处理 sshd_config 的 ansible 任务。我从其他问题中找到了类似的正则表达式,但它们什么也没做。

name: Disable SSH password authentication
      become: true
      lineinfile:
        dest: /etc/ssh/sshd_config
        regexp: '^#?\s*PasswordAuthentication\s'
        line: 'PasswordAuthentication no'
        state: present

问题是它应该处理重复的车道以及 cmets。例如:

可能有:
PasswordAuthentication no
PasswordAuthentication yes

PasswordAuthentication no
PasswordAuthentication no

PasswordAuthentication yes
PasswordAuthentication yes

PasswordAuthentication no
#PasswordAuthentication no

PasswordAuthentication no
# PasswordAuthentication no

# PasswordAuthentication no
# PasswordAuthentication no

等等这么多的组合。但我只想有一条未注释的行PasswordAuthentication no

这可能吗?

【问题讨论】:

对我来说,这听起来像是以所需状态部署文件,或者,如果必须进行自定义,使用 jinja 模板进行部署文件处于所需状态。对个别线路进行破解很少会导致最佳解决方案。 【参考方案1】:

问:"处理重复行以及 cmets ... 有一个未注释的行 PasswordAuthentication no"

A:给定文件列表

    my_files:
      - sshd_config.0
      - sshd_config.1
      - sshd_config.2
      - sshd_config.3
      - sshd_config.4
      - sshd_config.5

内容

shell> for f in files-17/*; do printf "\n%s\n" $f; cat $f; done

files-17/sshd_config.0
PasswordAuthentication no
PasswordAuthentication yes

files-17/sshd_config.1
PasswordAuthentication no
PasswordAuthentication no

files-17/sshd_config.2
PasswordAuthentication yes
PasswordAuthentication yes

files-17/sshd_config.3
PasswordAuthentication no
#PasswordAuthentication no

files-17/sshd_config.4
PasswordAuthentication no
# PasswordAuthentication no

files-17/sshd_config.5
# PasswordAuthentication no
# PasswordAuthentication no

下面的任务会删除除第一行之外的所有内容,其中包括 PasswordAuthentication

    - replace:
        path: 'files-17/ item '
        after: 'PasswordAuthentication'
        regexp: '^(.*)PasswordAuthentication(.*)$'
        replace: ''
      loop: " my_files "

给予

shell> for f in files-17/*; do printf "\n%s\n" $f; cat $f; done

files-17/sshd_config.0
PasswordAuthentication no


files-17/sshd_config.1
PasswordAuthentication no


files-17/sshd_config.2
PasswordAuthentication yes


files-17/sshd_config.3
PasswordAuthentication no


files-17/sshd_config.4
PasswordAuthentication no


files-17/sshd_config.5
# PasswordAuthentication no

下一个任务将行替换为 PasswordAuthentication no

    - lineinfile:
        path: 'files-17/ item '
        regexp: '^(.*)PasswordAuthentication(.*)$'
        line: 'PasswordAuthentication no'
      loop: " my_files "

给予

shell> for f in files-17/*; do printf "\n%s\n" $f; cat $f; done

files-17/sshd_config.0
PasswordAuthentication no


files-17/sshd_config.1
PasswordAuthentication no


files-17/sshd_config.2
PasswordAuthentication no


files-17/sshd_config.3
PasswordAuthentication no


files-17/sshd_config.4
PasswordAuthentication no


files-17/sshd_config.5
PasswordAuthentication no

任务的顺序是幂等的。

【讨论】:

我在这里建议了这个修复,因为我认为您的解决方案在存在重复条目的情况下更安全:github.com/vitalk/ansible-secure-ssh 感谢您的评论。不幸的是,这不是一个通用的解决方案。当心!例如,如果使用“基于每个用户的覆盖设置”,它将失败。在这种情况下,可能有多个具有相同参数的行在单独的块中缩进。要在保存方面使用 template 代替。如何在循环中配置多个参数,请参阅sshd.yml。 很好的反例;这不是一个通用的解决方案,模板是可靠的。但是模板解决方案只有在 ansible 是修改 ssh_config 的唯一来源时才有效,这在大多数企业 ansible 用例中都是正确的,但当您将其用作更“个人”的工具时则不正确,您可能正在编辑文件在ansible运行之间手动。我不想通过替换或模板解决方案破坏我的每个用户设置......每个人:小心。

以上是关于Ansible - 禁用 ssh 密码验证的主要内容,如果未能解决你的问题,请参考以下文章

text 如何禁用SSH的密码身份验证

text 如何禁用SSH的密码身份验证

禁用 SSH 的密码身份验证无法按预期工作 Ubuntu 14.04 LTS

使用密码短语(如 SSH 密钥)存储 Github / Gitea 身份验证令牌

ansible命令详解

ansible命令参数介绍