Руководство по использованию Sudo в Gentoo Дмитрий Джус Если вы хотите разрешить другим лицам выполнять определённые административные действия над вашей системой без предоставления им полных прав админстратора, использование sudo является лучшим вариантом. С sudo вы можете управлять тем, кто и какие действия может выполнить. Данное руководство является введением в это замечательное средство. 1.6 2006-07-14 О sudo
Предоставление полномочий

Пакет app-admin/sudo позволяет администратору системы предоставлять другим пользователям права на запуск приложений, (**) которых у них в противном случае не было бы. В отличие от использования бита setuid для таких программ, sudo даёт более тонкий контроль за тем, кто и когда сможет выполнять определённую команду.

Благодаря sudo вы можете создать чёткий список тех, кто может запускать определённое приложение. Если бы вы установили бит setuid на программу, любой пользователь смог бы её выполнить (или любой пользователь определённой группы, в зависимости от предоставленных прав). Вы можете (и, вероятно, даже должны) заставить пользователя вводить пароль перед запуском соответствующего приложения и изменять его полномочия в зависимости от того, подключён ли он к системе локально или с удалённого узла через SSH.

Журналирование деятельности

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

Настройка sudo

Настройка sudo осуществляется через файл /etc/sudoers. Никогда не редактируйте его при помощи nano, vim или любого другого редактора! Для внесения правок в этот файл используйте только visudo.

Эта утилита не даёт двум администраторам одновременно редактировать /etc/sudoers, предохраняет права на файл и выполняет некоторую синтаксическую проверку, чтобы уберечь файл от внесения в него критических изменений.

Об этом руководстве

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

Обращайтесь за подробными сведениями к страницам руководств sudo и sudoers.

Синтаксис файла /etc/sudoers
Базовый синтаксис

Самая сложная часть sudo — синтаксис /etc/sudoers. В общем виде он такой:

          user  host = commands
        

Согласно этому синтаксису, пользователь user, вошедший в систему с узла host, может запускать любую из команд, перечисленных в списке commands с правами админстратора (root). Вот возможный пример файла /etc/sudoers, согласно которому пользователь swift может запускать emerge, если он вошёл в систему локально (не через SSH):

          swift  localhost = /usr/bin/emerge

Важно помнить следующее: не позволяйте пользователям запускать приложения, которые дадут им право повысить их общий уровень полномочий. Например, разрешая пользователю запускать emerge, вы на самом деле можете дать ему польный доступ к системе с правами администратора, потому что при помощи emerge пользователь может изменить реальный файл в системе в собственных целях. Если вы не доверяете своим пользователям sudo, не предоставляйте им никаких прав.

Вместо имени пользователя можно использовать название группы - в этом случае имя группы нужно предварить символом %. К примеру, чтобы разрешить всем пользователям группы wheel запускать emerge, в /etc/sudoers нужно записать следующее:

          %wheel  localhost = /usr/bin/emerge

Строку можно дополнить, чтобы разрешить выполнение нескольких команд. Например, чтобы позволить запуск не только emerge, но и ebuild, и emerge-webrsync с правами администратора:

          swift  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

Вы также можете указывать конкретную команду для запуска, а не только общее имя программы. Это полезно в том случае, когда нужно ограничить права пользователя на запуск приложения определённым набором опций (**) командной строки. Утилита sudo позволяет использовать в /etc/sudoers символы-маски (wildcards) в составе путей к командам, а также среди параметров командной строки. Обратите внимание, это не регулярные выражения!

Давайте попробуем такое (** что имеется в виду?):

          $ sudo emerge -uDN world

          We trust you have received the usual lecture from the local System
          Administrator. It usually boils down to these three things:

          #1) Respect the privacy of others.
          #2) Think before you type.
          #3) With great power comes great responsibility.

          Password: (ожидается пароль пользователя, не администратора!)

          
            Надеемся, вы прослушали обычную лекцию от Системного Администратора. Обычно она
            сводится к трём вещам:

            #1) Уважайте права других на частную жизнь (**)
            #2) Думайте, прежде чем печатать
            #3) Большим возможностям сопутствует и большая ответственность

            Пароль:
          

Пароль, который требует sudo — пароль самого пользователя. Это сделано для того, чтобы оставленным открытым терминалом не могли воспользоваться во вредоносных целях посторонние лица.

Следует знать, что sudo не изменяет переменную среды ${PATH}: любая команда, введённая после sudo, запускается с вашими переменными среды. Например, если вы хотите разрешить пользователю запускать команду из /sbin, ему понадобится вводить полный путь после sudo:

          $ sudo /usr/sbin/emerge-webrsync
Использование псевдонимов

В системах больших масштабов ввод имён пользователей (или узлов или команд) — утомительное занятие. Для облегчения управления файлом /etc/sudoers вы можете назначать псевдонимы (aliases). Формат объявления псевдонима весьма прост:

          Host_Alias  hostalias = hostname1, hostname2, ...
          User_Alias  useralias = user1, user2, ...
          Cmnd_Alias  cmndalias = command1, command2, ...

Один псевдоним доступен всегда и в любом месте — это псведоним ALL (чтобы отличать имена-псевдонимы от прочих имён, рекомендуется использовать заглавные группы для псевдонимов). Как вы уже конечно же догадались, псевдоним ALL обозначает все возможные варианты, допустимые в месте его использования (**).

Вот пример использования псевдонима ALL для предоставления всем пользователям прав на запуск команды shutdown с локального терминала:

          ALL  localhost = /sbin/shutdown

Другой пример — разрешение пользователю swift запускать emerge, откуда бы ни был выполнен вход в систему:

          swift  ALL = /usr/bin/emerge

Интереснее определить набор пользователей, которые могут запускать административные утилиты (такие как emerge и ebuild), и группу администраторов, которые могут менять пароль любого пользователя, кроме root.

          User_Alias  SOFTWAREMAINTAINERS = swift, john, danny
          User_Alias  PASSWORDMAINTAINERS = swift, sysop
          Cmnd_Alias  SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild
          Cmnd_Alias  PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root

          SOFTWAREMAINTAINERS  localhost = SOFTWARECOMMANDS
          PASSWORDMAINTAINERS  localhost = PASSWORDCOMMANDS
Запуск програм не с правами администратора (** не от root?)

Можно также разрешить пользователю выполнять приложение от имени другого пользователя, а не администратора системы. Это может вас заинтересовать(**), если нужно запускать программу от другого имени (например, apache для веб-сервера) или разрешить определённым пользователям выполнять административные действия от чужого имени (например, убивать процессы-зомби).

В файле /etc/sudoers перечислите имена пользователей между скобок ( и ) прямо перед списком команд.

          users  hosts = (run-as) commands

Например, чтобы разрешить пользователю swift выполнять kill и pkill от имени пользователей apache или gorg, в /etc/sudoers нужно записать следующее:

          Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill

          swift  ALL = (apache, gorg) KILL

При таких настройках пользователь может выполнять sudo -u, чтобы выбирать имя другого пользователя для запуска приложения от его имени:

          $ sudo -u apache pkill apache

Вы можете назначить псевдоним для пользователя, от имени которого требуется запускать приложения, с помощью директивы Runas_Alias. Её использование аналогично использованию других _Alias-директив, которые были рассмотрены ранее.

Пароли и настройки по умолчанию

По умолчанию, sudo запрашивает у пользователя его пароль для идентификации. После ввода пароля, sudo сохраняет его в течение 5 минут, позволяя пользователю сконцентрироваться на своих задачах, а не постоянном вводе пароля.

Разумеется, это поведение можно изменить: установите директиву Defaults: в файле /etc/sudoers, чтобы поменять поведение sudo по умолчанию для пользователя.

Например, для смены периода в 5 минут на 0 (чтобы не запоминать пароль вообще) для пользователя swift:

          Defaults:swift  timestamp_timeout=0

Установка времени на -1 означает сохранение пароля на неограниченное время (до перезагрузки системы).

Другим параметром является запрос ввести пароль того пользователя, от имени которого запускается команда. Для этого используется runaspw. В следующем примере мы также устанавливаем количество попыток ввода пароля (сколько раз можно ошибиться в пароле, прежде чем sudo завершит работу) c 3 по умолчанию на 2:

          Defaults:john runaspw, passwd_tries=2

Другая интересная возможность - сохранение переменной среды

DISPLAY
, чтобы можно было запускать графические приложения:

          Defaults:john env_keep=DISPLAY

Можно изменять десятки настроек по умолчанию, пользуясь директивой Defaults:. Откройте руководство по sudo и ищите там раздел Defaults.

Если же вы хотите разрешить пользователю запускать определённые команды вообще без запроса пароля, предваряйте команды параметром NOPASSWD::

          swift  localhost = NOPASSWD: /usr/bin/emerge
Использование sudo
Получение списка привилегий (**)

Что бы получить список своих прав, выполните sudo -l:

          $ sudo -l
          User swift may run the following commands on this host:
          Пользователь swift может выполнять следующие команды на этом узле:
          (root)   /usr/libexec/xfsm-shutdown-helper
          (root)   /usr/bin/emerge
          (root)   /usr/bin/passwd [a-zA-Z0-9_-]*
          (root)   !/usr/bin/passwd root
          (apache) /usr/bin/pkill
          (apache) /bin/kill

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

Продление времени запоминания пароля

По умолчанию, когда пользователь вводит пароль для аутентификации в sudo, он сохраняется на 5 минут. Если пользователю хочется продлить время запоминания пароля, ему требуется выполнить sudo -v для сброса счётчика времени, так что sudo запомнит пароль ещё на 5 пять минут, прежде чем спросить его снова.

          $ sudo -v

Обратный эффект достигается выполнением sudo -k.