sudoers
Ansible Роль Sudo/Sudoers
Описание
:grey_exclamation: Перед использованием этой роли, пожалуйста, учтите, что все мои роли Ansible полностью написаны и настроены для моей ИТ-инфраструктуры. Поэтому, даже если они максимально универсальны, они не обязательно удовлетворят ваши потребности. Я советую внимательно проанализировать, что они делают, и оценить их способность быть установлены безопасно на ваших серверах.
Эта роль настраивает sudo.
Требования
Требуется Ansible >= 2.4
Зависимости
Семейство ОС
Эта роль доступна для Debian и CentOS.
Возможности
На данный момент роль может использоваться для:
- установки sudo
- настройки значений по умолчанию и правил команд
- предоставления псевдотипа, чтобы другие роли могли включать правила sudo
- локальных фактов
Настройка
Роль
Все переменные, которые можно переопределить, хранятся в файле defaults/main.yml, а также в таблице ниже. Чтобы увидеть значения по умолчанию, обратитесь к этому файлу.
Название | Типы/Значения | Описание |
---|---|---|
sudoers__sss |
Логическое значение | Устанавливает пакеты, необходимые для использования sudo с бэкендом sss |
sudoers__defaults_(global/group/host) |
Список словарей/строк | Объявляет настройки по умолчанию для sudoers на уровне роли |
sudoers__purge |
Логическое значение | Если true, все правила sudo, не управляемые напрямую этой ролью, будут удалены |
sudoers__ansible_managed_key |
Строка | Строка, используемая для определения, какие правила sudo управляются ansible |
sudoers__rules_(global/group/host) |
Словарь правил (см. ниже) | Правила sudoers, которые необходимо применить на уровне роли |
Правило Sudo
Эта роль предоставляет псевдотип, который вы можете использовать из другой роли. Это позволяет другой роли объявить набор правил sudo вне области действия этой роли sudoers и после их применения в плейбуке.
Чтобы использовать это, просто объявите задачу следующим образом:
- name: Настройка правила sudoers для РОЛИ
include_role:
name: sudoers
tasks_from: types/sudo_rule
vars:
sudoers__sudo_rule: {}
Все элементы конфигурации правила должны находиться под переменной с именем sudoers__sudo_rule
.
Название | Типы/Значения | Описание |
---|---|---|
name |
Строка | Имя файла правила (не должно содержать пробелов) |
state |
Enum absent/present | Состояние правила для удаления при необходимости |
defaults |
Список настроек (см. ниже) | Список команд 'default' для применения в этом правиле. Обратите внимание, что они будут действовать на всю конфигурацию sudo, а не только на это правило |
users |
Список строк | Список пользователей, для которых будет применяться это правило |
hosts |
Список строк | Необязательный список хостов, на которых будет применяться это правило, по умолчанию - ВСЕ |
commands |
Список команд (см. ниже) | Список определений команд |
comment |
Строка | Необязательный комментарий для включения в файл |
Директива "defaults"
Поскольку директива "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 на указанного пользователя для запуска |
Директива "commands"
Каждая команда под ключом commands позволяет пользователю выполнять системную команду с ограничениями или без них.
Блок команды допускает следующие ключи:
Название | Типы/Значения | Использование |
---|---|---|
commands: |
Строка или список строк | Шаблоны команд, см. man 5 sudoers для спецификации синтаксиса |
run_as_user: |
Строка или список строк | Эти команды (строка выше) должны выполняться только данным пользователем(ями) |
run_as_group: |
Строка или список строк | Эти команды (строка выше) должны выполняться только данной группой(ами) |
tags |
Строка или список строк | Тег или список тегов, которые следует применить к этой команде |
Например, чтобы разрешить пользователю "user1" выполнять 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
Пример
Плейбук
Используйте его в плейбуке следующим образом:
- 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: Настройка правила 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
ansible-galaxy install Turgon37/ansible-sudoers