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 密码验证的主要内容,如果未能解决你的问题,请参考以下文章
禁用 SSH 的密码身份验证无法按预期工作 Ubuntu 14.04 LTS