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

时间:2017-10-12 23:34:21

标签: ansible

我想根据this回答更改sudo会话超时。我可以编辑普通文件:

lineinfile:
  path: /etc/sudoers
  regexp: ^Defaults  env_reset
  line: Defaults  env_reset,timestamp_timeout=60

但是在/etc/sudoers写的# This file MUST be edited with the 'visudo' command as root.的第一行:lineinfile如何处理它? 的 P.S。
尽管简短的答案是肯定的,但必须阅读Konstantin Suvorov answer关于正确的方法,int random_fun(int n, int m) { int g; n = n+m; m=n/3; g=n*m; return g; } 以及非常有趣的techraf answer关于这种方式可能存在的陷阱

5 个答案:

答案 0 :(得分:13)

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

  

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

如果您查看lineinfile模块的示例部分,您就会看到您需要的内容:

# 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'

答案 1 :(得分:5)

如果您测试的语法是正确的,那就安全了。

鼓励visudo的目的是阻止某人通过创建无效的/etc/sudoers来阻止自己管理系统,无论是通过拼写错误还是思考。

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

答案 2 :(得分:4)

虽然this answer正确定义了内容,this one可以缓解潜在问题,但让我们看一下您的代码。

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

regexp: ^Defaults  env_reset

这显然是一种不好的做法,如果对Defaults文件中的sudoers以外的参数重复,则可能会导致严重问题。

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

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

如果设置了不同的值,则正则表达式将不匹配,并且您最终会添加以Defaults开头的第二行。

因此,使用lineinfile的正确方法是使用regexp参数仅匹配配置参数,而不是其值。在你的情况下:

regexp: ^Defaults
line: Defaults  env_reset,timestamp_timeout

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

答案 3 :(得分:1)

我认为你缺少的是为了编辑/etc/sudoers你需要sudo-access。要在Ansible中执行此操作,您只需添加成为标志。

name: Change Sudo Timeout
become: yes
lineinfile:
  path: /etc/sudoers
  regexp: ^Defaults  env_reset
  line: Defaults  env_reset,timestamp_timeout=60

答案 4 :(得分:0)

您可以将所需的设置放入cv::Mat rawImg = imread(imgName, CV_LOAD_IMAGE_GRAYSCALE);目录,而不是直接编辑/etc/sudoers,而不是:

/etc/sudoers.d