Ansible:维护 sudoer 列表的最佳实践

Posted

技术标签:

【中文标题】Ansible:维护 sudoer 列表的最佳实践【英文标题】:Ansible: best practice for maintaining list of sudoers 【发布时间】:2016-01-26 08:36:08 【问题描述】:

documentation中有一个使用lineinfile模块编辑/etc/sudoers的例子。

- lineinfile: "dest=/etc/sudoers state=present regexp='^%wheel' line='%wheel ALL=(ALL) NOPASSWD: ALL'"

感觉有点骇人听闻。

我认为user 模块中有一些东西可以处理这个问题,但似乎没有任何选项。

/etc/sudoers 添加和删除用户的最佳做法是什么?

【问题讨论】:

【参考方案1】:

如果可能的话,我更喜欢使用/etc/sudoers.d/ (这风险更小,更模块化和自我描述),所以这种方法看起来像:

$ cat files/*
%admins ALL=(ALL) NOPASSWD: ALL

$ cat tasks/*
- name: sudoers | Create sudoers.d files
  copy:
    src: ./
    dest: /etc/sudoers.d
    owner: root
    group: root
    mode: ug+rwX,o=
    force: yes

使用visudo -cf file_name 预先检查文件。

【讨论】:

您缺少src: 中的文件名。此外,force: yes 是多余的,因为这是默认设置。也许更明确地说明目标是有意义的,因为如果 /etc/sudoers.d 不存在,这会将其创建为文件... 感谢您的来信!实际上,我正在考虑以下内容:文件名没有丢失,语法表示目录的所有内容; force 用于模块动作细节强调,可以省略;如果dest: 是不存在的路径并且src: 是目录(即)dest: 创建路径(目录,而不是文件)。 好的,./ 看起来像是一个疏忽。在您的文件目录中有一个子目录 - 这样您就可以使用 - 比如说 - src: sudoers.d - 可以说会使这种模式更加明显。【参考方案2】:

该行实际上并未将用户添加到 sudoers,只是确保 wheel 组可以对所有命令使用无密码 sudo。

至于将用户添加到/etc/sudoers,最好将用户添加到必要的组,然后为这些组提供对 sudo 的相关访问权限。当您不使用 Ansible 时也是如此。

user module 允许您指定组的独占列表,或简单地将指定的组附加到用户已经拥有的当前组。这自然是幂等的,因为不能将用户多次定义为组中。

一个示例游戏可能如下所示:

- hosts: all
  vars:
    sudoers:
      - user1
      - user2
      - user3
  tasks:
    - name: Make sure we have a 'wheel' group
      group:
        name: wheel
        state: present

    - name: Allow 'wheel' group to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: visudo -cf %s

    - name: Add sudoers users to wheel group
      user:
        name: " item "
        groups: wheel
        append: yes
      with_items: " sudoers "

【讨论】:

validate: visudo -cf %s 作为lineinfile 任务的一个属性将确保您不会搞砸,首先通过验证命令运行它。 请注意validate 命令可能需要visudo 的完整路径才能工作。 这种方法的问题是你必须 a) 确保你已经有轮组并且已经在 sudoers 中启用,并且 b) 确保你想把用户放到***中组,而不是其他人。如果您希望用户成为 NOPASSWD,但限制他们的命令怎么办?当您需要在末尾插入一行但 not 时,lineinfile 模块会变得更加棘手。 (因为在末尾插入它会破坏 #includedir 语句,该语句必须在最后一行。) 顺便说一句。如果您想知道,validate 中的%s 是什么意思,它是应该修改的文件的目标(dest)或路径。这是documentation。 很好的答案。稍微不同的方法是使用copy 模块而不是lineinfile 模块将sudoers 文件从控制节点复制到每个受管节点。使用 copy 与 lineinfile 模块各有利弊。我倾向于喜欢复制模块在控制节点上有一个单一的标准化文件,以确保每个受管节点使用相同的确切文件。但是,当然,使用复制也有可能的缺点。这里只是思考的食物。

以上是关于Ansible:维护 sudoer 列表的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Ansible — 示例与最佳实践

Char05 Ansible 最佳实践

《Ansible自动化运维:技术与最佳实践》图书已上架,欢迎大家阅读

Ansible Roles和最佳实践

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信