ahuffman.sudoers

Ansible角色

ahuffman.sudoers

控制默认的 /etc/sudoers 文件及包含的文件/目录的配置。


请注意,版本 2.0.0+ 是该角色的重大重写。 如果您来自先前版本,请阅读文档以确保您了解更改,然后再进行安装和使用。


目录

  1. 目录
  2. 提示
  3. 角色变量
  4. sudoers_files 字典字段
    1. sudoers_files.aliases 字典字段
      1. cmnd_alias 字典字段
      2. host_alias 字典字段
      3. runas_alias 字典字段
      4. user_alias 字典字段
    2. user_specifications 字典字段
      1. 标准 user_specifications
      2. 默认覆盖 user_specifications
  5. 从现有配置自动生成 sudoers 文件数据
  6. 示例剧本
    1. RHEL7.6 默认 sudoers 配置
      1. 结果:/etc/sudoers
    2. sudoers 配置(多个文件)
      1. 结果:/etc/sudoers
      2. 结果:/etc/sudoers.d/pingers
      3. 结果:/etc/sudoers.d/root
    3. 将正在运行的 sudoers 配置迁移到另一个主机
  7. 许可证
  8. 作者信息

提示

提示: 这里有一些关于 sudoers 配置的优秀资源:
从这里开始 - 提供了 sudoers 文件配置和术语的基本介绍。
Sudoers 手册 - 如果您想了解所有细节,这里是您需要的。

角色变量

该角色定义的默认值基于默认 RHEL7.6 /etc/sudoers 配置。 请在运行之前检查 defaults/main.yml 中的默认值以确保与操作系统兼容。

变量名 描述 默认值 变量类型
sudoers_rewrite_default_sudoers_file 使用角色默认或用户定义的 sudoers_files 定义,替换系统提供的 /etc/sudoers 文件。 当试图将新配置文件部署到 include_directories 时,尤其有用,而您不希望修改 /etc/sudoers 文件。 true boolean
sudoers_remove_unauthorized_included_files 非常危险!include_directories 字典中找到的每个现有 sudoers 文件,如果未在 sudoers_files 中定义,将被删除。 这允许强制执行所需状态。 false boolean
sudoers_backup 是否创建当前状态的备份 /etc/sudoers 文件以及 sudoers_files 中定义的任何文件。 文件备份到 Ansible 控制节点(运行 Ansible 的服务器)中,从而避免意外遗留可能被 sudoers 配置评估的文件。 true boolean
sudoers_backup_path 相对于您执行剧本的位置,备份已定义的 sudoers_files 的远程副本的路径。 "sudoers_backups" string
sudoers_backup_become 是否在创建本地 sudoers 备份目录和 sudoers 文件备份时使用 sudo。 true boolean
sudoers_visudo_path 用于验证 sudoers 配置更改所需的 visudo 二进制文件的完全限定路径。 为操作系统兼容性而添加。 "/usr/sbin/visudo" string
sudoers_files 您的所有 sudoers 配置的定义 defaults/main.yml 字典列表

sudoers_files 字典字段

变量名 描述 变量类型
path 将配置文件部署到文件系统的路径。 string
aliases 可选的 cmnd_aliashost_aliasrunas_aliasuser_alias 项的定义。 dictionary
defaults 允许您定义 sudoers 配置的默认值。 可以通过 user_specifications 键执行默认覆盖。 list
include_files 可选的特定文件,您希望配置包含。 这是一个通过 sudoers 配置的 #include 选项包含的完全限定路径列表。 list
include_directories 可选的特定目录,您希望配置包含。 这是一个通过 sudoers 配置的 #includedir 选项包含的完全限定路径列表。 list
user_specifications 必须应用于 sudoers 文件配置的用户指定列表和默认覆盖。 list

sudoers_files.aliases 字典字段

变量名 描述 变量类型
cmnd_alias 命令别名定义的列表。 字典列表
host_alias 主机别名定义的列表 字典列表
runas_alias runas 别名定义的列表 字典列表
user_alias 用户别名定义的列表 字典列表

cmnd_alias 字典字段

变量名 描述 变量类型
name 命令别名的名称。 string
commands 应用于别名的命令列表 list

host_alias 字典字段

变量名 描述 变量类型
name 主机别名的名称。 string
hosts 应用于别名的主机列表 list

runas_alias 字典字段

变量名 描述 变量类型
name runas 别名的名称 string
users 应用于别名的用户列表 list

user_alias 字典字段

变量名 描述 变量类型
name user_alias 的名称 string
users 应用于别名的用户列表 list

user_specifications 字典字段

该字典可用于分配用户规范或默认覆盖。

标准 user_specifications

变量名 描述 变量类型
users 应用规范的用户列表。 您可以使用 user_alias 名称以及用户名。 list
hosts 应用规范的主机列表。 您可以使用已定义的 host_alias 名称以及主机名。 list
operators 应用规范的操作员列表。 您可以使用已定义的 runas_alias 名称以及用户名。 list
selinux_role 可选的 selinux 角色以应用于规范 list
selinux_type 可选的 selinux 类型以应用于规范 list
solaris_privs 可选的 Solaris 权限集以应用于规范 list
solaris_limitprivs 可选的 Solaris 限制权限集以应用于规范 list
tags 可选的标签列表以应用于规范。 list
commands 应用规范的命令列表。 您可以使用已定义的 cmnd_alias 名称以及命令。 list

默认覆盖 user_specifications

变量名 描述 变量类型
defaults 从主配置中覆盖的默认列表 list
type 要覆盖的默认类型,这会影响配置中的操作符(主机 -> @,用户 -> :,命令 -> !,和 runas -> >)。 type 字段可以是以下值之一:commandhostrunasuser string
commands type: "command" 时使用。 要覆盖特定默认值的 cmnd_alias 名称以及命令列表。 list
hosts type: "host" 时使用。 要覆盖特定默认值的 host_alias 名称以及各个主机名列表。 list
operators type: "runas" 时使用。 要覆盖特定默认值的 runas_alias 名称以及各个用户名列表。 list
users type: "user" 时使用。 要覆盖特定默认值的 user_alias 名称以及各个用户名列表。 list

从现有配置自动生成 sudoers 文件数据

觉得从文档中配置这些东西太复杂了吗? 请查看并尝试 ahuffman.scan_sudoers,找到一个能够为您自动生成正确数据结构的角色。 使用 ahuffman.scan_sudoers 角色,您可以在一个剧本中获取正在运行的配置,在另一个剧本中应用它,并使用 ahuffman.sudoers 角色(版本 2.0.0+)。 您也可以选择将收集到的数据推送到如 CMDB 或存储库等可信来源。 由 ahuffman.scan_sudoers 生成的数据可被 ahuffman.sudoers 使用,格式为 {{ ansible_facts['sudoers'].sudoers_files }}

这应该有助于减轻手动定义 sudoers 配置作为代码的复杂性,并让您更快上手。

请查看下面的 Playbook 示例

示例剧本

RHEL7.6 默认 sudoers 配置

- name: "应用 RHEL7.6 默认 /etc/sudoers 配置"
  hosts: "all"
  roles:
    - role: "ahuffman.sudoers"

... 或使用现代语法:

- name: "应用 RHEL7.6 默认 /etc/sudoers 配置"
  hosts: "all"
  tasks:
    - name: "配置 /etc/sudoers"
      include_role:
        name: "ahuffman.sudoers"

结果:/etc/sudoers

使用角色默认值的上述两个示例将生成如下的 /etc/sudoers 配置文件:

# Ansible 管理

# 默认规范
Defaults    !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR"
Defaults    env_keep += "LS_COLORS MAIL PS1 PS2 QTDIR"
Defaults    env_keep += "USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE"
Defaults    env_keep += "LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME"
Defaults    env_keep += "LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL"
Defaults    env_keep += "LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

# 用户规范
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL

# 包含
## 包含目录
#includedir /etc/sudoers.d

sudoers 配置(多个文件)

- name: "应用多文件 sudoers 配置"
  hosts: "all"
  tasks:
    - name: "配置 /etc/sudoers 和包含文件"
      include_role:
        name: "ahuffman.sudoers"
      vars:
        sudoers_rewrite_default_sudoers_file: true
        sudoers_remove_unauthorized_included_files: true
        sudoers_backup: true
        sudoers_backup_path: "sudoers-backups"
        sudoers_files:
          - path: "/etc/sudoers"
            defaults:
              - "!visiblepw"
              - "always_set_home"
              - "match_group_by_gid"
              - "always_query_group_plugin" # 维护 sudo 1.8.15 之前的组行为
              - "env_reset"
              - secure_path:
                  - "/sbin"
                  - "/bin"
                  - "/usr/sbin"
                  - "/usr/bin"
              - env_keep:
                  - "COLORS"
                  - "DISPLAY"
                  - "HOSTNAME"
                  - "HISTSIZE"
                  - "KDEDIR"
                  - "LS_COLORS"
                  - "MAIL"
                  - "PS1"
                  - "PS2"
                  - "QTDIR"
                  - "USERNAME"
                  - "LANG"
                  - "LC_ADDRESS"
                  - "LC_CTYPE"
                  - "LC_COLLATE"
                  - "LC_IDENTIFICATION"
                  - "LC_MEASUREMENT"
                  - "LC_MESSAGES"
                  - "LC_MONETARY"
                  - "LC_NAME"
                  - "LC_NUMERIC"
                  - "LC_PAPER"
                  - "LC_TELEPHONE"
                  - "LC_TIME"
                  - "LC_ALL"
                  - "LANGUAGE"
                  - "LINGUAS"
                  - "_XKB_CHARSET"
                  - "XAUTHORITY"
            user_specifications:
              - users:
                  - "root"
                hosts:
                  - "ALL"
                operators:
                  - "ALL"
                commands:
                  - "ALL"
              - users:
                  - "%wheel"
                hosts:
                  - "ALL"
                operators:
                  - "ALL"
                commands:
                  - "ALL"
            include_directories:
              - "/etc/sudoers.d"
            aliases:
              cmnd_alias:
                - name: "PING"
                  commands:
                    - "/bin/ping"
              user_alias:
                - name: "PINGERS"
                  users:
                    - "ahuffman"
          - path: "/etc/sudoers.d/pingers"
            user_specifications:
              - type: "user"
                defaults:
                  - "!requiretty"
                users:
                  - "PINGERS"
          - path: "/etc/sudoers.d/root"
            defaults:
              - "syslog=auth"
            user_specifications:
              - type: "runas"
                defaults:
                  - "!set_logname"
                operators:
                  - "root"

上述示例将生成以下配置文件:

结果:/etc/sudoers

# Ansible 管理

# 默认规范
Defaults    !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR"
Defaults    env_keep += "LS_COLORS MAIL PS1 PS2 QTDIR"
Defaults    env_keep += "USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE"
Defaults    env_keep += "LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME"
Defaults    env_keep += "LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL"
Defaults    env_keep += "LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

# 别名规范
## 命令别名
Cmnd_Alias    PING = /bin/ping

## 用户别名
User_Alias    PINGERS = ahuffman

# 用户规范
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL

# 包含
## 包含目录
#includedir /etc/sudoers.d

结果:/etc/sudoers.d/pingers

# Ansible 管理

# 默认覆盖规范
Defaults:PINGERS !requiretty

结果:/etc/sudoers.d/root

# Ansible 管理

# 默认规范
Defaults    syslog=auth

# 默认覆盖规范
Defaults>root !set_logname

将正在运行的 sudoers 配置迁移到另一个主机

---
- name: "收集现有的 sudoers 事实"
  hosts: "source-host"
  tasks:
    - name: "收集正在运行的 sudoers 配置"
      include_role:
        name: "ahuffman.scan_sudoers"

    - name: "设置收集到的 sudoers 事实"
      set_fact:
        sudoers_files: "{{ ansible_facts['sudoers'].sudoers_files }}"

    - name: "显示收集到的 sudoers 配置事实"
      debug:
        var: "sudoers_files"
        verbosity: "1"

- name: "将运行配置部署到目标"
  hosts: "destination-host"
  tasks:
    - include_role:
        name: "ahuffman.sudoers"
      vars:
        sudoers_remove_unauthorized_included_files: true

上述示例提供了一种利用基础设施即代码反向操作的方法,将已知配置转换为结构化数据来驱动未来的自动化。 此外,您还可以将收集到的数据推送到 CMDB 或存储库,以便将来用作可信来源。

许可证

MIT

作者信息

Andrew J. Huffman
Tyler Cross

关于项目

Controls the configuration of the default /etc/sudoers file and included files/directories

安装
ansible-galaxy install ahuffman.sudoers
许可证
mit
下载
34.8k