Ubuntu. Команды su и sudo
05.05.2023
Теги: CLI • Linux • Ubuntu • Команда • Настройка • Пользователь • ПраваДоступа
Разделение привилегий — основа безопасности в операционной системе Linux. Обычные пользователи работают с ограниченными привилегиями и могут влиять только на собственную рабочую среду, но не на операционную систему в целом. Пользователь с именем root
имеет привилегии суперпользователя — это административная учетная запись без ограничений.
Использование su для получения прав root
Команда su
(substitute user) предназначена для замены пользователя. После ввода команды будет предложено ввести пароль root
, после чего будет создан сеанс оболочки суперпользователя.
$ su -l Пароль: здесь-пароль-root # whoami # root # exit
Обратите внимание, что мы не указываем имя пользователя — в этом случае подразумевается, что нужно запустить новый сеанс root
. Но можно запустить сеанс от любого пользователя.
$ whoami $ sergey $ su -l pavel Пароль: здесь-пароль-pavel $ whoami $ pavel $ exit
Опция -l
или --login
изменяет контекст выполнения оболочки — переменные $PATH
, $HOME
, $SHELL
, $USER
содержат значения, характерные для указанного пользователя.
Справка по команде su
.
$ su --help Использование: su [параметры] [-] [<пользователь> [<аргумент>...]] Change the effective user ID and group ID to that of <user>. A mere - implies -l. If <user> is not given, root is assumed. Параметры: -m, -p, --preserve-environment do not reset environment variables -w, --whitelist-environment <list> don't reset specified variables -g, --group <group> указать первичную группу -G, --supp-group <group> specify a supplemental group -, -l, --login make the shell a login shell -c, --command <command> pass a single command to the shell with -c --session-command <command> pass a single command to the shell with -c and do not create a new session -f, --fast передать -f командной оболочке (для csh или tcsh) -s, --shell <shell> run <shell> if /etc/shells allows it -P, --pty create a new pseudo-terminal -h, --help показать эту справку -V, --version показать версию Для более детальной информации смотрите su(1).
В Ubuntu для суперпользователя пароль не задан, поэтому нельзя запустить сеанс root
. Как правильно ввести пароль, которого нет? Чтобы обойти это ограничение, достаточно добавить sudo
перед su
.
$ whoami sergey $ sudo su [sudo] пароль для sergey: здесь-пароль-sergey # whoami # root # exit
Хотя в Ubuntu нет пароля для root
, его всегда можно установить. И запускать сеанс root
с помощью su
, без sudo
. Но делать это не рекомендуется без веских причин.
$ sudo passwd [sudo] пароль для sergey: здесь-пароль-sergey Новый пароль: новый-пароль-root Повторите ввод нового пароля: новый-пароль-root passwd: пароль успешно обновлён
Обратите внимание, что мы не указываем имя пользователя для passwd
— в этом случае подразумевается root
. Чтобы вернуть Ubuntu в исходное состояние, нужно заблокировать учетную запись root
.
$ sudo passwd -l root
Использование sudo для запуска команд от root
Команда sudo
(substitute user and do) позволяет выполнять разовые команды с привилегиями root
без необходимости создавать новую оболочку.
$ whoami $ sergey $ sudo apt update [sudo] пароль для sergey: здесь-пароль-sergey Выполнение команды apt с правами root
Иногда нужно выполнить несколько команд с правами root
и вводить каждый раз sudo
(и периодически — пароль) может быть неудобно. Тогда можно начать сеанс root
, выполнить все команды, после чего завершить сеанс.
$ whoami sergey $ sudo -i [sudo] пароль для sergey: здесь-пароль-sergey # whoami # root # exit
Справка по команде sudo
.
$ sudo --help sudo — выполнение команд от имени другого пользователя usage: sudo -h | -K | -k | -V usage: sudo -v [-ABknS] [-g group] [-h host] [-p prompt] [-u user] usage: sudo -l [-ABknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command] usage: sudo [-ABbEHknPS] [-r role] [-t type] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>] usage: sudo -e [-ABknS] [-r role] [-t type] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] file ... Параметры: -A, --askpass использовать вспомогательную программу для ввода пароля -b, --background выполнить команду в фоновом режиме -B, --bell ring bell when prompting -C, --close-from=num закрыть все дескрипторы файлов >= num -D, --chdir=directory change the working directory before running command -E, --preserve-env сохранить пользовательское окружение при выполнении команды --preserve-env=list preserve specific environment variables -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 использовать указанный запрос пароля -R, --chroot=directory change the root directory before running command -r, --role=role создать контекст безопасности SELinux с указанной ролью -S, --stdin читать пароль из стандартного ввода -s, --shell запустить оболочку от имени указанного пользователя; также можно задать команду -t, --type=type создать контекст безопасности SELinux указанного типа -T, --command-timeout=timeout terminate command after the specified time limit -U, --other-user=user в режиме списка показывать права пользователя -u, --user=user выполнить команду (или редактировать файл) от имени или ID указанного пользователя -V, --version показать сведения о версии и выйти -v, --validate обновить временную метку пользователя без выполнения команды -- прекратить обработку аргументов командной строки
Присвоение пользователю привилегий sudo
В Ubuntu группа sudo
имеет полные привилегии администратора. Добавляя пользователя в эту группу, мы предоставляем ему такие же привилегии.
$ sudo usermod -aG sudo username
Проверка прав при использовании sudo
Проверить, какие права есть у пользователя при использовании команды sudo
, можно с помощью опции -l
.
$ sudo -l -U evgeniy Matching Defaults entries for evgeniy on ubuntu-server: env_reset, mail_badpass, secure_path=..... User evgeniy may run the following commands on ubuntu-server: (ALL : ALL) ALL
Также можно узнать, может ли пользователь с помощью sudo
выполнить ту или иную команду. Если команда запрещена, то ничего не будет выведено. Если команда разрешена, то будет выведен полный путь до файла.
$ sudo -l -U evgeniy passwd # команда разрешена /usr/bin/passwd $ sudo -l -U vasiliy passwd # команда запрещена
Файл конфигурации /etc/sudoers для sudo
Команда sudo
настраивается с помощью файла /etc/sudoers
. Редактировать это файл можно только с помощью команды visudo
, которая перед сохранением проверяет синтаксис файла. Обычно visudo
открывает файл /etc/sudoers
в текстовом редакторе vi
. Однако в Ubuntu команда visudo
настроена на использование текстового редактора nano
.
$ sudo visudo
# Список специальных директив для установки опций, которые применяются ко всем пользователям Defaults env_reset # сбрасывать переменные окружения при переключении пользователя Defaults mail_badpass # отправлять информацию о неправильно введенном пароле по почте # этот путь будет использовать команда sudo для поиска команды, которую надо выполнить Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # для запуска команды sudo будет использовать psuedo-pty для большей безопасности Defaults use_pty # Определение правил для конкретного пользователя, в данном случае root root ALL=(ALL:ALL) ALL # Определение правил для членов группы, в данном случае для admin и sudo %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL # Данная директория позволяет вынести часть директив в другие файлы. Это # полезно, к примеру, чтобы вынести правила конкретного пользователя. @includedir /etc/sudoers.d
Строки по умолчанию Defaults
Первая строка Defaults env_reset
сбрасывает среду терминала для удаления переменных пользователя. Эта мера безопасности используется для сброса потенциально опасных переменных среды в сеансе sudo
.
Вторая строка, Defaults mail_badpass
, предписывает системе отправлять уведомления о неудачных попытках ввода пароля sudo
для настроенного пользователя. По умолчанию это учетная запись root
.
Третья строка, начинающаяся с Defaults secure_path=…
, задает переменную PATH
, которая будет использоваться для операций sudo
. Это предотвращает использование пользовательских путей, которые могут быть вредоносными.
Бывает, что злоумышленники пытаются запускать вредоносную программу с помощью sudo
, которая разветвит фоновый процесс и он остается активным на терминале пользователя, даже после того как основная программа завершила свое выполнение. Чтобы избежать этого, можно настроить sudo
на запуск команд только с помощью psuedo-pty
с использованием параметра use_pty
.
Строки пользовательских привилегий
Пятая строка файла конфигурации определяет права для пользователя root
. Давайте посмотрим, что означают различные поля.
root ALL=(ALL:ALL) ALL # Поле показывает имя пользователя, для которого составлено это правило root ALL=(ALL:ALL) ALL # Первое ALL означает, что данное правило применяется ко всем хостам root ALL=(ALL:ALL) ALL # Второе ALL разрешает root запускать команды от лица любого пользователя root ALL=(ALL:ALL) ALL # Третье ALL разрешает root запускать команды от лица любой группы root ALL=(ALL:ALL) ALL # Последнее ALL разрешает пользователю root запускать любые команды
Это означает, что пользователь root
с помощью sudo
может выполнять любые команды от любого пользователя или группы после ввода пароля.
Строки привилегий для групп
Следующие две строки похожи на строки привилегий пользователя, но задают правила sudo
для групп. Группа admin
может выполнять любые команды от имени любого пользователя на любом хосте. Группа sudo
имеет те же привилегии, но может еще выполнять команды от лица любой группы.
Строка @includedir /etc/sudoers.d
Данная строка означает, что файлы в каталоге /etc/sudoers.d
также рассматриваются как файлы конфигурации и применяются. В основном это нужно, чтобы приложения могли изменять привилегии sudo
после установки. Файлы в этом каталоге следуют тем же правилам, что и сам файл /etc/sudoers
. И редактировать эти файлы следует только с помощью команды visudo
.
$ sudo visudo -f /etc/sudoers.d/file-to-edit
Настройка персонализированных правил
Мы познакомились с общим синтаксисом файла, а теперь попробуем создать новые правила.
Создание псевдонимов
Файл /etc/sudoers
можно организовать более эффективно, группируя элементы с помощью разнообразных псевдонимов.
# Псевдонимы пользователей для группировки пользователей
User_Alias ADMIN_USERS = evgeniy, sergey
User_Alias WEBDEV_USERS = andrey, pavel, artem
User_Alias LIMITED_USERS = ALL, !ADMIN_USERS, !WEBDEV_USERS
# Псевдонимы команд для группировки команд
Cmnd_Alias REBOOT_COMMANDS = /sbin/reboot
Cmnd_Alias POWER_COMMANDS = /sbin/shutdown, /sbin/halt
Cmnd_Alias ADMIN_COMMANDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo
Cmnd_Alias PRINT_COMMANDS = /usr/sbin/lpc, /usr/sbin/lprm
# Псевдонимы запуска от имени пользователя или группы
Runas_Alias ADMIN_RUNAS = %sudo
Runas_Alias APACHE_RUNAS = www-data, apache
Теперь, имея все необходимые псевдонимы, можно легко задавать — какие пользователи какие команды могут запускать с помощью sudo
. От имени кого они будут запускать эти команды и нужно ли при этом вводить пароль.
[список пользователей] [список хостов] = [список «запуск от имени»] [PASSWD:NOPASSWD:NOEXEC:] [список команд]
ADMIN_USERS ALL = (ADMIN_RUNAS) NOPASSWD:ADMIN_COMMANDS, PASSWD:POWER_COMMANDS WEBDEV_USERS ALL = (ADMIN_RUNAS) PASSWD:REBOOT_COMMANDS ALL ALL = (ALL) NOPASSWD:PRINT_COMMANDS
Если не указать пользователя или группу «запуска от имени», команда sudo
по умолчанию использует пользователя root
.
# подразумевается ALL = (root) ... ADMIN_USERS ALL = NOPASSWD:ADMIN_COMMANDS, PASSWD:POWER_COMMANDS # подразумевается ALL = (root) ... WEBDEV_USERS ALL = PASSWD:REBOOT_COMMANDS
Необходимо помнить, что в случае конфликта правил более поздние правила имеют приоритет перед более ранними.
Прочая информация по команде sudo
Если задать в файле конфигурации пользователя или группу, от имени которых выполняются команды, можно выполнять команды от их имени.
$ sudo -u run-as-user command $ sudo -g run-as-group command
Для удобства sudo
сохраняет данные аутентификации в течение определенного количества времени на одном терминале. Это означает, что не нужно будет вводить пароль снова, пока это время не истечет. В Ubuntu по умолчанию это 15 минут — изменить это можно, если добавить следующую строку в файл конфигурации.
Defaults timestamp_timeout=60
Если указать ноль — пароль будет запрашиваться каждый раз при использовании sudo
. Если указать отрицательное значение — пароль не будет запрашиваться до следующей перезагрузки системы.
Команда sudo -k
позволяет сбросить таймер сохранения данных аутентификации. То есть, после выполнения команды с использованием sudo
, выполнение команды sudo -k
удалит данные аутентификации.
Команда sudo -v
запросит пароль и сохранит данные аутентификации для последующего использования sudo
без ввода пароля. Данные аутентификации сохраняются на то кол-во минут, которое указано в файле конфигурации.
Поиск: Linux • Ubuntu • Команда • Настройка • Пользователь • Права доступа • su • sudo • root