Bsdadmin.ru

Записки администратора FreeBSD

Путь на сайте

Домашняя Mans FreeBSD по-русски sudo - запуск команды от имени другого пользователя

sudo - запуск команды от имени другого пользователя

Название
sudo, sudoedit - запуск команды от имени другого пользователя.

Синтаксис
sudo -K | -L | -V | -h | -k | -l | -v
sudo [-HPSb] [-a auth_type] [-c class|-] [-p prompt] [-u username|#uid] {-e file [...] | -i | -s | command}
sudoedit [-S] [-a auth_type] [-p prompt] [-u username|#uid] file [...]

Описание
sudo позволяет разрешенным пользователям запускать команды, как суперпользователь или другой пользователь, определенный в файле sudoers. Настоящий и эффективный uid и gid устанавливаются в соответствии с используемым пользователем, который указан в файле passwd и вектор группы основан на файле группы (пока не будет использована опция -P). Если вызываемый пользователь - root, или, если целевой пользователь тот же, что и вызываемый, пароль не требуется. В иных случаях, sudo требует, чтобы пользователи, аутентифицировали себя с паролем по умолчанию (ПРИМЕЧАНИЕ: в конфигурации по умолчанию, это пользовательский пароль, а не пароль root'а). Как только пользователь будет аутентифицирован, отметка времени обновится, а затем пользователь может использовать sudo без пароля, на короткий период времени (5 минут, если не изменено в файле sudoers). Подразумевается, что вызван sudoedit, с опцией -e (описано ниже).

sudo определяет, кто авторизованный пользователь, путем проверки файла /etc/sudoers. Используя sudo с флагом -v, пользователь может изменить отметку времени без использования command. Приглашение для ввода пароля истечет по времени, если пользовательский пароль не введен в течении 5 минут (если это не отменено в sudoers).

Если пользователь не перечислен в списке в файле sudoers, попытается выполнить команду посредством sudo, будет отправлено письмо, как определено в установленное время или как определено в файле sudoers (по умолчанию root). Учтите, что письмо не будет отправлено, если неавторизованный пользователь попытается запустить sudo, с флагими -l или -v. Эта возможность позволяет пользователям узнать, могут они использовать sudo или нет.

Если sudo запущен пользователем root и переменная SUDO_USER установлена, sudo будет использовать это значение, для определения того, кто является настоящим пользователем. Данная возможность может быть использована пользователем для протоколирования команд через sudo, даже когда вызван root shell. Утилита так же поддерживает -e флаг, который будет полезен, даже если будет запущен через sudo-скрипт или программу. Заметьте, что поиск все еще ведется для root'а, а не для пользователя определенного в SUDO_USER.
sudo может протоколировать все удачные и неудачне попытки (так же как и ошибки) через syslog(3), через log файл, или обоими способами. По умолчанию,sudo протоколирует через syslog(3), но эта возможность может быть изменена во время конфигурирования, или через файл sudoers.

Опции
sudo поддерживает следующие опции командной строки:
-H
 Опция -H устанавливает переменную окружения HOME, в домашний каталог целевого пользователя (по умолчанию root) как определено в файле passwd(5). По умолчанию, sudo не модифицирует HOME (смотрите set_home и always_set_home в sudoers(5))

-K
 Опция -K (совершенно верно - kill), такая же как и -k, за исключением того, что она убирает пользовательскую отметку времени Так же, как и -k эта опция не требует пароля.

-L
Опция -L (список) выведет список параметров, которые могут быть установлены в строке Defaults с небольшим описанием для каждого. Эта опция полезна в сочетании с grep(1).
-P
Опция -P, заставляет sudo сохранять вызываемый вектор группы пользователя неизменным. По умолчанию sudo будет инициализировать вектор группы, из списка группы в которой находится пользователь. Настоящий и эффективный идентификатор группы, однако, все еще совпадает с целевым пользователем.

-S
Опция -S (stdin) заставляет sudo читать пароль из стандартного ввода, вместо терминального устройства.

-V
Опция -V (версия) заставляет sudo выводить номер версии и прекратить работу. Если вызываемый пользователь уже является root'ом, опция -V выведет на экран список опций по умолчанию, с которыми компилировался sudo, а так же локальный адрес компьютера.

-a
Опция -a (тип аутентификации) заставляет sudo использовать определенный тип аутентификации, когда проверяется пользователь, как указано в /etc/login.conf. Системный администратор может указать список sudo-специфичных методов аутентификации, путем добавления "auth-sudo'' строки в /etc/login.conf. Эта опция доступна только системам, которые поддерживают аутентификацию BSD, а sudo сконфигурирован с опцией --with-bsdauth.

-b
Опция -b(фоновый процесс) говорить sudo выполнять данную комманду фоновым процессом. Учтите, что если вы используете -b опцию, вы не можете использовать shell job control для управления процессом.

-c
Опция -c(класс) заставляет sudo запускать определенную команду с ограничением ресурсов, указанных в login class. Аргумент class может быть так же именем класса как указано в /etc/login.conf, или символом "-". Определение class показывает, что команда должна быть запущена с ограниченными возможностями логина для пользователя запустившего команду. Если аргумент class определяет существующий пользовательский класс, команда должна запускаться как root, или команда sudo должна быть запущена из оболочки которая принадлежит root'у. Опция доступна только на системах с классами логина BSD,на которых sudo сконфигурирована с опцией --with-logincap.

-e
Опция -e (редактирование) показывает что, вместо запуска команды, пользователь хочет редактировать один или более файлов. В командной строке, строка "sudoedit" используется для проверки файла sudoers. Если пользователь авторизован, в sudoers предпринимаются следующие шаги:
Создаются временные копии файлов, которые будут отредактированы, когда владелец установит вызываемого пользователя.
Редактор указанный в переменных окружения VISUAL или EDITOR запускается для редактирования временных файлов. Если не VISUAL ни EDITOR не установлены, программа указанная в переменной editor sudoers будет использована.
Если они были модифицированны, временные файлы копируются назад в изначальное местоположение и временные верси удаляются.
Если указанный файл не существует, он будет создан. Учтите, что нежелателен запуск большинства команд sudo, редактор загружается с немодифицированым окружением вызываемого пользователя. Если по, некоторым причинам, sudo не может обновить файл его отредактированной копией, пользователь получит предупреждение и редактируемая копия останется во временном файле.

-h
Опция -h (помощь) заставляет sudo выводить на экран подсказку и завершать работу.

-i
Опция -i (симуляция логина) запускает shell определенный в записи в passwd(5) пользователя, от которого запускается команда. Имя аргумента команды, отдаваемое shell'у начинается с -, что заставляет shell запускаться как login shell. sudo пытается изменить домашнюю директорию пользователя прежде, чем запустить shell. Так же инициализируется окружение, оставляя TERM неизмененным, устанавливая HOME, SHELL, USER, LOGNAME и PATH и снимает все остальные переменные окружения. Учтите, это происходит потому, что shell использует определение до того, как файл sudoers будет парсирован, установка runas_default в sudoers укажет какой shell пользователю запустить, но не скажет какой shell в данный момент запущен.

-k
Опция -k изменяет отметку времени пользователя, установкой времени в этот момент. На следующий запуск, sudo спросит пароль. Опция не требует пароля и добавлена для возможности отзыва пользователями разрешений sudo из .logout файла.

-l
Опция -l (список) выведет список разрешенных (и запрещенных) команд для пользователя данного хоста.

-p
Опция -p (prompt) позволяет отменять строку ввода пароля по умолчанию и использовать свою собственную. Символ процента ("%") и следующие последовательности поддерживаются:

%u расширение к имени логина, вызываемого пользователя.

%U расширение к имени логина пользователя чья команда будет запущена.

(по умолчанию root)

%h расширение к локальному имени хоста, без доменного имени.

%H расширение к локальному имени хоста, включая доменное имя (включается если на имя хоста машины, полностью или опция fqdn sudoers установлена).

%% два символа %% превращаются в один %

-s
Опция -s (shell) запускает shell определенный в переменной SHELLS , если она установлена, или shell определенный в файле passwd(5)

-u
Опция -u (пользователь) заставляет sudo запускать определенную команду, как не root пользователь. Для определения uid вместо username, используйте #uid. Имейте ввиду, что если опция targetpw установлена (см. sudoers) невозможно запустить команду с uid, который отсутствует в списке базы данных паролей.

-v
 Если задана опция -v, sudo изменит пользовательскую отметку времени, prompting for the user's password if necessary. Опция продлевает таймаут sudo на следующие 5 минут (или на то время которое задано в sudoers), но не запускает команду.

-- Флаг показывает, что sudo должна прекратить обрабатывать аргументы командной строки. Полезно в сочетании с флагом -s.

Код завершения

После успешного запуска программы, возвращаемое значение sudo будет возвращаемым значением программы которая запустилась. Иначе, sudo завершит работу со значением 1, если присутствует ошибка в кофигурации/правах доступа или sudo не может запустить данную команду. Строка с ошибкой будет отправлена в stderr. Если sudo не может stat(2) одну запись или более в пользовательском PATH, ошибка будет выведена в stderr. В нормальных обстоятельствах этого не должно происходить. Распространенная причина возвращения stat(2) "permission denied" когда вы запускаете automounter и одна из директорий в вашем PATH, на машине, которая в данный момент недоступна.

Безопасность

sudo пытается быть осторожной, когда запускает внешние команды. Переменные,которые контролируют, когда динамическая загрузка и привязка будет завершена, как будут использоваться для препятствия программе которую загружает sudo. Для того, что бы победить это, переменные окуржения LD_, _RLD_, SHLIB_PATH (только HP-UX), и LIBPATH (только AIX) удаляются из окружения, проходя все запущенные команды. sudo, так же, удаляет переменные IFS, CDPATH, ENV, BASH_ENV, KRB_CONF, KRBCONFDIR, KRBTKFILE, KRB5_CONFIG, LOCALDOMAIN, RES_OPTIONS, HOSTALIASES, NLSPATH, PATH_LOCALE, TERMINFO, TERMINFO_DIRS и TERMPATH, поскольку они так же могут создать угрозу. Если переменная TERMCAP и имя пути установлены, они тоже игнорируются. Вдобавок, если переменные LC_ или LANGUAGE содержат символы / или % они игнорируются. Переменные окружения со значением начинающимся с () удаляются,поскольку они могут быть интерпретированы как функции bash. Если sudo была скомпилирована с поддержкой SecurID, переменные VAR_ACE, USR_ACE и DLC_ACE тоже очищаются. Список переменных окружения, которые сбрасывает sudo содержаться в выводе sudo -V когда он запущен от root'а.

Для предотвращения спуфинга команд, sudo проверяет последние ``.'' and ``'' (обе сбрасывают текущую директорию), когда ищет команду в PATH пользователя (если одна или обе в PATH). Учтите, поскольку действительное окружение PATH, не модифицируется, оно проходит неизмененным к программе, которую запускает sudo.

Из соображений безопасности, ваша операционная система поддерживает общие библиотеки и не выключает библиотеки в пути поиска, который определил пользователь, для setuid програм (большинства), вы должны использовать опцию линковщика, которая выключает такую возможность линковки или линковать sudo статически.

sudo проверит владельца и отметку времени директории (/var/run/sudo по умолчанию) и будет игнорировать содержимое директории, если она не принадлежит root'у и доступна для записи не только root'у. В системах, которые поддерживают не root'овых пользователей для отдачи файлов через chown(2) если отметка времени директории находится в директории доступной для записи всем (т.е. /tmp), и пользователя может создавать отметку времени директории прежде чем sudo запустится. Поэтому sudo проверяет владельца и состояние директории и ее содержимого, из-за чего ущерб, который может быть причинен заключается в 'скрывании' файлов, путем перемещения их в директорию с отметкой времени. Это может быть нежелательно, потому как, будучи однажды положенными в директорию с отметкой времени, принадлежащей root'у и недоступной для других пользователей. Пользователь, складывающий файлы туда, может не иметь возможности вернуть их обратно. Во избежании этого, вы можете использовать директорию, которая не доступна на запись "всему миру" для отметок времени (/var/adm/sudo например) или создайте /var/run/sudo с подобающим владельцем (root) и разрешениями (0700) в файлах системной загрузки.

sudo не будет соблюдать установки отметок времени в будущем. отметки времени с датой выше чем current_time + 2 * TIMEOUT будут игнорироватся, и sudo запротоколирует эту ситуацию и пожалуется. Это сделано для того, что бы удержать пользователя от создания собственных отметок времени с поддельной датой в системах,которые позволяют пользователям отдавать файлы.

Пожалуйста имейте ввиду, что sudo только запротоколирует команду, которая явно запускается. Если пользователь запускает команду такую как sudo или su или sudo sh, последующие команды запущенные из этого shell'а не будут ни записаны, ни контроль доступа sudo не затронет их. Тоже самое справедливо, для команд которые предлагают shell последовательности (включая большинство редакторов). Из-за этого, примите меры предосторожности когда даете пользователю доступ к коммандам через sudo проверьте, не дает ли, случайно, команда пользователю root shell.

Окружение
sudo использует следующие переменные окружения:
EDITOR
Используемый редактор по умолчанию в -e (sudoedit) режиме, если VISUAL неустановлена.

HOME
В режиме -s или -H (или если sudo был сконфигурирован с опцией --enable-shell-sets-home) устанавливает домашнюю директорию целевому пользователю.

PATH
устанавливается в нормальное значение если sudo был сконфигурирован с опцией --with-secure-path.

SHELL
используется для оперделения shell'а для запуска с опцией -s

SUDO_PROMPT
используется приглашения ввода пароля по умолчанию.

SUDO_COMMAND
Устанавливает команду запускаемую sudo

SUDO_USER
Устанавливает логин пользователя, который вызвал sudo.

SUDO_UID
 Устанавливает uid пользователя который вызвал sudo.

SUDO_GID
Устанавливает gid пользователя который вызвал sudo

SUDO_PS1
если определена, PS1 будет установлена в собственное значение.

USER
 устанавливает целевого пользователя (root до тех пор пока -u опция определена).

VISUAL
По умолчанию редактор используемый в режиме -e (sudoedit).

Файлы

/etc/sudoers -  список кто что может запускать
/var/run/sudo - директория содержащая отметки времени

Примеры

Примечание: примеры ниже, предполагают настроенный sudoers(5)
Для получения списка файлов из нечитаемой директории:
$ sudo ls /usr/local/protected
Для получения списка домашней директории пользователя yazza на машине, где файловая система держит ~yazza не передаваемым root'у:
$ sudo -u yazza ls ~yazza
Для редактирования файла index.html как пользователь www:
$ sudo -u www vi ~www/htdocs/index.html

Для выключения компьютера:
$ sudo shutdown -r +15 "quick reboot"

Сделать используемым список директорий в разделе /home.
Примечание: управление командами идет в sub-shell'е для возможности работы cd и перенаправления файлов.
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

Смотрите так же
grep(1), su(1), stat(2), login_cap(3), sudoers(5), passwd(5), visudo(8)

Замечание

Нет легкого способа препятствовать пользвателю получать root shell, если пользователь может запускать произвольные команды через sudo. Так же, многие программы (такие как редакторы) позволяют пользователю запускать команды через shell последовательности, таким образом уходя от проверок sudo. Однако, во многих системах возможно избежать shell последовательностей с помощью функциональной возможностью sudo noexec. Смотрите руководство sudoers для более подробной информации.

Совершенно не обязательно запускать cd команду напрямую через sudo, то есть:

$ sudo cd /usr/local/protected

с того момента, когда команда завершается родительский процесс (ваш shell) будет тем же самым. Для более детальной информации смотрите EXAMPELS.

Если пользователь может sudo ALL, ничто не остановит его от создания своей собственной программы, которая дает ему root shell независимо от любого '!' в спецификации пользователя.

Запуск скриптов shell через sudo может обнаружить схожие ошибки ядра, которые делают setuid shell скрипты опасными на некоторых операционных системах (если ваша OS содержит /dev/fd/ директорию, setuid shell скрипты в основном безопасны).

Домашняя Mans FreeBSD по-русски sudo - запуск команды от имени другого пользователя