Размер шрифта:
Bog BOS: sudo: выполнение программ от чужого имени
Play

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 минут.