ahuffman.sudoers
ahuffman.sudoers
控制默认的 /etc/sudoers
文件及包含的文件/目录的配置。
请注意,版本 2.0.0+ 是该角色的重大重写。 如果您来自先前版本,请阅读文档以确保您了解更改,然后再进行安装和使用。
目录
提示
提示: 这里有一些关于 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_alias 、host_alias 、runas_alias 或 user_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 字段可以是以下值之一:command 、host 、runas 或 user 。 |
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 或存储库,以便将来用作可信来源。