Ubuntu. Команды su и sudo

05.05.2023

Теги: CLILinuxUbuntuКомандаНастройкаПользовательПраваДоступа

Разделение привилегий — основа безопасности в операционной системе 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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.