В этой статье научимся устанавливать, настраивать и использовать утилиту sudo для выполнения административных действий в Linux.
Настройка и использование sudo в Linux
В прошлых статьях этого курса мы говорили про разницу между Ubuntu и Debian в том, что по умолчанию в:
- Ubuntu — нельзя переключиться на пользователя root, зато установлена утилита sudo и административные действия можно выполнять используя эту утилиту таким образом:
$ sudo <команда>
- Debian — root пользователь активен, и для выполнения административных действий нужно на него переключиться, а утилита sudo не установлена:
$ su - root пароль: # <команда>
Пришло время поближе познакомиться с утилитой sudo в Linux. В Ubuntu она уже установлена а в Debian её нужно установить таким образом:
alex@deb:~$ su - Пароль: root@deb:~# apt install sudo
Основным конфигурационным файлом для этой утилиты является файл /etc/sudoers, посмотрим на него:
root@deb:~# cat /etc/sudoers # # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # Host alias specification # User alias specification # Cmnd alias specification # User privilege specification root ALL=(ALL:ALL) ALL # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "@include" directives: @includedir /etc/sudoers.d
В самом верху говориться о том, что редактировать вручную этот файл не нужно, для редактирования нужно использовать утилиту visudo. Рассмотрим остальные не закомментированные строки:
- Defaults env_reset — сбрасывает все локальные переменные пользователя в оболочке sudo. Это повышает безопасность работы sudo в linux. Так как оболочка использует только стандартные системные переменные. А те переменные, которые создал пользователь, использоваться не будут.
- Defaults mail_badpass — говорит системе отправлять уведомления о неудачных попытках ввода пароля sudo для настроенного пользователя mailto. По умолчанию это учетная запись root. То есть, если вы настроите почтовую систему для root пользователя, то будете на почту получать оповещения о неудачных попытках ввода пароля для sudo.
- Defaults secure_path=»/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin» — здесь перечислены пути к каталогам, в которых будут искаться программы при выполнении команд с помощью sudo. То есть, вы вводите команду adduser, и файл программы adduser ищется в этих каталогах. А находится он здесь /usr/sbin/adduser.
- root ALL=(ALL:ALL) ALL — в этой строке разберём по порядку каждое слово:
- root — правило для пользователя root;
- ALL = — применяется ко всем хостам;
- (ALL:ALL) — root может выполнять команды от лица всех пользователей и групп;
- ALL — правило работает для всех команд.
- %sudo ALL=(ALL:ALL) ALL — здесь все также как и в предыдущей строке, но знак процентов (%) перед sudo означают, что это группа, а не пользователь. То есть группа sudo может на всех хостах, от имени любого пользователи или группы, выполнять любые команды.
- @includedir /etc/sudoers.d — означает что в каталог /etc/sudoers.d можно положить дополнительные конфигурационные файлы.
Даём права на sudo включая пользователя в группу sudo
И так, по умолчанию, выполнять все команды с помощью sudo могут пользователи группы sudo. Получается, нам остаётся только поместить своего пользователя в эту группу:
root@deb:~# adduser alex sudo Добавляется пользователь «alex» в группу «sudo» ... Добавление пользователя alex в группу sudo Готово.
Чтобы изменения применились нужно перезайти под пользователем alex. Проверим работу sudo:
root@deb:~# su alex alex@deb:/root$ sudo useradd user3 Мы полагаем, что ваш системный администратор изложил вам основы безопасности. Как правило, всё сводится к трём следующим правилам: №1) Уважайте частную жизнь других. №2) Думайте, прежде что-то вводить. №3) С большой властью приходит большая ответственность. [sudo] пароль для alex: alex@deb:/root$ sudo userdel user3
Как видите, система нас предупредила что с помощью sudo мы выполняем команды от имени администратора и нужно быть осторожными. Такое предупреждение даётся пользователю при первом запуске sudo, а в дальнейшем вы не увидите его.
Работая с sudo мы вводим пароль от своего пользователя (alex), а не от root. В примере выше я просто создал и удалил пользователя user3, чтобы продемонстрировать выполнение административных действий.
Даём права на sudo редактируя конфигурационный файл
Дать пользователю права на sudo можно не только включив его в группу sudo. Также вы можете отредактировать конфигурационный файл /etc/sudoers с помощью специальной утилиты visudo:
alex@deb:/root$ sudo visudo
После чего вы начнете редактировать конфигурационный файл. Например, добавим следующую строку:
alex ALL=(ALL:ALL) ALL
У нас должна получиться такая настройка:
Рядом с root пользователем создаём правило для пользователя alex. Чтобы сохранить файл и выйти из редактора нажмите Ctrl+x, а затем «y«.
Утилита visudo работает в режиме nano. Но в отличие от редактирования напрямую с помощью nano, утилита visudo открывает копию файла /etc/sudoers и перед сохранение файла проверяет его на корректность.
Теперь удалим пользователя alex из группы sudo:
alex@deb:/root$ sudo deluser alex sudo Удаляется пользователь «alex» из группы «sudo» ... Готово.
Перезайдем в систему под alex, чтобы применились изменения:
alex@deb:/root$ exit exit root@deb:~# su - alex alex@deb:~$
И проверим, не потеряли ли мы права на sudo:
alex@deb:~$ sudo useradd user3 alex@deb:~$ sudo deluser user3 Удаляется пользователь «user3» ... Предупреждение: в группе «user3» нет больше членов. Готово. alex@deb:~$
Как видим права остались!
Тонкая настройка прав
У меня в системе остались пользователи user1 и user2. Дадим им право обновлять систему, но другие административные действия они не должны выполнять.
И так, выполните команду sudo visudo
, чтобы начать редактирование конфигурационного файла.
Объедините пользователей одним псевдонимом GR_APT:
User_Alias GR_APT = user1, user2
В системах Debian и Ubuntu обновлять систему можно командами apt и apt-get (обновление системы мы будем изучать позже в этом курсе). Обе команды нужно объединить в одну команду-псевдоним APDATE:
Cmnd_Alias APDATE = /usr/bin/apt, /usr/bin/apt-get
И осталось разрешить GR_APT выполнять команды APDATE:
GR_APT ALL=(ALL:ALL) APDATE
Вот так должен выглядеть ваш файл после всех изменений:
Проверим! Переключимся на пользователя user1 и попробуем выполнить обновление с помощью команды sudo apt update
:
alex@deb:~$ su - user1 Пароль: user1@deb:~$ sudo apt update Пол:1 http://security.debian.org/debian-security bullseye-security InRelease [44,1 kB] Сущ:2 http://deb.debian.org/debian bullseye InRelease Сущ:3 http://deb.debian.org/debian bullseye-updates InRelease Пол:4 http://security.debian.org/debian-security bullseye-security/main Sources [94,1 kB] Получено 138 kB за 1с (246 kB/s) Чтение списков пакетов… Готово Построение дерева зависимостей… Готово Чтение информации о состоянии… Готово Может быть обновлено 12 пакетов. Запустите «apt list --upgradable» для их показа.
Всё получилось!
А теперь попробуем переключиться на root пользователя выполнив su:
user1@deb:~$ sudo su - Sorry, user user1 is not allowed to execute '/usr/bin/su -' as root on deb.
Как видим, выполнять команду su пользователю user1 используя sudo нельзя.
Создать нового пользователя тоже не получится:
user1@deb:~$ sudo useradd user3 Sorry, user user1 is not allowed to execute '/usr/sbin/useradd user3' as root on deb.
Получается мы дали пользователям user1 и user2 право использовать утилиту sudo, но только для команд apt и apt-get, чтобы обновлять Linux систему.
А ещё, редактируя конфигурационный файл /etc/sudoers, вы можете позволить пользователю выполнять команды под sudo без запроса своего пароля. Для этого перед разрешённой командой нужно указать NOPASSWD:
:
alex ALL=(ALL:ALL) NOPASSWD: ALL
Дополнительные опции утилиты sudo
По умолчанию, утилита sudo выполняет команды от пользователя root, но с помощью опций -u или -g можно выполнить команду от имени другого пользователя или группы, например:
alex@deb:~$ sudo -u user1 id uid=1003(user1) gid=1005(user1) группы=1005(user1) alex@deb:~$ sudo -g user1 id uid=1000(alex) gid=1005(user1) группы=1005(user1),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev),1000(alex)
Как видите, вначале мы выполнили команду от имени пользователя user1, а затем от имени группы user1. Во втором случае, пользователь у нас остался alex, а первичная группа стала user1.
Ещё одной полезной опцией является опция -i. Она позволяет, как бы, переключиться на пользователя. При этом нужно указать пользователя с помощью опции -u, без этого мы переключимся на root пользователя:
alex@deb:~$ sudo -u user1 -i user1@deb:~$ user1@deb:~$ exit выход alex@deb:~$ sudo -i root@deb:~# root@deb:~# exit выход alex@deb:~$