如何在ansible剧本中彻底编辑sshd_config中的基本安全选项?

时间:2019-06-04 03:16:39

标签: ansible

我正在尝试编写一本干净地编辑/ etc / ssh / sshd_config的剧本,使其具有PasswordAuthentication noPermitRootLogin no

我可以想到一些有问题的方法。

首先,我可以使用lineinfile删除所有与PasswordAuthentication|PermitRootLogin匹配的行,然后追加我想要的两个新行,但是i)这可能会在原子上失败并且ii)在末尾追加行可以将它们混合带有“匹配”块,通常可以显示在末尾。

我也可以使用lineinfile用^(# *)?PasswordAuthenticationPasswordAuthentication no替换所有匹配PasswordAuthentication no的行,但是如果不存在匹配的行,则行不通。另外,如果有多条匹配的行,我将有重复的npm run dev行。

我可以为整个文件使用模板,但这意味着我需要指定所有内容,包括HostKey,但我不想指定所有内容,并且希望保留其他选项的设置方式。

由于列出的问题,上述方法均不能令人满意。有没有一种干净的方法可以可靠地进行所需的更改,具有幂等性,并且如果系统中途失败,也不会使系统处于不良状态?

4 个答案:

答案 0 :(得分:1)

我认为您可以使用U并像这样使用lineinfilestate=absent

state=present

对于- name: deactivate PermitRootLogin lineinfile: path: "/etc/ssh/sshd_config" line: "PermitRootLogin no" state: present notify: - restart sshd - name: ensure PermitRootLogin is not activated lineinfile: path: "/etc/ssh/sshd_config" line: "PermitRootLogin yes" state: absent notify: - restart sshd ,同样适用。

答案 1 :(得分:1)

此解决方案仅需要一项任务,而无需其他文件:

- name: Configure sshd
  lineinfile:
    path: "/etc/ssh/sshd_config"
    regex: "^(#)?{{item.key}}"
    line: "{{item.key}} {{item.value}}"
    state: present
  loop:
    - { key: "PermitRootLogin", value: "no" }
    - { key: "PasswordAuthentication", value: "no" } 
  notify:
    - restart sshd

答案 2 :(得分:0)

如果不是 template 选项,则应使用 lineinfile 。解决细节:

  

..追加我想要的两行,但是我)这可能会在非原子上失败...

如果未能完成,请修复并重复播放。

  

...如果有多行匹配,我将没有重复的PasswordAuthentication行。

验证配置,如果配置无法完成修复,然后重复播放。

validate: "{{ sshd_path }} -t -f %s"
  

以上方法都不令人满意...

这种期望是不现实的。这两个问题(任意故障,匹配行)都描述了模块不一定必须解决的错误状态。 lineinfile 完全符合目的。例如,请参见sshd.yml

答案 3 :(得分:0)

  

我可以将每行匹配^(#*)?PasswordAuthentication替换为PasswordAuthentication no,也可以使用lineinfile,但是如果不存在匹配的行,则行不通。另外,如果有多条匹配的行,我将有重复的PasswordAuthentication行。

您只是没有获得/测试lineinfile的工作方式,因为这正是您要寻找的解决方案。在您的特定情况下,如果没有反向引用,该模块将:

  • 查看您要添加的行是否有效,在这种情况下它将什么都不做
  • 如果该行不存在,请查找匹配它的正则表达式
  • 如果找到一个或多个匹配项,则最后一个匹配项将替换为给定的行
  • 如果未找到正则表达式,则该行将添加到文件末尾
  • 如果仍然需要在文件中的特定位置添加该行(如果该行不存在),则可以使用insertbeforeinsertafter

请参见以下示例:

具有多个匹配行的初始test.config

# PasswordAuthentication no
# PermitRootLogin no
somevalue no
# PasswordAuthentication no
# PermitRootLogin no
othervalue yes
# PasswordAuthentication no
# PermitRootLogin no

test2.config无匹配项

value none
othervalue no
yetanother yes

测试手册:

---
- name: Line in file test
  hosts: localhost
  gather_facts: false

  tasks:
    - name: test replace
      lineinfile:
        path: "{{ item }}"
        regex: ^(# *)?PasswordAuthentication
        line: PasswordAuthentication no
      loop:
        - /path/to/test.config
        - /path/to/test2.config

运行剧本会在第一次运行时更改文件,并在随后的运行中报告正常(不再进行任何更改)。这是模块修改过的文件。

test.config

# PasswordAuthentication no
# PermitRootLogin no
somevalue no
# PasswordAuthentication no
# PermitRootLogin no
othervalue yes
PasswordAuthentication no
# PermitRootLogin no

test2.config

value none
othervalue no
yetanother yes
PasswordAuthentication no