Различия между командами sudo и su
В дистрибутивах Linux существует несколько способов получения привилегий суперпользователя или root. Два наиболее распространенных способа — использование команд sudo и su. Оба этих метода позволяют временно получить повышенные привилегии, но имеют некоторые важные различия в использовании и функциональности. Давайте рассмотрим эти различия более подробно.
Если вы не знаете кто такой суперпользователь и зачем он нужен в дистрибутивах Linux, то прочтите вначале статью про пользователя root, которая ранее выходила на канале.
SUDO (Substitute User and do)
sudo представляет собой команду, которая позволяет обычному пользователю выполнить команды с привилегиями суперпользователя или правами доступа любого другого пользователя. Она широко используется в системах Linux, чтобы ограничить доступ к привилегиям root только определенным пользователям. При использовании sudo, пользователю может быть разрешено выполнение команды суперпользователя после ввода своего собственного пароля, а не пароля root.
- Более безопасно, так как ограничивает доступ к привилегиям root только необходимым командам и пользователям.
- Позволяет аудитить и логировать действия пользователей с привилегиями суперпользователя.
- Предоставляет более гибкую систему управления привилегиями, так как администраторы могут настраивать разрешения для конкретных команд и пользователей.
Использование sudo
Чтобы выполнить команду с привилегиями суперпользователя с помощью sudo, необходимо ввести следующую конструкцию:
После ввода этой команды вас попросят ввести свой собственный пароль. После успешного подтверждения пароля команда будет выполнена с привилегиями суперпользователя.
Стоит помнить, что выполнять команду sudo могут те пользователи, которые состоят в одноименной группе.
Для того, чтобы добавить пользователя в нее можно ввести команду:
Ввод и выполнение команды возможны либо от пользователя root, либо от пользователя уже состоящего в группе.
Посмотреть группы, в которых состоит ваш пользователь можно при помощи команды groups. Видим, что пользователь добавлен в группу sudo.
Вторым способом добавления пользователя в группу является использование команды visudo, которая после ввода откроет для редактирования файл, находящийся по пути /etc/sudoers. Но, чтобы воспользоваться visudo нужно либо войти под аккаунтом суперпользователя (смотрите текст ниже), либо указать перед названием sudo.
После ввода откроется файл sudoers для редактирования, в котороый нужно внести следующую строку:
После сохранения файла у пользователя, которого вы укажите появится возможность использовать команду sudo в терминале. Помните, что редактировать файл sudoers необходимо только при помощи команды visudo! Так как некорректные данные внесенные в него могут привести к неполадкам в работе дистрибутива. Я предпочитаю использовать первый способ добавления пользователя в sudoers.
Примечание: на дистрибутиве Debian отсутствует команда sudo после установки и попытка ее использования вызовет ошибку. Чтобы установить утилиту sudo (да, команды в Linux являются названиями одноименных утилит или программ) необходимо ввести в терминале команду apt install sudo, после чего произвести действия по добавлению пользователей в группу sudo.
su или sudo?
С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации Ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano , а в многочисленных любительских мануалах (в стиле «5 фокусов в командной строке, которые удивят вашу бабушку») для получения root’ового шелла предлагается писать sudo su — . Попробую объяснить, почему такое положение вещей кажется мне неправильным.
Исторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более корректно было запускать ее как su — — в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c «vim /etc/fstab» .
При этом доверенным пользователям приходилось помнить пароль root’а и у всех пользователей, перечисленных в группе «wheel» (т.е. в группе, члены которой могли выполнить команду su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.
Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers , см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью » sudo -i «
Стоит особо упомянуть о специальной команде sudoedit , безопасно запускающей редактор, указанный в переменной окружения $EDITOR . При более традиционной схеме редактирование файлов производилось примерно так:
Запускаемый таким образом vi наследовал оболочку с неограниченными правами и через :! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.
sudoedit проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе (который наследует права пользователя, а не root’а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.
В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo . Являясь полной заменой su , sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.
Поэтому предлагаю всем раз и навсегда запомнить:
что хотим сделать? | правильно | неправильно |
выполнить команду от имени root | sudo command | |
отредактировать файл от имени root | sudoedit file | |
получить оболочку root | sudo -i |
После первой публикации этой заметки мне было задано несколько вопросов. Из ответов получилось сделать мини-FAQ.
Q: как с помощью sudo сделать su -c «echo 1 > /etc/privileged_file» ? sudo echo 1 /etc/privileged_file ругается на «permission denied»
A: Это происходит потому, что только команда echo выполняется в повышенными правами, а результат перенаправляется в файл уже с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:
$ echo 1| sudo tee -a privileged_file >/dev/null
$ sudo -i # echo 1 > privileged_file # exit $
- по умолчанию sudo записывает всю пользовательскую активность в syslog-канал authpriv (как правило, результат кладется в файл /var/log/auth.log), а в su подобную фичу надо включать с помошью задания специального параметра в файле настроек, различающемся от дистрибутива к дистрибутиву ( SULOG_FILE в /etc/login.defs в Ubuntu Linux, /etc/login.conf и /etc/pam.d/su в FreeBSD и т.д.)
- в случае с su администратор системы не может ограничить команды, выполняемые пользователями, а в sudo — может
- если пользователь должен быть лишен права администрирования, в случае с su после удаления его из группы wheel он должен забыть пароль root’а; если используется sudo, достаточно вынести его из соответствующей группы (например, wheel или admin) и/или файла sudoers, если он был дополнительно настроен.
SUDO и SU
Обе команды sudo и su позволяют в Linux выполнить команду от любого пользователя, в том числе от root . Но есть между ними одно принципиальное различие.
- Для выполнения команды от имени другого пользователя с помощью su , вы должны указать пароль другого пользователя.
- Для выполнения команды от имени другого пользователя с помощью sudo , вы должны указать свой пароль.
SU
Команда su появилась раньше. При запуске без параметров она запрашивает пароль суперпользователя, при успехе подменяет имя текущего пользователя на root , оставляя текущие переменные окружения (почти все). Для запуска со всеми переменными окружения root:
- Можно забыть запустить su с нужными параметрами окружения.
- Пользователь должен знать все пароли от нужных ему юзеров. При увольнении сотрудника необходимо менять все пароли, которые он знал.
- root должен иметь пароль.
- По умолчанию не логирует действия пользователя.
- Невозможно определить кто именно запустил команду от имени другого пользователя.
- Нельзя ограничить права root .
SUDO
Команда sudo появилась позже и значительно усилила безопасность системы. Теперь не нужно раздавать пароли направо и налево. Можно тонко настраивать права доступа. Теперь root вообще можт не иметь пароля.
Для запуска со всеми переменными окружения root:
- Пользователь не должен знать чужие пароли, в том числе от root .
- По умолчанию логирует действия пользователя.
- Можно определить кто именно запустил команду от имени другого пользователя.
- Можно тонко настроить права.
- Можно запустить только одну команду с правами другого пользователя без переключения в чужую оболочку.
Послесловие
Правила хорошего тона: не мешайте в коде вместе sudo и su , лучше использовать sudo .
Если вы единственный администратор на сервере, то нет ничего зазорного в использовании su .
В Debian дистрибутивах root не имеет пароля, все административные действия должны производиться с помощью sudo или его графический аналог gksudo .
Команда sudo запоминает на 15 секунд (по умолчанию) введённый пароль, последующая команда этот пароль не запрашивает. Время сессии можно изменить.
Если вам понравилась статья, то ставьте 👍🏻 каналу. Пишите комментарии, задавайте вопросы, подписывайтесь.