О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

24.07.2008

Kubuntu: настраиваем sudo

Citkit, весна 2006 г

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

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

  1. во-первых, sudo требует указания пароля того пользователя, который получает права другого, а не пароля того, чьи права приобретаются:

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

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

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

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

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

$ sudo nano -w /etc/fstab

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

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

Впрочем, в Kubuntu есть и другой удобный способ редактирования общесисистемных конфигов: в konqueror'е щелкнуть на имени файла, из контекстного меню выбрать пункт Действия -> Edit as root, что и проделать (уже в редакторе kate, до которого тоже со временем дойдет речь), введя предварительно пользовательский пароль.

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

$ sudo su

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

$ sudo passwd

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

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

$ sudo -s -H

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

$ su -

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

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

Если говорить конкретно об Ubuntu/Kubuntu в установке по умолчанию - оба вопроса получат положительный ответ. А вообще это зависит от настроек программы sudo, которые описываются в файле /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 (посредством команды addgroup) и наделении ее должными правами.

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

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

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

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