sudo, sudoedit — выполнить команду от имени другого пользователя
СИНТАКСИС
sudo -h | -K | -k | -V
sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command [arg ...]]
sudo [-ABbEHnPS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] [VAR=value] [-i | -s] [command [arg ...]]
sudoedit [-ABkNnS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] file ...
ОПИСАНИЕ
sudo позволяет авторизованному пользователю выполнить команду от имени суперпользователя или другого пользователя, как указано в политике безопасности. Идентификатор реального (а не эффективного) пользователя, который вызвал команду, используется для определения имени пользователя, с которым следует запросить политику безопасности.
sudo поддерживает архитектуру плагинов для политик безопасности, аудита и регистрации ввода-вывода.
Сторонние разработчики могут создавать и распространять собственные плагины для бесшовной работы с интерфейсом sudo. По умолчанию используется политика безопасности sudoers, которая настраивается через файл /etc/sudoers или через LDAP. Подробности см. в разделе «Плагины».
Политика безопасности определяет, какие привилегии, если таковые имеются, пользователь имеет для выполнения sudo. Политика может требовать, чтобы пользователи аутентифицировались с помощью пароля или другого механизма аутентификации. Если требуется аутентификация, sudo завершит работу, если пароль пользователя не будет введен в течение заданного в политике времени. Это время зависит от политики; по умолчанию время ожидания запроса пароля для политики безопасности sudoers составляет 0 минут.
Политики безопасности могут поддерживать кэширование учетных данных, чтобы позволить пользователю снова выполнять sudo в течение определенного периода времени без повторной аутентификации. По умолчанию политика sudoers кэширует учетные данные для каждого терминала в течение 15 минут. Дополнительные сведения см. в параметрах timestamp_type и timestamp_timeout в sudoers(5). Запустив sudo с опцией -v, пользователь может обновить кэшированные учетные данные без запуска команды.
В системах, где sudo является основным способом получения привилегий суперпользователя, необходимо избегать синтаксических ошибок в файлах конфигурации политики безопасности. Для политики безопасности по умолчанию, sudoers(5), изменения в файлах конфигурации следует вносить с помощью утилиты visudo(8), которая гарантирует отсутствие синтаксических ошибок.
При вызове в качестве sudoedit подразумевается опция -e (описанная ниже).
Политики безопасности и плагины аудита могут регистрировать как успешные, так и неудачные попытки выполнения sudo. Если настроен плагин ввода-вывода, ввод и вывод выполняемой команды также могут регистрироваться.
Доступные опции:
-A, --askpass
Обычно, если для sudo требуется пароль, он считывается из терминала пользователя. Если указана опция -A (askpass), запускается вспомогательная программа (возможно, графическая), которая считывает пароль пользователя и выводит его в стандартный вывод. Если установлена переменная среды SUDO_ASKPASS, она указывает путь к вспомогательной программе. В противном случае, если в sudo.conf(5) есть строка, определяющая программу askpass, используется это значение. Например:
# Путь к вспомогательной программе askpass
Path askpass /usr/bin/ssh-askpass
Если программа askpass недоступна, sudo завершится с ошибкой.
-B, --bell
Издать звуковой сигнал в качестве части приглашения для ввода пароля, когда присутствует терминал. Эта опция не имеет эффекта, если используется программа askpass.
-b, --background
Запустить указанную команду в фоновом режиме. Невозможно использовать средства управления заданиями оболочки для управления фоновыми процессами, запущенными с помощью sudo. Большинство интерактивных команд не будут работать должным образом в фоновом режиме.
-C num, --close-from=num
Закрыть все файловые дескрипторы, равные или большие num, перед выполнением команды. Значения, меньшие трех, не допускаются. По умолчанию sudo закрывает все открытые файловые дескрипторы, кроме стандартного ввода, стандартного вывода и стандартной ошибки, при выполнении команды. Политика безопасности может ограничивать возможность использования этой опции пользователем. В политике sudoers использование опции -C разрешается только в том случае, если администратор включил опцию closefrom_override.
-D directory, --chdir=directory
Запустить команду в указанном каталоге вместо текущего рабочего каталога. Политика безопасности может вернуть ошибку, если у пользователя нет разрешения указывать рабочий каталог.
-E, --preserve-env
Указывает политике безопасности, что пользователь хочет сохранить существующие переменные среды. Политика безопасности может вернуть ошибку, если у пользователя нет разрешения сохранять среду.
--preserve-env=list
Указывает политике безопасности, что пользователь хочет добавить разделенный запятыми список переменных среды к тем, которые сохраняются из среды пользователя. Политика безопасности может вернуть ошибку, если у пользователя нет разрешения сохранять среду. Эту опцию можно указывать несколько раз.
-e, --edit
Редактировать один или несколько файлов вместо выполнения команды. Вместо имени пути используется строка "sudoedit" при обращении к политике безопасности. Если пользователь авторизован в политике, выполняются следующие действия:
Временные копии файлов, которые необходимо отредактировать, создаются с установкой владельца на пользователя, вызывающего команду.
Запускается редактор, указанный в политике, для редактирования временных файлов. В политике `sudoers` используются переменные среды `SUDO_EDITOR`, `VISUAL` и `EDITOR` (в этом порядке). Если ни одна из переменных `SUDO_EDITOR`, `VISUAL` или `EDITOR` не установлена, используется первая программа, указанная в опции `editor` в `sudoers(5)`.
Если они были изменены, временные файлы копируются обратно в их исходное местоположение, а временные версии удаляются.
Чтобы предотвратить редактирование несанкционированных файлов, применяются следующие ограничения, если иное не разрешено политикой безопасности:
С символическими ссылками нельзя работать (версия 1.8.15 и выше).
Символические ссылки в пути к редактируемому файлу не используются, если родительский каталог доступен для записи вызывающему пользователю, если только этот пользователь не является root (версия 1.8.16 и выше).
Файлы, расположенные в каталоге, доступном для записи вызывающему пользователю, нельзя редактировать, если только этот пользователь не является root (версия 1.8.16 и выше).
Пользователям никогда не разрешается редактировать специальные файлы устройств.
Если указанный файл не существует, он будет создан. В отличие от большинства команд, выполняемых с помощью sudo, редактор запускается с неизменной средой вызывающего пользователя. Если по какой-либо причине sudo не может обновить файл с помощью отредактированной версии, пользователь получит предупреждение, и отредактированная копия останется во временном файле.
-g группа, --group=группа
Запускает команду с установленной первичной группой, отличной от первичной группы, указанной в базе данных паролей целевого пользователя. Группа может быть именем группы или числовым идентификатором группы (GID) с префиксом «#» (например, «#0» для GID 0). При запуске команды как GID во многих оболочках требуется, чтобы символ «#» был экранирован обратной косой чертой («\»). Если параметр `-u` не указан, команда будет выполняться как пользователь, вызвавший команду. В любом случае первичная группа будет установлена в «группа». Политика `sudoers` разрешает указывать любую из групп целевого пользователя с помощью опции `-g`, если не используется опция `-P`.
-H, --set-home
Запрашивает, чтобы политика безопасности установила переменную среды `HOME` в каталог, указанный в базе данных паролей целевого пользователя. В зависимости от политики это может быть поведение по умолчанию.
-h, --help
Отображает краткое сообщение о справке на стандартном выводе и завершает работу.
-h хост, --host=хост
Запускает команду на указанном хосте, если плагин политики безопасности поддерживает удаленные команды. Плагин `sudoers` в настоящее время не поддерживает запуск удаленных команд. Это также можно использовать вместе с опцией `-l` для перечисления привилегий пользователя для удаленного хоста.
-i, --login
Запускает оболочку, указанную в базе данных паролей целевого пользователя, как оболочку для входа в систему. Это означает, что файлы ресурсов, специфичные для входа в систему, такие как `.profile`, `.bash_profile` или `.login`, будут прочитаны оболочкой. Если указана команда, она передается в оболочку как простая команда с помощью опции `-c`. Команда и любые аргументы объединяются, разделяются пробелами, после чего каждый символ экранируется обратной косой чертой («\»), за исключением буквенно-цифровых символов, символов подчеркивания, дефисов и знаков доллара. Если команда не указана, запускается интерактивная оболочка. `sudo` пытается перейти в домашний каталог этого пользователя, прежде чем запускать оболочку. Команда выполняется в среде, аналогичной той, которую пользователь получит при входе в систему. Большинство оболочек ведут себя по-разному, когда указана команда, по сравнению с интерактивной сессией; обратитесь к руководству по оболочке для получения подробной информации. Раздел «Среда команд» в руководстве `sudoers(5)` описывает, как опция `-i` влияет на среду, в которой выполняется команда, когда используется политика `sudoers`.
-K, --remove-timestamp
Аналогично опции -k, но удаляет все сохраненные учетные данные пользователя, независимо от терминала или идентификатора родительского процесса. При следующем использовании `sudo` потребуется ввести пароль, если политика безопасности требует аутентификации. Невозможно использовать опцию -K вместе с командой или другой опцией. Эта опция не требует пароль. Не все политики безопасности поддерживают кэширование учетных данных.
-k, --reset-timestamp
При использовании без команды, делает недействительными сохраненные учетные данные пользователя для текущей сессии. При следующем использовании `sudo` в этой сессии потребуется ввести пароль, если политика безопасности требует аутентификации. По умолчанию, политика `sudoers` использует отдельную запись в кэше учетных данных для каждого терминала (или идентификатора родительского процесса, если терминал отсутствует). Это предотвращает вмешательство опции -k в команды `sudo`, выполняемые в другом сеансе терминала. См. опцию `timestamp_type` в `sudoers(5)` для получения дополнительной информации. Эта опция не требует пароль и была добавлена для того, чтобы пользователь мог отозвать права `sudo` из файла `.logout`.
При использовании в сочетании с командой или опцией, которая может потребовать пароль, эта опция заставит `sudo` игнорировать сохраненные учетные данные пользователя. В результате `sudo` запросит пароль (если он требуется политикой безопасности) и не будет обновлять сохраненные учетные данные пользователя.
Не все политики безопасности поддерживают кэширование учетных данных.
-l, --list
Если команда не указана, отображает привилегии для вызывающего пользователя (или пользователя, указанного опцией -U) на текущем хосте. Более подробный формат списка используется, если эта опция указана несколько раз и политика безопасности поддерживает подробный вывод.
Если указана команда и она разрешена политикой безопасности для вызывающего пользователя (или пользователя, указанного опцией -U) на текущем хосте, отображается полный путь к команде вместе с любыми аргументами. Если -l указана более одного раза (и политика безопасности поддерживает это), соответствующее правило отображается в подробном формате вместе с командой. Если команда указана, но не разрешена политикой, `sudo` завершит работу со статусом 1.
-N, --no-update
Не обновлять кэшированные учетные данные пользователя, даже если пользователь успешно прошел аутентификацию. В отличие от флага -k, существующие кэшированные учетные данные используются, если они действительны. Чтобы определить, когда кэшированные учетные данные пользователя действительны (или когда аутентификация не требуется), можно использовать следующее:
sudo -Nnv
Не все политики безопасности поддерживают кэширование учетных данных.
-n, --non-interactive
Избегать запроса каких-либо данных у пользователя. Если для выполнения команды требуется пароль, sudo отобразит сообщение об ошибке и завершит работу.
-P, --preserve-groups
Сохранять вектор групп вызывающего пользователя без изменений. По умолчанию, политика sudoers инициализирует вектор групп списком групп, в которых состоит целевой пользователь. Однако фактические и эффективные идентификаторы групп все равно устанавливаются в соответствии с целевым пользователем.
-p prompt, --prompt=prompt
Использовать пользовательский запрос пароля с необязательными escape-последовательностями. В политике sudoers поддерживаются следующие escape-последовательности, начинающиеся с символа «%»:
%H разворачивается в имя хоста, включая доменное имя (только если имя хоста машины полностью квалифицировано или опция fqdn установлена в sudoers(5))
%h разворачивается в локальное имя хоста без доменного имени
%p разворачивается в имя пользователя, у которого запрашивается пароль (учитывает флаги rootpw, targetpw и runaspw в sudoers(5))
%U разворачивается в имя для входа пользователя, от имени которого будет выполняться команда (по умолчанию root, если не указана опция -u)
%u разворачивается в имя для входа вызывающего пользователя
%% две последовательные символа «%» объединяются в один символ «%»
Пользовательский запрос заменит запрос по умолчанию, указанный либо в политике безопасности, либо в переменной среды SUDO_PROMPT. В системах, использующих PAM, пользовательский запрос также заменит запрос, указанный модулем PAM, если не отключен флаг passprompt_override в sudoers.
-R directory, --chroot=directory
Перейти в указанный корневой каталог (см. chroot(8)) перед выполнением команды. Политика безопасности может вернуть ошибку, если у пользователя нет разрешения на указание корневого каталога.
Эта опция устарела и будет удалена в будущей версии sudo.
-r role, --role=role
Выполнить команду с контекстом безопасности SELinux, включающим указанную роль.
-S, --stdin
Вывести запрос в стандартный поток ошибок и читать пароль из стандартного потока ввода вместо использования терминального устройства.
-s, --shell
Запустить оболочку, указанную в переменной среды SHELL, если она установлена, или оболочку, указанную в записи о пароле вызывающего пользователя. Если указана команда, она передается оболочке в качестве простой команды с использованием опции -c. Команда и любые аргументы конкатенируются, разделяются пробелами, после чего каждый символ (включая пробелы) экранируется обратной косой чертой («\»), за исключением буквенно-цифровых символов, символов подчеркивания, дефисов и знаков доллара. Если команда не указана, запускается интерактивная оболочка. Большинство оболочек по-разному ведут себя при указании команды по сравнению с интерактивной сессией; обратитесь к руководству по оболочке для получения подробной информации.
-t type, --type=type
Выполнить команду с контекстом безопасности SELinux, включающим указанный тип. Если тип не указан, тип по умолчанию определяется из роли.
-U user, --other-user=user
Используется в сочетании с опцией -l для перечисления привилегий для указанного пользователя вместо перечисления привилегий для пользователя, выполняющего команду. Политика безопасности может ограничивать перечисление привилегий других пользователей. При использовании политики sudoers опция -U ограничена пользователем root и пользователями, имеющими либо привилегию «list» для указанного пользователя, либо возможность выполнять любую команду от имени root или пользователя на текущем хосте.
-T timeout, --command-timeout=timeout
Используется для установки времени ожидания для команды. Если время ожидания истекает до завершения команды, команда будет завершена. Политика безопасности может ограничивать возможность пользователя устанавливать время ожидания. В политике sudoers необходимо явно разрешить пользователям указывать время ожидания.
-u user, --user=user
Выполнить команду от имени другого пользователя, отличного от пользователя по умолчанию (обычно root). Пользователь может быть либо именем пользователя, либо числовым идентификатором пользователя (UID) с префиксом «#» (например, «#0» для UID 0). При выполнении команд от имени UID многие оболочки требуют, чтобы символ «#» был экранирован обратной косой чертой («\»). Некоторые политики безопасности могут ограничивать UID теми, которые перечислены в базе данных паролей. Политика sudoers разрешает UID, которых нет в базе данных паролей, при условии, что опция targetpw не установлена. Другие политики безопасности могут этого не поддерживать.
-V, --version
Вывести строку версии sudo, а также строку версии любых настроенных плагинов. Если пользователь, выполняющий команду, уже является root, опция -V отобразит параметры, переданные при сборке sudo; плагины могут отображать дополнительную информацию, такую как параметры по умолчанию.
-v, --validate
Обновить кэшированные учетные данные пользователя, при необходимости аутентифицировав пользователя. Для плагина sudoers это продлевает время ожидания на 15 минут по умолчанию, но не выполняет команду. Не все политики безопасности поддерживают кэшированные учетные данные.
--
Опция -- используется для обозначения конца опций sudo. Последующие опции передаются команде.
Опции, требующие значения, могут быть указаны только один раз, если иное не указано в описании. Это сделано для предотвращения проблем, вызванных плохо написанными скриптами, которые вызывают sudo с пользовательским вводом.
Переменные среды, которые должны быть установлены для команды, также могут быть переданы в sudo в виде опций в форме VAR=value, например LD_LIBRARY_PATH=/usr/local/pkg/lib. Переменные среды могут подпадать под ограничения, налагаемые плагином политики безопасности. В политике sudoers переменные среды, передаваемые в виде опций, подлежат тем же ограничениям, что и существующие переменные среды, но с одним важным отличием. Если в sudoers установлена опция setenv, и команда, которая будет выполнена, имеет тег SETENV, или совпадает команда ALL, пользователь может устанавливать переменные, которые в противном случае были бы запрещены. См. sudoers(5) для получения дополнительной информации.
ВЫПОЛНЕНИЕ КОМАНД
При выполнении команды с помощью sudo, политика безопасности определяет среду выполнения этой команды. Обычно, реальные и эффективные идентификаторы пользователя и группы устанавливаются в соответствии с целевым пользователем, указанным в базе данных паролей, и вектор групп инициализируется на основе базы данных групп (если не указана опция -P).
Следующие параметры могут быть указаны политикой безопасности:
реальный и эффективный идентификатор пользователя
реальный и эффективный идентификатор группы
дополнительные идентификаторы групп
список переменных окружения
текущий рабочий каталог
маска режима создания файлов (umask)
роль и тип SELinux
приоритет планирования (также известный как значение nice)
Модель процесса
Существует два различных способа, которыми sudo может выполнять команду.
Если настроен плагин регистрации ввода-вывода для регистрации ввода-вывода терминала или если политика безопасности явно этого требует, выделяется новая псевдотерминальная станция («pty»), и используется fork(2) для создания второго процесса sudo, называемого монитором. Монитор создает новую сессию терминала, в которой он является лидером, а pty — управляющим терминалом, затем снова вызывает fork(2), настраивает среду выполнения, как описано выше, и затем использует системный вызов execve(2) для запуска команды в дочернем процессе. Монитор существует для передачи сигналов управления заданиями между терминалом пользователя и pty, в котором выполняется команда. Это позволяет приостанавливать и возобновлять выполнение команды. Без монитора команда будет находиться в так называемой «отдельной группе процессов» (orphaned process group), и она не будет получать какие-либо сигналы управления заданиями от ядра. Когда команда завершается или прерывается сигналом, монитор передает статус выхода команды основному процессу sudo и завершается. После получения статуса выхода команды, основной процесс sudo передает статус выхода команды функции закрытия политики безопасности, а также функции закрытия любого настроенного плагина аудита, и завершается. Этот режим является режимом по умолчанию для версий sudo 1.9.14 и выше при использовании политики sudoers.
Если pty не используется, sudo вызывает fork(2), настраивает среду выполнения, как описано выше, и использует системный вызов execve(2) для запуска команды в дочернем процессе. Основной процесс sudo ожидает, пока команда не завершится, затем передает статус выхода команды функции закрытия политики безопасности, а также функции закрытия любого настроенного плагина аудита, и завершается. В качестве особого случая, если плагин политики не определяет функцию закрытия, sudo выполнит команду напрямую, не вызывая fork(2) сначала. Плагин политики sudoers будет определять функцию закрытия только в том случае, если включена регистрация ввода-вывода, требуется pty, указана роль SELinux, у команды есть связанный тайм-аут или включены опции pam_session или pam_setcred. И pam_session, и pam_setcred включены по умолчанию в системах, использующих PAM. Этот режим является режимом по умолчанию для версий sudo до 1.9.14 при использовании политики sudoers.
В системах, использующих PAM, функция закрытия политики безопасности отвечает за закрытие сеанса PAM. Она также может записывать статус выхода команды.
Обработка сигналов
Когда команда запускается как дочерний процесс sudo, sudo будет передавать полученные ей сигналы команде. Сигналы SIGINT и SIGQUIT передаются только в том случае, если команда выполняется в новом псевдотерминале или если сигнал был отправлен пользовательским процессом, а не ядром. Это предотвращает получение командой сигнала SIGINT дважды при каждом нажатии пользователем комбинации клавиш Ctrl+C. Некоторые сигналы, такие как SIGSTOP и SIGKILL, не могут быть перехвачены, поэтому они не будут передаваться команде. В общем случае, если вы хотите приостановить команду, выполняемую sudo, следует использовать SIGTSTP вместо SIGSTOP.
В качестве особого случая, sudo не будет передавать сигналы, которые были отправлены самой командой, которую она запускает. Это предотвращает случайное завершение работы команды. В некоторых системах утилита reboot(8) перед перезагрузкой системы отправляет сигнал SIGTERM всем несистемным процессам, кроме себя. Это предотвращает передачу sudo сигнала SIGTERM, который она получила, обратно утилите reboot(8), что может привести к завершению работы утилиты до фактической перезагрузки системы, оставляя ее в полумертвом состоянии, подобном однопользовательскому режиму. Обратите внимание, что эта проверка применяется только к команде, запускаемой sudo, а не к каким-либо другим процессам, которые команда может создавать. В результате, запуск скрипта, который вызывает reboot(8) или shutdown(8) через sudo, может привести к тому, что система окажется в этом неопределенном состоянии, если reboot(8) или shutdown(8) не будут запущены с использованием семейства функций exec() вместо system() (которая создает промежуточный слой оболочки между командой и вызывающим процессом).
Плагины
Плагины можно указывать с помощью директив Plugin в файле sudo.conf(5). Они могут быть загружены в виде динамических разделяемых объектов (в системах, которые их поддерживают), или скомпилированы непосредственно в двоичный файл sudo. Если файл sudo.conf(5) отсутствует или не содержит никаких строк Plugin, sudo будет использовать sudoers(5) для плагинов политики, аудита и ведения журналов ввода-вывода. Подробную информацию о файле /etc/sudo.conf см. в руководстве sudo.conf(5), а более подробную информацию об архитектуре плагинов sudo — в руководстве sudo_plugin(5).
ЗНАЧЕНИЕ ВЫХОДА
При успешном выполнении команды, код выхода sudo будет соответствовать коду выхода программы, которая была выполнена. Если команда завершилась из-за получения сигнала, sudo отправит себе тот же сигнал, который привел к завершению команды.
Если опция -l указана без команды, sudo завершит работу со значением 0, если пользователю разрешено запускать sudo и он успешно прошел аутентификацию (в соответствии с политикой безопасности). Если команда указана вместе с опцией -l, значение выхода будет равно 0 только в том случае, если команда разрешена политикой безопасности, в противном случае оно будет равно 1.
Если произошла ошибка аутентификации, проблема с конфигурацией/разрешениями или если данную команду невозможно выполнить, sudo завершит работу со значением 1. В последнем случае строка ошибки выводится в стандартный поток ошибок. Если sudo не может получить информацию о одном или нескольких элементах в переменной PATH пользователя, в стандартный поток ошибок выводится сообщение об ошибке. (Если каталог не существует или не является каталогом, запись игнорируется, и сообщение об ошибке не выводится). Это не должно происходить в нормальных обстоятельствах. Наиболее распространенной причиной того, что stat(2) возвращает «отказ в разрешении», является то, что вы используете автоматический монтировщик, и один из каталогов в вашей переменной PATH находится на машине, которая в данный момент недоступна.
ПРИМЕЧАНИЯ О БЕЗОПАСНОСТИ
sudo старается быть безопасным при выполнении внешних команд.
Чтобы предотвратить подмену команд, sudo проверяет «.» и «» (оба обозначают текущий каталог) в последнюю очередь при поиске команды в переменной PATH пользователя (если одна или обе из них находятся в PATH). В зависимости от политики безопасности переменная окружения PATH пользователя может быть изменена, заменена или передана без изменений программе, которую запускает sudo.
Пользователям никогда не следует предоставлять права sudo для выполнения файлов, на которые пользователь может записывать, или которые находятся в каталоге, на который пользователь может записывать. Если пользователь может изменять или заменять команду, нет способа ограничить количество дополнительных команд, которые он может запускать.
По умолчанию sudo регистрирует только команду, которую он явно запускает. Если пользователь запускает команду, такую как «sudo su» или «sudo sh», последующие команды, выполняемые из этой оболочки, не подпадают под действие политики безопасности sudo. То же самое относится и к командам, предлагающим выход из оболочки (включая большинство редакторов). Если включено ведение журнала ввода-вывода, ввод и/или вывод последующих команд будут регистрироваться, но традиционные журналы для этих команд создаваться не будут. В связи с этим следует проявлять осторожность при предоставлении пользователям доступа к командам через sudo, чтобы убедиться, что команда непреднамеренно не предоставляет пользователю эффективную оболочку root. Для получения информации о способах решения этой проблемы см. раздел «Предотвращение выхода из оболочки» в sudoers(5).
Чтобы предотвратить раскрытие потенциально конфиденциальной информации, sudo по умолчанию отключает дампы памяти во время выполнения (они снова включаются для выполняемой команды). Эта историческая практика восходит к тому времени, когда большинство операционных систем разрешали процессам с установленным идентификатором пользователя создавать дампы памяти по умолчанию. Чтобы облегчить отладку сбоев sudo, вы можете захотеть снова включить дампы памяти, установив значение «disable_coredump» в false в файле sudo.conf(5), следующим образом:
Установите disable_coredump в значение false.
Подробную информацию можно найти в руководстве sudo.conf(5).
ОКРУЖАЮЩАЯ СРЕДА
sudo использует следующие переменные среды. Политика безопасности контролирует фактическое содержимое среды команды.
EDITOR По умолчанию используется редактор, который используется в режиме -e (sudoedit), если переменные SUDO_EDITOR или VISUAL не установлены.
MAIL Устанавливается в почтовый каталог целевого пользователя, когда указана опция -i или когда в файле sudoers включена опция env_reset (если MAIL не присутствует в списке env_keep).
HOME Устанавливается в домашний каталог целевого пользователя, когда указаны опции -i или -H, когда указана опция -s и в файле sudoers установлена опция set_home, когда в файле sudoers включена опция always_set_home или когда в файле sudoers включена опция env_reset и HOME отсутствует в списке env_keep.
LOGNAME Устанавливается в имя пользователя целевого пользователя, когда указана опция -i, когда в файле sudoers включена опция set_logname или когда в файле sudoers включена опция env_reset (если LOGNAME не присутствует в списке env_keep).
PATH Может быть переопределена политикой безопасности.
SHELL Используется для определения оболочки, которая будет использоваться с опцией -s.
SUDO_ASKPASS Указывает путь к вспомогательной программе, используемой для чтения пароля, если терминал недоступен или если указана опция -A.
SUDO_COMMAND Устанавливается в команду, выполняемую sudo, включая все аргументы. Аргументы усекаются до 4096 символов, чтобы предотвратить возможную ошибку выполнения.
SUDO_EDITOR По умолчанию используется редактор, который используется в режиме -e (sudoedit).
SUDO_GID Устанавливается в идентификатор группы пользователя, вызвавшего sudo.
SUDO_HOME Устанавливается в домашний каталог пользователя, вызвавшего sudo.
SUDO_PROMPT Используется в качестве запроса пароля по умолчанию, если не указана опция -p.
SUDO_PS1 Если установлено, PS1 будет установлено в его значение для выполняемой программы.
SUDO_TTY Устанавливается в устройство терминала пользователя, вызвавшего sudo, если оно присутствует.
SUDO_UID Устанавливается в идентификатор пользователя пользователя, вызвавшего sudo.
SUDO_USER Устанавливается в имя пользователя пользователя, вызвавшего sudo.
USER Устанавливается в то же значение, что и LOGNAME, описанное выше.
VISUAL По умолчанию используется редактор, который используется в режиме -e (sudoedit), если SUDO_EDITOR не установлен.
ФАЙЛЫ
/etc/sudo.conf Файл конфигурации интерфейса sudo.
ПРИМЕРЫ
В следующих примерах предполагается правильно настроенная политика безопасности.
Чтобы получить список файлов в недоступной для чтения директории:
$ sudo ls /usr/local/protected
Чтобы просмотреть домашний каталог пользователя yaz на машине, где файловая система, содержащая ~yaz, не экспортируется для пользователя root:
$ sudo -u yaz ls ~yaz
Чтобы отредактировать файл index.html от имени пользователя www:
$ sudoedit -u www ~www/htdocs/index.html
Чтобы просмотреть системные журналы, доступные только для пользователя root и пользователей в группе adm:
$ sudo -g adm more /var/log/syslog
Чтобы запустить редактор от имени пользователя jim с другой первичной группой:
$ sudoedit -u jim -g audio ~jim/sound.txt
Чтобы выключить компьютер:
$ sudo shutdown -r +15 "quick reboot"
Чтобы создать список использования дискового пространства для директорий в разделе /home. Команды выполняются в подпроцессе, чтобы обеспечить корректную работу команд cd и перенаправления вывода.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
ДИАГНОСТИКА
Сообщения об ошибках, генерируемые sudo, включают:
редактирование файлов в записываемой директории запрещено
По умолчанию sudoedit не позволяет редактировать файл, если какая-либо из родительских директорий доступна для записи вызывающему пользователю. Это позволяет избежать состояния гонки, которое может привести к тому, что пользователь перезапишет произвольный файл. Подробную информацию см. в опции sudoedit_checkdir в sudoers(5).
редактирование символических ссылок запрещено
По умолчанию sudoedit не переходит по символическим ссылкам при открытии файлов. Подробную информацию см. в опции sudoedit_follow в sudoers(5).
эффективный UID не равен 0, установлен ли sudo с setuid root?
^ udo не была запущена с правами root. Бинарный файл sudo должен принадлежать пользователю root и иметь установленный бит set-user-ID. Кроме того, он не должен находиться в файловой системе, смонтированной с опцией nosuid, или в NFS-файловой системе, которая сопоставляет UID 0 с непривилегированным UID.
эффективный UID не равен 0, находится ли sudo в файловой системе с установленной опцией 'nosuid' или в NFS-файловой системе без прав root?
^ udo не была запущена с правами root. Бинарный файл sudo имеет правильного владельца и разрешения, но все же не был запущен с правами root. Наиболее распространенной причиной этого является то, что файловая система, на которой находится бинарный файл sudo, смонтирована с опцией nosuid или это NFS-файловая система, которая сопоставляет UID 0 с непривилегированным UID.
критическая ошибка, невозможно загрузить плагины
Произошла ошибка при загрузке или инициализации плагинов, указанных в sudo.conf(5).
недопустимое имя переменной среды
Одна или несколько переменных среды, указанных с помощью опции -E, содержали знак равенства (=). Аргументы опции -E должны быть именами переменных среды без связанных с ними значений.
пароль не был предоставлен
Когда sudo попыталась прочитать пароль, она не получила ни одного символа. Это может произойти, если нет доступного терминала (или указана опция -S) и стандартный ввод перенаправлен из /dev/null.
требуется терминал для чтения пароля
^ udo необходимо прочитать пароль, но нет доступного механизма для этого. Удаленные команды, выполняемые с помощью ssh(1), по умолчанию не имеют доступного терминала; передача опции -t в ssh(1) приведет к выделению терминала, что позволит sudo прочитать пароль. Чтобы разрешить sudo выполнять локальные команды без терминала, можно использовать опцию -S для чтения пароля из стандартного ввода или настроить вспомогательную программу askpass либо в файле sudo.conf(5), либо путем установки переменной среды SUDO_ASKPASS.
Не найдена записываемая временная директория
sudoedit не смог найти пригодную временную директорию, в которой можно хранить промежуточные
файлы.
Установлен флаг «нет новых привилегий», который не позволяет sudo работать от имени root.
sudo был запущен процессом, для которого установлен флаг «нет новых привилегий» в Linux. Это приводит
к тому, что бит set-user-ID игнорируется при запуске исполняемого файла, что не позволит sudo
работать. Наиболее вероятная причина — запуск sudo внутри контейнера, который устанавливает этот флаг.
Проверьте документацию, чтобы узнать, можно ли настроить контейнер так, чтобы этот флаг не был установлен.
sudo должен принадлежать пользователю с uid 0 и иметь установленный бит setuid.
sudo не был запущен с правами root. Двоичный файл sudo имеет неправильного владельца или разрешения.
Он должен принадлежать пользователю root и иметь установленный бит set-user-ID.
sudoedit не поддерживается на этой платформе.
sudoedit можно запускать только на системах, поддерживающих установку эффективного идентификатора пользователя.
Время ожидания ввода пароля истекло.
Пользователь не ввел пароль до истечения времени ожидания (по умолчанию 5 минут).
Вас нет в базе данных passwd.
Ваш идентификатор пользователя отсутствует в системной базе данных passwd.
Нельзя указывать переменные среды в режиме редактирования.
Указывать переменные среды можно только при запуске команды. При редактировании файла редактор запускается
с неизмененной средой пользователя.
СМОТРИТЕ ТАКЖЕ
su(1), stat(2), login_cap(3), passwd(5), sudo.conf(5), sudo_plugin(5), sudoers(5), sudoers_timestamp(5), sudoreplay(8), visudo(8)
ИСТОРИЯ
Смотрите файл HISTORY.md в дистрибутиве sudo (https://www.sudo.ws/about/history/) для получения краткой истории sudo.
АВТОРЫ
За годы существования над sudo работало много людей; в этой версии код в основном написан:
Тодд К. Миллер
Подробный список людей, внесших вклад в sudo, можно найти в файле CONTRIBUTORS.md в дистрибутиве sudo
(https://www.sudo.ws/about/contributors/).
ПРЕДОСТЕРЕЖЕНИЯ
Не существует простого способа предотвратить получение пользователем root-shell, если этому пользователю разрешено запускать произвольные команды через sudo. Кроме того, многие программы (например, редакторы) позволяют пользователю запускать команды с помощью shell-экранирований, тем самым обходя проверки sudo. Однако в большинстве систем можно предотвратить shell-экранирования с помощью функции noexec плагина sudoers(5).
Не имеет смысла запускать команду «cd» непосредственно через sudo, например:
$ sudo cd /usr/local/protected
потому что при завершении работы команды родительский процесс (ваша оболочка) все равно будет прежним.
Опцию -D можно использовать для запуска команды в определенной директории.
Запуск shell-скриптов через sudo может привести к тем же ошибкам ядра, которые делают небезопасными
shell-скрипты с установленным битом set-user-ID в некоторых операционных системах (если в вашей ОС есть
директория /dev/fd/, shell-скрипты с установленным битом set-user-ID обычно безопасны).
ОШИБКИ
Если вы считаете, что обнаружили ошибку в sudo, вы можете либо отправить отчет об ошибке в базу данных ошибок sudo, https://bugzilla.sudo.ws/, либо открыть запрос на https://github.com/sudo-project/sudo/issues. Если вы предпочитаете использовать электронную почту, сообщения можно отправлять в рассылку sudo-workers, https://www.sudo.ws/mailman/listinfo/sudo-workers (публичная) или <_> (приватная).
Пожалуйста, не сообщайте об уязвимостях в системе безопасности через публичные запросы GitHub, Bugzilla или списки рассылки. Вместо этого сообщайте о них по электронной почте на адрес <_>. При желании вы можете зашифровать свое сообщение с помощью PGP, используя ключ, размещенный по адресу https://www.sudo.ws/dist/PGPKEYS.
ПОДДЕРЖКА
Ограниченная бесплатная поддержка доступна через рассылку sudo-users, перейдите по адресу https://www.sudo.ws/mailman/listinfo/sudo-users, чтобы подписаться или просмотреть архив.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
sudo предоставляется «КАК ЕСТЬ», и любые явные или подразумеваемые гарантии, включая, но не ограничиваясь, подразумеваемые гарантии товарности и пригодности для конкретной цели, исключаются. Подробную информацию смотрите в файле LICENSE.md, распространяемом вместе с sudo, или на https://www.sudo.ws/about/license/.