Команда sudo
(substitute user 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
отображается подробное описание прав пользователя:
RunAsUsers: ALL RunAsGroups: 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
sudo -u www vi ~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
:
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
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
Аналогичным образом можно создать псевдонимы для групп команд, выполнение которых делегируется одиночным или объединенных псевдонимами пользователей.
Основная часть настроек в файле /etc/sudoers
задает правила, определяющие, какие пользователи, каких компьютеров, какие команды могут выполнять.
user MACHINE=COMMANDS
user
- имена или псевдонимы пользователей MACHINE
- имена или псевдонимы компьютеров COMMANDS
- секция команд, включающая имена или псевдонимы команд и дополнительные параметрыОбычно, в файле /etc/sudoers
присутствует директива, разрешающая выполнение пользователю root любых команд при любом подключении к системе:
root ALL=(ALL) ALL
Аналогичным образом можно разрешить выполнение через 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_reset
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 в минутах
:
Defaults timestamp_timeout=1
В данном случае, если команда 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)
# includedir /etc/sudoers.d
Подробную справку по использовании sudo
можно получить с помощью команд:
man sudo
man sudoers