Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы > Sudo

Sudo Man

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 contorl для управления процессом.

  • -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)

    Авторы

    Много людей работало над sudo на протяжении лет; эта версия, в основном, содержит код написанный:
           
           Todd Miller
           Chris Jepeway

    Смотрите файл HISTORY в дистрибутиве sudo или посетите http://www.sudo.ws/sudo/history.html для чтения небольшой истории sudo

    Caveats

    Нет легкого способа препятствовать пользвателю получать 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 скрипты в основном безопасны).

    Ошибки

    Если вы полагаете, что нашли ошибку в sudo, пожалуйста заполните багрепорт
    по адресу http://www.sudo.ws/sudo/bugs/

    Материал взят: http://www.lissyara.su/doc/man/safety/sudo/

    Sudo

    Первая команда, которую нужно освоить пользователю Kubuntu (да и Ubuntu) - это sudo. Впрочем, не повредит она и пользователю любого другого дистрибутива Linux или BSD системы, так как делает всякие настроечные и установочные мероприятия проще и безопасней. Однако для убунтийца знание ее - практически необходимость: в этом семействе дистрибутивов по умолчанию суперпользовательского аккаунта нет, и любое действие по установке программ или настройке чего бы то ни было, делается через sudo.

    Итак, sudo - это программа для получения прав суперпользователя (или любого иного пользователя), подобная su. Отличий от последней - два:

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

    Этим достигается две цели: а) возможность выполнения пользователем административных действий без сообщения ему суперпользовательского пароля, и б) снижение риска повредить систему вследствие забывчивости. Да, есть еще и третья дополнительная возможность, предоставляемая sudo - протоколирование действий, позволяющее определить, в результате чего система рухнула:-)

    В элементарном виде применение команды sudo - элементарно же просто: требуется лишь указать в качестве ее аргумента имя команды, требующей исполнения, со всеми необходимыми последней опциями и аргументами. После этого запрашивается пароль суперпользователя (для упрощения рассмотрим пока только такую ситуацию) - и команда исполняется. То есть, чтобы установить deb-пакет, нужно сделать следующее:

    # sudo dpkg -i pkg_name

    Кстати, если от лица суперпользователя нужно выполнить подряд несколько команд, делать это следует быстро - введенный первый раз пароль "действует" в течении 5 минут. То есть в течении этого времени в ответ на команду sudo пароль запрашиваться не будет.

    Аналогичным образом пользователь может отредактировать общесистемный конфигурационный файл, например:

    # sudo nano -w /etc/fstab

    Впрочем, для редактирования общесистменых конфигов предназначена специальная команда sudoedit (или просто sudo с опцией -e). Она не требует указания имени вызываемого для этой цели редактора: в качестве такового используется значение переменной EDITOR из окружения того суперпользователя. Если эта переменная не определена - а это обычно делается в файлах типа /root/.bashrc (для bash), /root/.profile (для sh) и так далее, - для редактирования вызываается редактор Vim (в своей упрощенной ипостаси, эмулирующей классический vi).

    Как это ни парадоксально, команда sudo не исключает запуска администраторского сеанса внутри обычного пользовательского. Потому что с ее помощью можно запустить ту же команду su:

    # sudo su

    И это - даже в Ubuntu/Kubuntu, где root-аккаунта как бы и нет; точнее, по умолчанию нет его пароля. Но использование sudo делает его ненужным даже для команды su. Но и задать пароль суперпользователя не запрещается - ведь для этого достаточно дать команду

    # sudo passwd

    чтобы в дальнейшем использовать su обычным образом.

    Впрочем, и тут команда sudo предусматривает "идеологически правильный" метод, и даже не один. Это - опции -i и -s, имитирующие, хотя и чуть-чуть по разному, login shell суперпользователя и его переменные окружения (PATH, EDITOR и так далее). То есть после команды

    # sudo -s

    кстати, по понятным причинам не требующей аргументов, пользователь оказывается точно в той же root-среде, что и после команды

    # su -

    Причем на неограниченный срок и с полным правом выполнять все административные команд.

    Команда sudo имеет еще немало опций, но мы на них останавливаться не будем - детали, как обычно, легко посмотреть в man sudo. А зададимся лучше вопросами - любой ли пользователь может получить права администратора через команду sudo, и все ли действия по администрированию он может ее посредством выполнить?

    Если говорить конкретно об Ubuntu/Kubuntu в установке по умолчанию - оба вопроса получат положительный ответ. А вообще это зависит от настроек программы, которые описываются в файле /etc/sudoers. И в нем можно задать правила, допускающие исполнение определенных команд только отдельным пользователям. В обощенном виде это выглядит так:

    username        host = command

    Здесь, как нетрудно догадаться, username - имя пользователя, для которого устанавливается данное правило, host - имя машины, с которой он может к этому правилу прибегнуть, command - конкретная команда, использование которой разрешается данному пользователю с данной машины. Команда должна указываться с указанием полного абсолютного пути (то есть /sbin/fdisk, а не fdisk). Поле описания команд может включать несколько значений, разделенных запятыми, например:

    username	ALL = /sbin/fdisk, /bin/mount

    В Kubuntu по умолчанию правила доступа пользователей к административным привелегиям описываются так:

    # User privilege specification
    root    ALL=(ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin  ALL=(ALL) ALL

    То есть пользователь root, как ему и положено, может исполнять любые команды с любых хостов. А вот получить права его могут только пользоваетли, входящие в группу admin (аналог группы wheel в BSD-системах и некоторых дистрибутивах Linux). Пользователь, создаваемый в ходе обычной установки, автоматически становится членом этой группы - и потому все административные права ему доступны без всяких дальнейших настроек.

    К слову сказать - при экспертной установке Kubuntu второй из приведенных строк в файле /etc/sudoers нет. Более того, нет и самой группы admin. Именно этим, судя по всему, и вызываются осложнения с доступом к утилитам администрирования, о которых я говорил в одной из прежних заметок. И, соответственно, избавление от этих осложнений - в редактировании /etc/sudoers, создании группы admin и наделении ее должными правами.

    Файл /etc/sudoers - обычный текстовый, и, соответственно, его можно редактировать в обычном текстовом редакторе (или, скажем, средствами ed или sed). Однако при этом существует определенный риск что-нибудь напортачить (за счет обычных опечаток), вплоть до того, что полностью закрыть самому себе доступ к привилегиям суперпользователя. Конечно, ситуации эти поправимы - например, через перезагрузку в однопользовательском режиме. Однако, лучше в них не попадать. И потому более надежным средством модификации /etc/sudoers будет использование специально предназначенной для того утилиты - visudo.

    Утилита visudo не делает ничего сверхъестественного - она просто открывает /etc/sudoers в текстовом редакторе, описываемом переменной EDITOR суперпользователя (если таковая не определна, им будет опять же vi - отсюда и название) и позволяет его отредактировать обычным образом, после чего выйти из редактора с сохранением результатов штатными его средствами. Однако перед этим результат редактирования проверяется на корректность. И если обнаруживается нарушение синтаксиса, принятого для /etc/sudoers, выдается соответствующее предупреждение. После которого можно вернуться к редактированию, отказаться от сделанных изменений или все-таки принять их (разумеется, под личную ответственность).

    Утилита visudo не гарантирует стопроцентного успеха редактирования. Так как проверяет только соответствие синтаксиса, но не "правильность самих правил". То есть если ошибка будет допущена в указании пути к нужной для данного правила команды - эта команда через sudo не сработает.

    Впрочем, тут уже начинаются тонкости всамделишнего администрирования. А для пользователя настольной персоналки вариант настройки /etc/sudoers, предлагаемый в Kubuntu по умолчанию, вполне подходит. По крайней мере на первых порах, а дальше он сам разберется, какие команды и для каких пользователей ему закрывать.


    Главная > Программы > Sudo