Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Решение административных задач в Linux

Sudo или не sudo? - вот в чем вопрос!

Оригинал: sudo, or not sudo: that is the question
Автор: Federico Kereki
Дата: 07 февраля 2008
Свободный перевод: Алексей Дмитриев
Дата перевода: 3 марта 2008

Если вы когда-нибудь, хотя бы поверхностно, занимались вопросами безопасности, то вы знаете, что предоставлять права суперпользователя, либо пароль администратора обычному пользователю - далеко не лучшая идея. Но что прикажете делать, если пользователю просто обязательно нужно сделать нечто, для чего абсолютно необходимы права администратора? Ответ простой: используйте команду sudo, чтобы наделить пользователя достаточными правами доступа, не предоставляя ему пароль суперпользователя, и свести доступ к минимуму.

При помощи команды sudo (что можно расшифровать как "superuser do" или "суперпользователь делает") можно делегировать ограниченный набор административных обязанностей другим пользователям, жестко ограничив число разрешенных команд. Команда sudo тщательно отследит все действия пользователя - все, что он сделает, будет записано в логах; если пользователь как-нибудь умудрится сделать что-либо недозволенное, у вас будет возможность обнаружить это и принять необходимые меры. Можно даже сконфигурировать sudo централизованно, так, чтобы его права доступа распространялись на несколько рабочих станций (хостов).

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

Инсталляция и конфигурация

Команда sudo имеет длинную историю - ее первая версия работала на BSD примерно с 1980 года, и с тех пор обновления выходили регулярно. Если она не установлена в вашей системе, вы можете обычным способом установить ее с репозитория вашего дистрибутива.

Программа sudo является свободной, распространяемой под лицензией Internet Systems Consortium (ISC)-style. Доступны как стабильная версия (текущая 1.6.9p12, вышедшая 20 января), так и разрабатываемая ветка (версии 1.7b1). Так как программа имеет отношение к безопасности системы, то я советую выбрать стабильную версию (более старую). Исходные коды можно найти сайте GratiSoft. Инсталляция проста, укладывается в классическую линию: configure, make, make install. Можно воспользоваться некоторыми конфигурационными опциями, в частности существует возможность заставить sudo оскорблять пользователя за неверно введенный пароль!

Конфигурируют sudo, редактируя файл /etc/sudoers, который (как явствует из его имени) содержит список пользователей, которым разрешено запускать программу sudo. Этот файл имеет права доступа "400", означающие, что только суперпользователь может читать его, и никто не может записывать в него. Чтобы редактировать этот файл, необходимо использовать программу visudo, которая следит за правами доступа, устанавливает некоторые "заслоны", чтобы два различных пользователя не могли одновременно редактировать файл, и даже проверяет, не сделали ли вы ошибок, прежде чем сохранить его. Команда visudo запустит тот текстовый редактор, который прописан в переменной окружения EDITOR - обычно это vi.

Формат файла /etc/sudoers прост: начинается с четырех опциональных секций, и заканчивается присвоением специальных прав. Файл может включать пустые строки, строки комментариев, которые начинаются со значка #. Опциональные (необязательные) секции следующие:

  • User Alias (Псевдоним пользователя): Присваивает псевдоним одному пользователю (не очень полезно) или группе пользователей. Пользователь может иметь несколько псевдонимов.
  • "Run as" Alias ("Работает как" Псевдоним): Определяет, вместо кого именно пользователь команды sudo будет работать. По умолчанию sudo подразумевает суперпользователя (root), но есть возможность работать вместо кого-либо другого.
  • Host Alias (Псевдоним рабочей станции): Определяет, каким рабочим станциям присваиваются права. Если вы не системный администратор группы из нескольких рабочих станций Линукс, то не вам это не нужно. А если нужно, то придется скопировать файл при помощи команды rsync на другие хосты, либо использовать что- либо вроде Network Information Service (NIS), чтобы обеспечить кому надо доступ к этому файлу.
  • Command Alias (Псевдоним Команды): Определяет псевдоним для той или иной команды. Проще напечатать псевдоним APT, чем полный путь, такой как /usr/sbin/apt-get.

Вы не обязаны использовать псевдонимы, но они сильно облегчают дальнейшее редактирование. Например, если вы хотите наделить Дональда_Дака правами, которые имеет Микки_Маус, просто добавьте первого в группу последнего и вам не придется тратить много времени, переписывая везде одинаковые строки. Существует специальный псевдоним ALL (ВСЕ), и его можно использовать везде: он может означать ВСЕ пользователи, ВСЕ хосты, и т.д.

После этих четырех секций, вы должны заполнить секцию специальных прав, которая выглядит как: "who where = (whoelse) what" - "кто где = вместо_кого что". Это означает: who (кто) (пользователь, группа, или псевдоним пользователя) на рабочей станции where (где) может запускать команду what (что) в качестве пользователя whoelse (вместо_кого). (Если это слишком зашифровано, посмотрите ниже пример). Можно также подключить несколько специальных опций, например, NOPASSWD (без_пароля), позволяющей пользователю запускать sudo без введения собственного пароля; другие опции перечислены в манах.

Данный пример не описывает все возможности конфигурации (для этого существует команда man sudoers), но некоторые опции могли бы выглядеть в файле приблизительно так:

#
# Пример файла /etc/sudoers, с извинениями компании Disney company!
#

# Псевдонимы пользователей
# Первая строка создает псевдоним для трех определенных пользователей.
# Вторая строка включает в группу "утки" всех, за исключением "дональда"
# Третья строка создает псевдоним для одного пользователя; это может 
# понадобиться в дальнейшем!
#
User_Alias	ПЛЕМЯННИКИ = хью, дью, луи
User_Alias	ВСЕ_УТКИ_КРОМЕ_ДОНАЛЬДА = %утки, !дональд
User_Alias	МИККИ = микки_маус

# Псевдонимы команд

Cmnd_Alias      HALT_OR_REBOOT = /sbin/halt
Cmnd_Alias      KILL = /usr/bin/killall
Cmnd_Alias      SHUTDOWN = /sbin/shutdown
Cmnd_Alias      SU = /bin/su

# Права: кто имеет право запускать что

# Стандартное правило: root и пользователи группы "wheel" 
# имеют все права
root            ALL = (ALL) ALL
%wheel          ALL = (ALL) ALL

# Допустим, что микки_маус является системным администратором, 
# позволим ему запускать все без пароля
МИККИ		ALL = NOPASSWD: ALL

# ПЛЕМЯННИКИ могут выключать машину, если захотят
NEPHEWS		HALT_OR_REBOOT, SHUTDOWN

Можете добавить несколько дополнительных конфигурационных строк в конец файла. Например, можно задать :

  • отправку админу сообщения, в случаях ввода неверного пароля или несанкционированных попыток использовать sudo
  • сколько попыток залогиниться допускается
  • выдачу пользователю небольшой лекции о рискованных моментах использования sudo
  • ведение специфического для sudo лог-файла, где будут отмечаться все команды

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

Будьте осторожны

Наделяя правами, проявляйте осторожность, в противном случае вы можете разрешить гораздо больше того, что собирались. Конечно, если вы позволите пользователю запускать команду su, то он получит все права суперпользователя; а вам это надо? Это очевидный пример, но существуют более завуалированные ловушки. Например, пользователь имеет право запускать sudo less, он может потом применить команду !, и начать запускать любые команды как рут. (Если вы не знаете о подобных рисках, прочтите Unix man pages где это описано). Кстати, прежде чем предоставлять доступ к командам, просмотрите сайты, посвященные безопасности, такие как SANS Institute и познакомьтесь со слабостями и уязвимыми местами - лучше перестраховаться, чем потом расстраиваться.

Другой распространенной ошибкой является использование относительных путей для команд - знающий пользователь без труда проложит себе путь к полным правам. Предположим, что вы определили псевдоним FOO как эквивалент просто bin/foo; злонамеренный пользователь может создать где-либо директорию bin, скопировать в эту директорию нужную ему команду (что важно, назвав ее "foo"), а затем запустить ее с правами рута и делать все, что хочет.

К несчастью, не существует гарантии, что пользователь не сможет когда-нибудь найти способ эскалации привилегий и начать работать как суперпользователь, Но не существует и другого легко осуществимого способа позволить кому-либо делать что-нибудь, требующее более высоких уровней доступа.

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


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