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).
Лицензия - ISC-style (BSD-like).
Состоит из файла настройки /etc/sudoers, программы его редактирования visudo и клиентской программы sudo (проигрывание журнала), настройка политик и дополнений. В статье также описывается процедура установки (1.6) из исходных текстов и ключи configure.
- --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
- имя-хоста
- IP-адрес
- network/netmask
- +netgroup
- Host_Alias
- [:контрольная-сумма ]полное-имя-файла
- [:контрольная-сумма ]полное-имя-файла аргументы
- [:контрольная-сумма ]полное-имя-файла '""'
- полное-имя-каталога/
- sudoedit
- Cmnd_Alias
- Defaults список-параметров-через-запятую
- Defaults@имя-хоста список-параметров-через-запятую
- Defaults:имя-пользователя список-параметров-через-запятую
- Defaults>имя-пользователя список-параметров-через-запятую
- 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 )
- env_reset (on; сбросить переменные окружения, кроме HOME, LOGNAME, PATH, SHELL, TERM, USER, MAIL, USERNAME, SUDO_*)
- 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; не отказываться проходить по символьным ссылкам)
- targetpw (off; запрашивать пароль указанного ключом -u пользователя вместо пароля текущего пользователя)
- tty_tickets (off в старых версиях и on в новых; отдельный интервал истечения времени действия пароля для каждого терминала)
- umask_override (off; использовать umask из sudoers вместо объединения с текущей umask)
- use_netgroups (on; )
- use_pty (off; использовать псевдотерминал)
- utmp_runas (off; указывать имя целевого пользователя в utmp/utmpx)
- visiblepw (off, не обязательно скрывать пароль при вводе)
- closefrom (3; обычно перед выполнением закрываются все файлы с 3-го дескриптора, см. -С)
- maxseq (2176782336; максимальный номер сессии при журналировании ввода/вывода)
- passwd_tries (3; )
- loglinelen (80; длина строк в файле журнала; 0 - бесконечная)
- passwd_timeout (5 минут; ожидание ввода пароля; 0 - бесконечная)
- 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 ("%"; имя файла внутри iolog_dir; при конструрировании имени можно использовать макросы:
- % - порядковый номер в base36
- %
- %
- %
- %
- % - простое имя
- % - базовая часть имени команды
- strftime(3)
- %H - локальное доменное имя хоста
- %h - локальное простое имя хоста
- %p - имя пользователя, чей пароль запрашивается
- %U - имя целевого пользователя
- %u - имя исходного пользователя
- %%
- 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)
- syslog (authpriv; syslog facilities: authpriv, auth, daemon, user, local0-7)
- 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 разрешено выполнять любые команды.
Нельзя давать права на выполнение программ, которые исходный пользователь может перезаписать (не поможет даже проверка контрольной суммы).
- настройка политик - "Plugin sudoers_policy sudoers.so опция . " (опции
- sudoers_file=имя-файла
- sudoers_uid=идентификатор-пользователя
- sudoers_gid=идентификатор-группы
- sudoers_mode=режим-файла
- ldap_conf=имя-файла # ldap.conf
- ldap_secret=имя-файла # ldap.secret
- static - ядро
- dynamic - база групп
- adaptive - ядро для малого числа групп
Команда sudo выполняет указанную в качестве параметра команду от имени другого пользователя в зависимости от настроек. Извещение о неавторизованных попытках посылаются по email по адресу, указанному в mailto. Все использования sudo записываются в syslog и журнал. При отсутствии команды от имени другого пользователя выполняется редактор (-e, sudoedit) или командная оболочка (-s) или имитируется начальный вход в систему (-i). Устанавливается требуемый реальный идентификатор пользователя и группы, euid, egid и список групп. Перерабатываются переменные окружения (см. "sudo -V"). Запрашивается пароль текущего пользователя и делается отметка, чтобы не запрашивать следующие timestamp_timeout минут.