使用Ansible"lineinfile"模块编辑/ etc/sudoers是否安全?

El *_*uso 10 ansible

我想根据这个答案更改sudo会话超时.我可以编辑普通文件:

lineinfile:
  path: /etc/sudoers
  regexp: ^Defaults  env_reset
  line: Defaults  env_reset,timestamp_timeout=60
Run Code Online (Sandbox Code Playgroud)

但在我/etc/sudoers写的第一行:# This file MUST be edited with the 'visudo' command as root.如何处理它?
PS
虽然简短的答案是肯定的,但必须阅读康斯坦丁·苏沃罗夫关于正确方法的回答,lineinfile以及非常有趣的技术回答关于这种方式可能存在的陷阱

Kon*_*rov 20

这种情况有一个safenet选项:validate.

要在复制到位之前运行的验证命令.要验证的文件的路径是通过'%s'传递的,必须存在,如下例所示.该命令安全地传递,因此扩展和管道等shell功能将无法正常工作.

如果你看一下lineinfile模块的examples部分,你会看到你需要的确切内容:

# Validate the sudoers file before saving
- lineinfile:
    path: /etc/sudoers
    state: present
    regexp: '^%ADMIN ALL='
    line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'
    validate: '/usr/sbin/visudo -cf %s'
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 7

如果您已经测试了正确的语法,那么它是安全的.

令人鼓舞的visudo是,通过创建无效/etc/sudoers,无论是通过拼写错误还是思考,都可以阻止某人将自己锁定在管理系统之外.

当您使用Ansible执行编辑时,您可以测试执行该编辑的代码,以便sudo在您推出之前使用您的实际配置文件,环境和版本做正确的事情.因此,人们对手写拼写错误或语法错误的担忧并不是立即相关的.

  • 我非常感谢“ thinko”。我将开始使用它。 (2认同)

tec*_*raf 5

虽然这个答案正确定义的东西,这一次提供了一个缓解潜在的问题,让我们来看看你的代码。

您要求 Ansible(可能)按以下方式替换定义的行:

regexp: ^Defaults  env_reset
Run Code Online (Sandbox Code Playgroud)

这显然是一个不好的做法,如果重复以外的参数Defaultssudoers的文件,它可能导致一个严重的问题。


通常Defaults是配置参数,env_reset是可能的值之一。

您不能假设实际的配置文件将始终包含^Defaults env_reset字符串。

如果设置了不同的值,则正则表达式将不匹配,您最终会添加以Defaults.


所以正确的使用方法lineinfile是使用regexp参数只匹配配置参数,而不是它的值。在你的情况下:

regexp: ^Defaults
line: Defaults  env_reset,timestamp_timeout
Run Code Online (Sandbox Code Playgroud)

另一个潜在的陷阱是sudoers包含应按正确顺序编写的部分。如果您修改的文件不包含正则表达式指定的行,lineinfile则会在文件末尾添加一个新行,该行可能会被忽略或导致错误(但应通过验证发现),以及如果人们稍后查看文件,很可能会引起混淆。所以指定insertafteror可能是明智的insertbefore