Turgon37.sudoers
Ansible 角色 Sudo/Sudoers
描述
:grey_exclamation: 在使用此角色之前,请了解我所有的 Ansible 角色都是完全根据我的 IT 基础设施编写和调整的。因此,即使它们尽可能通用,也不一定能满足您的需求。我建议您仔细分析它们的功能,并评估它们是否能够安全地安装在您的服务器上。
此角色用于配置 sudo。
要求
需要 Ansible >= 2.4。
依赖关系
操作系统系列
此角色适用于 Debian 和 CentOS。
特性
目前此角色可以用于:
- 安装 sudo
- 配置默认值和命令规则
- 提供伪 "类型" 以允许其他角色包含 sudo 规则
- 本地事实
配置
角色
所有可以被覆盖的变量存储在 defaults/main.yml 文件中,以下表格也包含这些变量。请参阅该文件以查看默认值。
名称 | 类型/值 | 描述 |
---|---|---|
sudoers__sss |
布尔值 | 安装使用 sss 后端所需的包 |
sudoers__defaults_(global/group/host) |
字典/字符串列表 | 在角色级别声明 sudoers 的默认设置 |
sudoers__purge |
布尔值 | 如果为真,则所有未由此角色直接处理的 sudo 规则将被删除 |
sudoers__ansible_managed_key |
字符串 | 用于标识哪些 sudo 规则由 ansible 管理的字符串 |
sudoers__rules_(global/group/host) |
规则的字典(见下) | 在角色级别应用的 sudoers 规则 |
Sudo 规则
此角色提供一个伪 "类型",您可以从另一个角色中使用该类型。这允许另一个角色声明一组超出该 sudoers 角色范围的 sudo 规则,并在 playbook 中应用后生效。
要使用它,只需声明任务,如下所示:
- name: 为 ROLE 配置 sudoers 规则
include_role:
name: sudoers
tasks_from: types/sudo_rule
vars:
sudoers__sudo_rule: {}
整个规则配置项必须放在 sudoers__sudo_rule
变量下。
名称 | 类型/值 | 描述 |
---|---|---|
name |
字符串 | 规则文件的名称(不得包含空格) |
state |
枚举 absent/present | 规则的状态,如果需要则移除 |
defaults |
默认值列表(见下) | 在此规则中应用的 sudoers 'defaults' 指令列表。请注意,这些将在整个 sudo 运行时配置中有效,而不仅仅在此规则中 |
users |
字符串列表 | 此规则将应用于的用户列表 |
hosts |
字符串列表 | 此规则应用的主机的可选列表,默认为 ALL |
commands |
命令列表(见下) | 命令定义的列表 |
comment |
字符串 | 文件中包含的可选注释 |
"defaults" 指令
因为 sudo "defaults" 指令可以接受可选值,ansible 支持每个 defaults 指令的两种形式:
Defaults always_set_home
Defaults listpw = always
- 一个简单的字符串
- 一个映射
字符串版本使用起来最简单,因为该字符串将直接放在 sudo 关键字 Defaults 之后。
映射版允许更细致的设置。首先,要注意 sudo Defaults 指令支持主机、用户、命令和 runas 过滤。但您只能为一个默认指令选择一个过滤条件。因此,如果您设置了多个过滤键,此 ansible 角色将使用前面的键顺序作为优先顺序。
如果指令需要值,您必须将指令名称设为映射的键,并将其值与该键的值关联。
否则,如果指令只需要它的名称(例如 requiretty),您必须(这是一个限制)将静态词 "defaults" 作为键,指令名称作为值。
例如,要将 "requiretty" 应用到 user1 用户,请设置以下变量:
sudoers__sudo_rule:
name: rule1
defaults:
- defaults: requiretty
user: user1
要应用 "listpw",请设置:
sudoers__sudo_rule:
name: rule1
defaults:
- listpw: always
user: user1
总结一下,以下字典键可在 defaults 规范中使用:
名称 | 用法 |
---|---|
defaults: NAME |
对于无值指令 |
NAME: VALUE |
对于有值指令 |
host: HOST |
用于限制 Defaults 影响指定主机 |
user: USER |
用于限制 Defaults 影响指定用户 |
command: COMMAND |
用于限制 Defaults 影响指定命令 |
runas: RUNAS_USER |
用于限制 Defaults 影响指定的 runas 用户 |
"commands" 指令
在 commands 键下的每个命令允许用户以有或没有限制的方式运行系统命令。
命令块允许以下键
名称 | 类型/值 | 用法 |
---|---|---|
commands: |
字符串或字符串列表 | 命令模式,参见 man 5 sudoers 了解语法规范 |
run_as_user: |
字符串或字符串列表 | 这些命令(上一行)仅能由这些用户运行 |
run_as_group: |
字符串或字符串列表 | 这些命令(上一行)仅能由这些组运行 |
tags |
字符串或字符串列表 | 应用在该命令上的标签或标签列表 |
例如,允许用户 "user1" 作为 root 用户在任何地方运行 ls,而不需要输入密码:
sudoers__sudo_rule:
name: rule1
commands:
- commands: /bin/ls
run_as_user: user1
run_as_group: root
tags: NOPASSWD
事实
默认情况下,已安装本地事实并公开以下变量:
ansible_local.sudoers.version_full
ansible_local.sudoers.version_major
示例
Playbook
在 playbook 中使用如下:
- hosts: all
roles:
- turgon37.sudoers
清单
- 声明默认设置
sudoers__defaults_global:
- always_set_home
- insults
- listpw: always
- mailsub: "[PRODUCTION][%h][SUDO SECURITY]"
- mailto: [email protected]
- mail_no_user
- mail_no_perms
- mail_no_host
- mail_badpass
- passprompt_override
- pwfeedback
- secure_path: /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
- '!visiblepw'
- 与 sssd 一起使用
# 需要 sudo 从 LDAP 检索规则
sudoers__sss: true
- 从另一个角色声明 sudo 规则
- name: 为 ROLE 配置 sudoers 规则
include_role:
name: sudoers
tasks_from: types/sudo_rule
vars:
sudoers__sudo_rule:
name: role__autogenerated_rule_10
remove_using_regexp:
- role__autogenerated_rule_0[0-9]+
force_remove_using_regexp: true
users: '{{ role__user }}'
hosts: ALL
comment: 为角色自动生成的规则
commands:
- commands: /bin/ls
run_as_user: '{{ role__another_user }}'
run_as_group: root
tags: NOPASSWD
- commands: /bin/cat /home/[a-zA-Z]*/.ssh/config
run_as_user: ALL
run_as_group: root
defaults:
- defaults: '!requiretty'
user: '{{ role__user }}'
state: present