Последнее изменение файла: 2017.10.17
Скопировано с www.bog.pp.ru: 2023.06.02
Bog BOS: sudo: выполнение программ от чужого имени
Пакет sudo позволяет системному администратору давать права определенным пользователям
(или группам) на исполнение конкретных программ с правами другого пользователя
(и записывать эти действия в журнал). Возможна привязка списка допустимых команд к имени хоста,
что позволяет использовать один файл настройки на нескольких хостах
с различными полномочиями.
Обычно требует аутентификации пользователя (например, ввода пароля).
Позволяет избегать слишком частого ввода пароля (по умолчанию - 5 минут).
Для борьбы с подменой динамических библиотек
из окружения удаляются переменные типа LD_* и т.п., а также IFS, ENV, BASH_ENV,
KRB_CONF, KRB5_CONFIG, LOCALDOMAIN, RES_OPTIONS, HOSTALIASES. Можно также
удалять текущую директорию из PATH.
Поддержка LDAP (/etc/sudo-ldap.conf, sudo-ldap.conf(5), sudoers.ldap(5)) и /etc/nsswitch.conf ("sudoers: ldap files").
Текущая версия 1.8.21 (сентябрь 2017, RHEL5 - 1.7.2p1, RHEL6 - 1.8.6p3, RHEL7 - 1.8.6p7 и 1.8.19p2;
делавшая ветку 1.8 команда выкинула работы 1.7.5-1.7.10).
Утилита visudo позволяет осуществить безопасное редактирование /etc/sudoers,
она осуществляет блокировку от одновременных изменений и проверяет файл на корректность после выхода из текстового редактора.
По умолчанию используется /bin/vi, можно изменить установить в переменной editor или разрешить (не советую)
использование переменных окружения VISUAL и EDITOR в переменной env_editor.
Не обрабатывает файлы из #includir.
Ключи:
--check [--quiet] (только проверить существующий файл без вызова редактора)
--file имя-файла (указать другой файл вместо /etc/sudoers)
--strict (более строгая проверка)
--help
--version
--export имя-файла (вывести sudoers в формате JSON, "-" - stdout)
В файле /etc/sudoers описываются права пользователей (real uid, не euid) на выполнение команд с помощью sudo.
Состоит из операторов трех типов: определение синонимов (Alias), переопределение
конфигурационных параметров и описание прав пользователей.
Если для одного пользователя подходит несколько описаний, то действует последнее.
Можно использовать шаблоны в стиле shell (glob(3) и fnmatch(3)) для имён хостов, путей файлов и аргументов команд (опасно),
обработка классов символов появилась в 1.7.
Комментарии начинаются с символа '#', если это не uid и не команды #include/#includedir.
Команды #include и #includedir (например, /etc/sudoers.d, файлы обрабатываются в лексикографическом порядке,
не обрабатываются файлы с "~" и "." в конце имени) позволяет включить содержимое указанного файла или каталога
(не более 128 уровней вложенности), макрос '%h' расширяется в короткое имя хоста.
Продолжение команды на следующей строке обозначается символом '\' в конце строки.
Восклицательный знак перед именем означаниет исключение из предыдущего списка (не отрицание!).
Синонимы:
User_Alias имя = список-пользователей-через-запятую [:...]
Runas_Alias имя = список-эффективных-пользователей-через-запятую [:...]
Host_Alias имя = список-хостов-через-запятую [:...]
Cmnd_Alias имя = список-команд-через-запятую [:...]
Имя может состоять из прописных латинских букв, цифр и подчеркивания.
Предопределены синонимы 'ALL' для каждого типа. netgroup - это NIS.
Имена можно заключать в кавычки, специальные символы могут быть представлены в виде \x20 (пробел).
Пользователь может определяться:
имя
#uid
%имя-группы
%#gid
+netgroup
User_Alias
Эффективный пользователь может определяться:
имя
#uid
%имя-группы
%#gid
+netgroup
Runas_Alias
Хост может определяться (восклицательный знак перед
именем означает отрицание; сетевая маска записывается в точечной записи или CIDR (число бит);
при указании имени хоста можно использовать шаблоны в стиле shell, но лучше при
этом использовать опцию fqdn; не стоит использовать имя localhost):
имя-хоста
IP-адрес
network/netmask
+netgroup
Host_Alias
Команда может определяться
(восклицательный знак перед именем означает отрицание (вычитать опасные команды из ALL - плохая идея);
можно использовать шаблоны в стиле shell для имени файла и аргументов
(в 1.7 появились классы POSIX);
необходимо защищать обратным слешом от интерпретации разборщика
символы запятой, двоеточия, равенства и обратного слеша;
пустой список аргументов обозначается как "";
полное имя каталога должно оканчиваться на "/", разрешает выполнить
любую команду из данного каталога, но не из подкаталога):
Конфигурационные параметры можно переопределить для всех
пользователей, для определенных пользователей, для определенных хостов,
для выполняемых от имени указанного пользователя, для команд (указаны в порядке приоритета разбора,
используется последний подходящий):
Defaults!список-команд # с версии 1.7, здесь нельзя указать аргументы
Параметр задаётся в виде "имя = значение", "имя += значение",
"имя -= значение", "имя" или "!имя" (необходимо использовать
символы '"' и '\' в значениях при необходимости; += и -= добавляют и удаляют
элементы списка):
флаги
always_query_group_plugin (off; дополнение group_plugin будет использоваться не только для '%:имя-группы', но и для '%имя-группы')
always_set_home (off; всегда устанавливать HOME)
authenticate (on; пользователь должен вводить свой пароль)
closefrom_override (off; возможность использовать -C)
compress_io (on; сжимать журнал ввода/вывода)
exec_background (off)
env_editor (off в старых версиях или on в новых; visudo будет использовать переменную окружения VISUAL или EDITOR;
очень не рекомендуется или заполняйте editor)
fast_glob (off; использовать fnmatch(3) вместо glob(3) при поиске файлов,
быстро, но опасно - не распознаёт выражения в командной строке вида "../bin/ls")
fqdn (off; помещать в журнал и sudoers полное доменное имя хоста с использованием запросов DNS вместо простого `hostname`;
появляется зависимость от работоспосбности DNS)
ignore_audit_errors (on)
ignore_dot (off в старых версиях и on в новых; игнорировать "." и "" в $PATH)
ignore_iolog_errors (off)
ignore_logfile_errors (on)
ignore_local_sudoers (off; не заглядывать в /etc/sudoers при использовании LDAP)
ignore_unknown_defaults (off)
insults (off; напугать пользователя, который ввёл неправильный пароль)
log_host (off; записывать имя хоста в файл журнала)
log_input (off; выполнять команду в псевдотерминале и записывать ввод пользователя в журнал ввода/вывода, stdin в отдельный журнал)
log_output (off; выполнять команду в псевдотерминале и записывать вывод в журнал ввода/вывода)
log_year (off; записывать в файл год в четырёхзначном формате
long_otp_prompt (off; запрос для OTP в 2 строки)
mail_all_cmnds (off; извещать по email при каждом вызове sudo, кроме -l и -v)
mail_always (off; посылать письмо при каждом выполнении sudo)
mail_badpass (off; посылать письмо при вводе неправильного пароля)
mail_no_host (off; посылать письмо, если у пользователя нет прав на данном хосте)
mail_no_perms off; посылать письмо, если у пользователя нет прав на данную команду)
mail_no_user (on; посылать письмо, если пользователя нет в sudoers)
match_group_by_gid (off; сравнивать группы не по именам, а по идентификаторам)
netgroup_tuple (off; )
noexec (off; попытка запретить запускать программу из команды махинациями с LD_PRELOAD для exec(), сомнительнно,
не помогает против статически собранных и эмулированных программ)
pam_session (on; отдельную PAM сессию на каждую команду)
pam_setcred (on; )
passprompt_override (off; всегда использовать passprompt для запроса пароля)
path_info (off в старых версиях и on в новых; уточнять причину отказа выполнения команды - не найдена в PATH)
preserve_groups (off; не менять список групп при выполнении команды)
pwfeedback (off, выводить звёздочки при вводе пароля)
requiretty (off; выполнять команду только при запуске с реального tty, не из cron или скрипта)
root_sudo (on; очень рекомендуется запретить использование sudo для root)
rootpw (off; запрашивать пароль root вместо пароля пользователя)
runaspw (off; запрашивать пароль указанного в runas_default пользователя вместо пароля текущего пользователя)
set_home (off; установливать переменную окружения HOME для -s)
set_logname (on; установливать переменныю окружения LOGNAME, USER и USERNAME)
set_utmp (on; созжавать запись в utmp/utmpx при выделении псевдотермигала (log_input, log_output, use_pty))
setenv (off; разрешить использовать -E, отключить обработку env_check, env_delete, env_keep)
shell_noargs (off; разрешать запуск sudo без параметров - выход в shell)
stay_setuid (off; при запуске комманды не менять реальный uid)
sudoedit_checkdir (on; отказываться проходить по символьным ссылкам и редактировать файлы в каталогах,
в которых исходный пользователь имеет право на запись)
sudoedit_follow (off; не отказываться проходить по символьным ссылкам)
timestamp_timeout (5 минут; интервал действия пароля; 0 - это 0; отрицательное число - до перезагрузки)
umask (0022; umask для выполняемой команды образуется как объединение текущей umask и указанной; используёте 0777 чтобы umask не изменилась)
строки
badpass_message ("Sorry, try again"; сообщение при вводе неправльного пароля)
editor (/bin/vi; список используемых visudo редакторов через ":")
iolog_dir (/var/log/sudo-io; каталог для хранения журналов ввода/вывода;
журналы ввода/вывода каждой сессии записываются в отдельный каталог, содержащий следующие файлы:
log (основные данные о выполнившейся команде), timing (сколько байт прочитано и записано и с какими промежутками),
ttyin (ввод пользователя с tty, например, пароли), stdin, ttyout (вывод на псевдотерминал), stdout, stderr)
iolog_file ("%{seq}"; имя файла внутри iolog_dir; при конструрировании имени можно использовать макросы:
%{seq} - порядковый номер в base36
%{user}
%{group}
%{runas_user}
%{runas_group}
%{hostname} - простое имя
%{command} - базовая часть имени команды
strftime(3)
iolog_flush (off; не буферизовать вывод в журнал ввода/вывода; это строка?
iolog_group (группа родительского каталога; группа создаваемых журналов и каталогов)
iolog_mode (0600; права доступа для создаваемых журналов; не более 0666; для создаваемых каталогов добавляются необходимые x)
iolog_user (root; владелец создаваемых журналов и каталогов)
lecture_status_dir (/var/db/sudo/lectured; каталог для хранения информации о прочитанных лекциях)
mailsub ("*** SECURITY information for %h ***"; текст темы письма; %h - имя хоста)
noexec_file (удалён в 1.8.1; см. sudo.conf(5))
pam_login_service ("sudo-i"; имя PAM-сервиса для "sudo -i"; см. /etc/pam.d/pam.conf)
pam_service ("sudo"; имя PAM-сервиса для sudo; см. /etc/pam.d/pam.conf)
passprompt ("Password:" в старой версии и "[sudo] password for %p:" в новой версии;
текст предолжения ввести пароль; см. ключ -p и переменную окружения SUDO_PROMPT; можно использовать макросы:
%H - локальное доменное имя хоста
%h - локальное простое имя хоста
%p - имя пользователя, чей пароль запрашивается
%U - имя целевого пользователя
%u - имя исходного пользователя
%%
role (?; SELinux роль)
runas_default (root; имя целевого пользователя по умолчанию)
syslog_badpri (alert; какой уровень серьёзности syslog
(alert, crit, debug, emerg, err, info, notice, warning, none) использовать при неудачах (не прошёл аутентификацию, нет прав);
это строка как флаг?)
syslog_goodpri (notice; какой уровень серьёзности syslog
(alert, crit, debug, emerg, err, info, notice, warning, none) использовать при удачном выполнении команды;
это строка как флаг?)
syslog_maxlen (980; это число?)
sudoers_locale ("C"; локаль для разбора sudoers, посылки email)
timestampdir (/var/run/sudo в старых версиях и /var/run/sudo/ts в новых версиях;
каталог для хранения отметок времени для аутентификации; должна очищаться при перезагрузке)
timestampowner (root; владелец каталогов для хранения информации о прочитанных лекциях и для хранения отметок времени для аутентификации)
type (?; SELinux тип)
строки как флаги
env_file (; полное имя файла, содержащего значения переменных окружения; см. env_keep и env_check)
exempt_group (; пользователи из данной группы не должны вводить пароль и на них не накладывается ограничения secure_path)
group_plugin (; имеются "system_group.so" и "group_file.so имя-файла-в-формате-/etc/group";
путь в /usr/libexec/sudo к обработчику неюниксовых групп пользователей)
lecture (once; закатывать лекцию при первом вызове: never, once, always; раньше это был флаг)
lecture_file (имя файла с текстом альтернативной истории)
listpw (any; запрашивать ли пароль при использовании ключа "-l": all, any, never, always)
logfile (по умолчанию - запись в syslog; имя файла для записи журнала)
mailerflags ("-t"; флаги вызова программы отправки email)
mailerpath (путь к sendmail; имя программы отправки email)
mailfrom (по умолчанию - имя пользователя; имя отправителя email в кавычках)
mailto (root; кому посылать письма; рекомендуется заключать в кавычки)
secure_path (не установлен; насильственно устанавливать PATH)
verifypw (all; запрашивать ли пароль при использовании ключа "-v": all, any, never, always)
списки как флаги
env_check (секция sanity вывода `sudo -V`; список имён переменных окружения с операциями работы со списком: =, +=, -=, !;
указанные переменные окружения удаляются, если содержат '%' или '/' и прочие безобразия)
env_delete (секция remove вывода `sudo -V`; список имён переменных окружения с операциями работы со списком: =, +=, -=, !;
указанные переменные окружения удаляются при выключенном env_reset)
env_keep (секция preserve вывода `sudo -V`; список имён переменных окружения с операциями работы со списком: =, +=, -=, !;
указанные переменные окружения не сбрасываются по env_reset)
Описание прав пользователей (списки через запятую,
теги и имена целевых пользователей наследуются):
список-пользователей список-хостов = список-описаний-команд [: список-хостов = список-описаний-команд ] ...
описание-команды ::= [ (список-целевых-пользователей-u[:список-целевых-пользователей-g]) ]
[ (ROLE=роль-SELinux|TYPE=тип-SELinux) {тег:} команда
Теги:
NOPASSWD (не запрашивать пароль текущего пользователя, см. exempt_group)
PASSWD
NOEXEC (попытка запретить запускать программу из команды махинациями с LD_PRELOAD для exec(), сомнительнно,
не помогает против статически собранных и эмулированных программ)
EXEC
NOFOLLOW (не проходить по символьным ссылкам для sudoedit, sudoedit_follow)
FOLLOW
LOG_INPUT (см. log_input)
NOLOG_INPUT
LOG_OUTPUT (см. log_output)
NOLOG_OUTPUT
MAIL (см. mail_all_cmnds, mail_always, mail_no_perms)
NOMAIL
SETENV (см. setenv, -E, env_check, env_delete, env_keep)
NOSETENV
Устанавливаются переменные окружения: MAIL (-i), HOME (-i, -H, -s и set_home, always_set_home),
LOGNAME, PATH, SUDO_COMMAND, SUDO_GID, SUDO_UID, SUDO_USER, USER, USERNAME.
В некоторых дистрибутивах по умолчанию добавлены непомерные разрешения:
в RHEL7 пользователям из группы wheel разрешено выполнять любые команды.
Нельзя давать права на выполнение программ, которые исходный пользователь может перезаписать
(не поможет даже проверка контрольной суммы).
Команда sudo выполняет указанную в качестве параметра команду
от имени другого пользователя в зависимости от настроек.
Извещение о неавторизованных попытках посылаются по email по адресу, указанному в mailto.
Все использования sudo записываются в syslog и журнал.
При отсутствии команды от имени другого пользователя выполняется редактор (-e, sudoedit)
или командная оболочка (-s) или имитируется начальный вход в систему (-i).
Устанавливается требуемый реальный идентификатор пользователя и группы, euid, egid и список групп.
Перерабатываются переменные окружения (см. "sudo -V"). Запрашивается
пароль текущего пользователя и делается отметка, чтобы не запрашивать следующие timestamp_timeout минут.
Ключи:
-A (запрашивать пароль с помощью программы, SUDO_ASKPASS или "Path askpass ..." в sudo.conf)
-b (выполнить команду в фоновом режиме)
-C дескриптор (обычно перед выполнением закрываются все файлы, кроме stdin (0), stdout (1) и stderr (2);
ключ -C позволяет оставить открытым дескрипторы меньше указанного)
-E (сохранить переменные окружения, д.б. разрешено в настройках)
-e имя-файла (редактировать указанный файл; в настройках должно быть разрешено
выполнять команду sudoedit; редактор выбирается из переменных окружения SUDO_EDITOR, VISUAL и EDITOR или переменной editor;
некоторая борьба с символьными ссылками; используется временный файл)
-g имя-группы|#gid (перед выполнением установить группу)
-H (установить HOME как описано в /etc/passwd для целевого пользователя)
-h (вывести описание команды)
-h имя-хоста
-i [команда] (имитируется начальный вход в систему)
-k [команда] (сбросить кеш авторизации, обнулить допустимое время использования sudo без повторного введения
пароля)
-K (сбросить кеш авторизации, не требует пароля)
-L (показать список возможных параметров с описанием, удалена в 1.8)
-l [-l] [-U имя-пользователя] (показать список разрешенных команд, аргументов и умолчаний)
-n (не интерактивный режим, не запрашивать пароль)
-P (не устанавливать список групп; egid устанавливается)
-p формат (задаёт текст приглашения при вводе пароля; %H - имя хоста, %h - короткое имя хоста, %p - имя пользователя, чей пароль
запрашивается, %U - имя пользователя, от чьего имени будет выполнена команда, см. passprompt_override)
-r роль-контекста-SELinux
-S (читать пароль с stdin вместо tty)
-s [команда] (запустить командную оболочку, переменная окружения SHELL или база паролей)
-t тип-контекста-SELinux
-u имя-пользователя|#uid (с правами какого пользователя исполнить команду; по
умолчанию - root)
-V (показать версию sudo; для root выдаются также параметры установки: параметры configure и что из них получилось, умолчания,
переменные окружения для проверки, удаления и сохранения)
-v (продлевает допустимое время использования sudo без повторного введения
пароля на очередные 5 минут)
Утилита sudoreplay проигрывает в реальном времени выходной журнал сессии sudo.
В качестве параметра указывается номер сессии (см. ключ --list).
Управление проигрыванием: " " - пауза, "<" - уменьшить скорость вдвое, ">" - увеличить скорость вдвое, "Ввод" - промотать до события.
Ключи:
--help
--version
--list [выражение-поиска] (выражение состоит из предикатов сгруппированных операторами and, or, ! (не) и скобками, предикаты
(дата в формате ISO - "[CCYY-MM-DD] [HH:MM:SS]"):
command расширенный-POSIX-шаблон
cwd каталог
fromdate дата
group имя-группы
runas имя-пользователя
todate дата
tty имя-tty
user имя-пользователя
--max-wait секунд (ограничить ожидание следующего события)
--speed коэффициент-ускорения
--directory=каталог (/var/log/sudo-io)
--filter={stdin|stdout|stderr|ttyin|ttyout},... (фильтр типов журнала)
--with-goodpri= (какой приоритет syslog использовать при удачном выполнении)
--with-badpri= (какой приоритет syslog использовать при неудачах)
--with-logpath=/var/log/sudo.log
--with-loglen=80 (длина строк в файле; 0 - бесконечная)
--with-ignore-dot (игнорировать "." в $PATH)
--with-mailto=root (кому посылать письма)
--with-mailsubject="*** SECURITY information for %h ***"
--without-mail-if-no-user (не ябедничать, если пользователя нет в sudoers)
--with-mail-if-no-host (ябедничать, если хоста нет в sudoers)
--with-mail-if-noperms (ябедничать, если команды нет в списке разрешённых)
--with-passprompt="Password:" (%h расширяется в имя хоста, %u - в имя пользователя)
--with-fqdn (помещать в журнал и sudoers полное доменное имя хоста)
--with-umask=022 (umask для выполняемой команды)
--without-umask (не менять umask при выполнении команды)
--with-runas-default=root
--with-exempt=группа (пользователи из данной группы не должны вводить пароль, лучше
использовать NOPASSWD в sudoers)
--with-secure-path=/bin:/usr/ucb:/usr/bin:/usr/sbin:/sbin:/usr/etc:/etc
(использовать вместо $PATH, не действует на пользователей из группы исключений)
--without-lecture (не закатывать лекцию при первом вызове)
--with-editor=имя-программы (текстовый редактор, используемый visudo)
--with-env-editor (visudo будет использовать переменную окружения VISUAL или EDITOR;
очень не рекомендуется)
--disable-authentication (не запрашивать пароль)
--disable-root-sudo (запрещать использование sudo для root, очень рекомендуется)
--enable-log-host (записывать имя хоста в журнал)
--enable-noargs-shell (разрешать запуск sudo без параметров - выход в shell)
--disable-path-info (не уточнять причину отказа выполнения команды)