Использование команды sudo в Linux
Команда sudo ( s ubstitute u ser and do , подменить пользователя и выполнить ) позволяет строго определенным пользователям выполнять указанные программы с административными привилегиями без ввода пароля суперпользователя root . Если быть точнее, то команда sudo позволяет выполнять программы от имени любого пользователя, но, если идентификатор или имя этого пользователя не указаны, то предполагается выполнение от имени суперпользователя root . Таким образом, использование sudo позволяет выполнять привилегированные команды обычным пользователям без необходимости ввода пароля суперпользователя root . Список пользователей и перечень их прав по отношению к ресурсам системы может быть настроен оптимальным образом для обеспечения комфортной и безопасной работы. Например, команда sudo в Ubuntu Linux, используется в режиме, позволяющем выполнять любые задачи администрирования системы без интерактивного входа под учетной записью root .
Настройки sudo довольно несложные, и тем не менее, позволяют реализовать гибкую систему распределения полномочий отдельных пользователей в многопользовательской среде.
Командная строка sudo может быть использована в следующих форматах:
sudo -h | -K | -k | -V
sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-AbEHknPS] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s] [ ]
sudo -e [-AknS] [-C num] [-g group] [-h host] [-p prompt] [-u user] file
Параметры командной строки:
-A, --askpass - использовать вспомогательную программу для ввода пароля
-b, --background - выполнить команду в фоновом режиме
-C, --close-from=num - закрыть все дескрипторы файлов >= num
-E, --preserve-env - сохранить пользовательское окружение при выполнении команды
-e, --edit - редактировать файлы вместо выполнения команды
-g, --group=group - выполнить команду от имени или ID указанной группы
-H, --set-home - установить для переменной HOME домашний каталог указанного пользователя
-h, --help - показать справку и выйти
-h, --host=host - выполнить команду на узле (если поддерживается модулем)
-i, --login - запустить оболочку входа в систему от имени указанного пользователя; также можно задать команду
-K, --remove-timestamp - полностью удалить файл с timestamp
-k, --reset-timestamp - объявить недействительным файл timestamp
-l, --list - показать список прав пользователя или проверить заданную команду; в длинном формате используется дважды
-n, --non-interactive - автономный режим без вывода запросов пользователю
-P, --preserve-groups - сохранить вектор группы вместо установки целевой группы
-p, --prompt=prompt - использовать указанный запрос пароля
-S, --stdin - читать пароль из стандартного ввода
-s, --shell - запустить оболочку от имени указанного пользователя; также можно задать команду
-U, --other-user=user - в режиме списка показывать права пользователя
-u, --user=user - выполнить команду (или редактировать файл) от имени или ID указанного пользователя
-V, --version - показать сведения о версии и выйти
-v, --validate - обновить временную метку пользователя без выполнения команды
-- - прекратить обработку аргументов командной строки
Примеры использования команды sudo :
sudo –l - отобразить список команд, доступных для выполнения текущему пользователю. Кроме списка команд отображаются параметры среды, которые будут применяться при их выполнении.
sudo –ll - отобразить список команд, доступных для выполнения текущему пользователю в длинном (расширенном) формате.
В данном формате вместо краткого синтаксиса для списка разрешенных команд в виде (ALL : ALL) ALL отображается подробное описание прав пользователя:
sudo lshw -C network - отобразить информацию о сетевом оборудовании с правами суперпользователя root
sudo –l –U user1 - посмотреть список команд, доступных для выполнения пользователю user1 . Для выполнения данной команды пользователь должен быть root или иметь право на выполнение команды sudo -l , что обеспечивается настройками утилиты sudo в файле /etc/sudoers
sudo ipmitool sensor - выполнить команду ipmitool sensor с правами root .
sudo su - выполнить команду su , т.е. создать сеанс суперпользователя root
sudo -i - запустить командную оболочку с правами суперпользователя root . Для выполнения данной команды пользователь должен иметь право на выполнение программы оболочки в среде sudo , например - /bin/bash
sudo ls /usr/local/protected - получить список файлов каталога, доступного только root
sudo -u user2 ls
- получить список файлов домашнего каталога пользователя user2
www/htdocs/index.html - редактировать файл
www/htdocs/index.html от имени пользователя www
sudo -g adm view /var/log/syslog - просмотреть файл системного журнала, доступного только суперпользователю root и членам группы adm
sudo -u user1 -g users2 vi /home/users2/textfile.txt - редактировать текстовый файл как пользователь user1, с принадлежностью к первичной группе users2
sudo -E /usr/bin/firefox - запустить браузер firefox от имени суперпользователя root , сохранив параметры среды текущего пользователя. Возможность выполнения команд с сохранением среды пользователя должна быть разрешена параметром SETENV в настройках файла конфигурации sudo
Файл конфигурации /etc/sudoers
Настройки sudo определяется содержимым файла /etc/sudoers . Поскольку ошибочные данные в данном файле могут привести к серьезным проблемам доступа к ресурсам системы, рекомендуется выполнять его изменение с помощью специального редактора sudoedit ( в некоторых дистрибутивах - visudo ), который поддерживает функции проверки синтаксиса и значительно снижает риск создания неработоспособной конфигурации sudo .
Содержимое файла /etc/sudoers определяет имена пользователей и групп, перечень выполняемых программ, необходимость введения паролей, и некоторые другие настройки, связанные с формированием переменных окружения при смене пользователя. Кроме данного файла, настройки sudo могут определяться содержимым файлов из каталога /etc/sudoers.d , что позволяет структурировать систему предоставления прав на использование sudo в виде набора файлов с осмысленными именами, что полезно при большом количестве пользователей и сложной системе разграничения прав. Имена файлов конфигураций в каталоге /etc/sudoers.d могут быть любыми, но их содержимое должно полностью соответствовать формату файла /etc/sudoers .
Синтаксис настроек в файле /etc/sudoers позволяет использовать специальные псевдонимы ( Alias-ы ), с помощью которых значительно упрощается как настройка, так и восприятие конфигурационной информации sudo .
В файле конфигурации /etc/sudoers возможно использование четырех разновидностей псевдонимов:
User_Alias - списки пользователей, для которых настраивается политика использования sudo .
Runas_Alias - списки пользователей, от имени которых может быть задано выполнение команд через sudo .
Host_Alias - списки узлов, с которых выполняется подключение к системе.
Cmnd_Alias - списки команд, использующиеся в настройках, выполняемых директивами файла /etc/sudoers
Host_Alias ADMCOMPS = localhost, server, admin - определяет псевдоним ADMCOMPS , который определяет группу компьютеров с именами localhost, server, admin .
Host_Alias MAILSERVERS = 192.168.0.100, smtp2 - определяет группу из двух компьютеров с указанными IP и именем. Возможно использование адресов подсетей.
User_Alias ADMINS = jsmith, admusr - определяет группу ADMINS , в которую входят пользователи с именами jsmith и admusr .
Аналогичным образом можно создать псевдонимы для различных наборов команд, доступных для выполнения в sudo :
## Группа команд, для работы в сети, псевдоним Networking
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
# Группа команд для управления установкой и удалением программ, псевдоним SOFTWARE
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
# Группа команд для управления системными службами, псевдоним SERVICES
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
Аналогичным образом можно создать псевдонимы для групп команд, выполнение которых делегируется одиночным или объединенных псевдонимами пользователей.
Основная часть настроек в файле /etc/sudoers задает правила, определяющие, какие пользователи, каких компьютеров, какие команды могут выполнять. Формат записей:
user - имена или псевдонимы пользователей.
MACHINE - имена или псевдонимы компьютеров
COMMANDS - секция команд, включающая имена или псевдонимы команд и дополнительные параметры.
Обычно, в файле /etc/sudoers присутствует директива, разрешающая выполнение пользователю root любых команд при любом подключении к системе:
Аналогичным образом можно разрешить выполнение через sudo всех команд для пользователя, например, с именем user
user ALL=(ALL) ALL
При данной настройке, у пользователя будет запрашиваться пароль ( его личный, а не пароль суперпользователя root ). При необходимости, можно настроить секцию команд таким образом, чтобы пароль не запрашивался, с использованием параметра NOPASSWD :
user ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/drakxconf - пароль будет запрашиваться при выполнении пользователем user через sudo всех команд, кроме su и drakxconf
Использование псевдонимов позволяет уменьшить необходимое число записей для определения прав пользователей, которые могут подключаться к системе с разных компьютеров и входить в разные группы:
ADMINS localhost=(ALL) NOPASSWD:ALL - разрешить группе пользователей, определенной псевдонимом “ADMINS” выполнять любые команды при подключении через петлевой интерфейс “localhost” без ввода пароля..
ADMINS ALL= NETWORKING, SOFTWARE - разрешить группе пользователей, объединенных псевдонимом “ADMINS” выполнять группы команд, объединенные псевдонимами “NETWORKING” и “SOFTWARE”.
Для существующих в системе групп пользователей можно также разрешать выполнение отдельных команд или групп команд:
%users localhost=/sbin/shutdown -h now - разрешить локальным пользователям выключение компьютера.
%operators ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom - разрешить членам группы “operators” монтирование и размонтирование указанных устройств.
%powerusers ALL=NETWORKING, NOPASSWD: /usr/bin/su - разрешить членам группы “powerusers” выполнять команды группы “NETWORKING” с вводом пароля и команду “su” без пароля.
Довольно часто возникает необходимость исключения разрешения на выполнение отдельных команд из списка, объединенных псевдонимом . В этом случае, перед именем команды или псевдонима ставится восклицательный знак – !
ADMINS ALL= ALL, !NETWORKING - разрешить группе пользователей, объединенных псевдонимом “ADMINS” выполнение всех команд, кроме команд, объединенных псевдонимом “NETWORKING”
В следующем примере, используется конфигурация команд, разрешающая выполнение через sudo для всех пользователей группы “ADMINS”, всех команд, кроме команд смены оболочки :
ADMINS ALL= ALL, !/bin/bash, !/usr/bin/su
Кроме настроек доступа, в файле /etc/sudoers присутствуют директивы Defaults , определяющие некоторые настройки путей исполняемых файлов и создание переменных окружения при выполнении команд:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_keep = "COLOS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
По умолчанию, если интервал выполнения команд с использованием sudo , не превышает 5 минут, то повторный ввод пароля не требуется. Однако, это значение можно изменить, добавив значение timestamp_timeout в минутах:
В данном случае, если команда sudo будет выполняться не позже, чем через 1 минуту после ввода пароля для предыдущей команды, то повторно пароль запрашиваться не будет. Если значение “timestamp_timeout” сделать равным нулю, то пароль будет запрашиваться при каждом запуске sudo , если сделать отрицательным ( -1 ), - то повторный ввод пароля не будет запрашиваться никогда.
Для исключения возможности выполнения sudo-команд при подключении через ssh без авторизации, по умолчанию, должна использоваться команда “ssh –t “:
# Disable "ssh hostname sudo ", because it will show the password in clear.
# You have to run "ssh -t hostname sudo ".
Для определения дополнительного каталога с файлами конфигурации пользователей sudo используется директива:
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)