Командная строка Linux, повышение привилегий: команды su, sudo
Приветствую!

Продолжаем изучать командную строку Linux. Сегодня узнаем, как правильно запускать команды от имени другого пользователя, в том числе пользователя root. Познакомимся с командами su и sudo, а также изучим, как правильно предоставлять ограниченные полномочия для пользователей и групп.

Заодно разберем, почему sudo su – это как сказать: « Откройте мне дверь «, а потом еще раз потребовать: « И впустите меня немедленно!«😁.

Если вы новичок в мире Linux, то рекомендую изучить мои предыдущие статьи по командной строке:

Предисловие

Тема привилегий в Linux очень обширна. В данной статье мы только разберем работу с командами su и sudo, как наиболее популярными инструментами. Но существует также множество других механизмов, например capabilities, SELinux, AppArmor и в целом PolicyKit, ну и конечно ACL (Access Control Lists). Голову сломать можно, только от разнообразия🤯.

И так, приступим.

Команда su

su  (S ubstitute  U ser или  S et  U ID или  S witch  U ser или  S uper  U ser   — замена/переключение пользователя, суперпользователь) — это классическая команда и одноименная утилита в Unix -подобных операционных системах, позволяющая пользователю войти в систему под другим именем, не завершив текущий сеанс. Чаще всего используется для выполнения некоторых команд или временного входа с правами суперпользователя с целью выполнения административных задач. Просто и понятно 😉.

Автором данной программы является Dennis Ritchie. Если верить англоязычной википедии, то первый релиз данной утилиты был 3 ноября, 1971 года. Почти 53 года назад😲. И несмотря на это, она до сих пор пользуется популярностью. Вот уж прям, философия Unix в действии: « программа должна выполнять одну задачу и делать это хорошо «.

И так синтаксис:

BASH
su [ключи] [-] [имя_пользователя]
Нажмите, чтобы развернуть и увидеть больше

Если не передать команде имя пользователя явно, будет использовано имя root.

Особенностью команды является запрос пароля при каждом ее выполнении. Только если она уже не выполняется от имени root пользователя.

Часто используемые ключи:

Приступим к практике. Если ввести в терминал:

BASH
su -
Нажмите, чтобы развернуть и увидеть больше

У нас запросят пароль суперпользователя root, после чего мы переключимся на него.

Если команде явно передать имя желаемого пользователя, например:

BASH
su - ivan
Нажмите, чтобы развернуть и увидеть больше

То, соответственно, мы активируем сеанс оболочки от его имени.

Существует принципиальная разница, между указанием ключа - или -l и его отсутствием. Если ключ не указать, то при переходе на другого пользователя, ваш текущий рабочий каталог и часть окружения пользователя (env) не изменятся. Вот пример:

BASH
whoami

echo $USER

su

whoami

echo $USER
Нажмите, чтобы развернуть и увидеть больше

Тут видно, что после перехода под учетную запись суперпользователя, переменная окружения $USER, содержащая имя текущего пользователя, не обновилась. Про этот нюанс необходимо помнить, особенно при написании скриптов, если в них используется команда su.

Теперь попробуем выполнить единичную команду, без смены пользователя:

BASH
su -c 'whoami'
Нажмите, чтобы развернуть и увидеть больше

А теперь с использованием дефиса:

BASH
su -c 'pwd'

su - -c 'pwd'
Нажмите, чтобы развернуть и увидеть больше

Надеюсь, разницу вы поняли. Ну и еще парочку примеров для закрепления.

С дефисом:

BASH
su -

su - ivan -c 'whoami'
Нажмите, чтобы развернуть и увидеть больше

Без:

BASH
su -c 'whoami && pwd'
Нажмите, чтобы развернуть и увидеть больше

Команда sudo

sudo  (англ. S ubstitute  U ser and  do, дословно «подменить пользователя и выполнить») — также является командой и одноименной утилитой, позволяющей делегировать определенные привилегированные ресурсы пользователям с ведением журнала их действий.

И я почти все время думал, что sudo = super user do 😳

sudo поставляется с большинством UNIX и UNIX-подобных операционных систем, но, к примеру, «чистый» Debian в этот список не входит. В случае данного дистрибутива, утилиту sudo необходимо устанавливать отдельно!

В отличие от классической su, sudo предоставляет более гибкие инструменты для настройки повышения привилегий. Чаще всего, с помощью sudo, задают четкий перечень команд, доступных для выполнения от имени другого пользователя, в т.ч. root.

Синтаксис:

BASH
sudo [ключи] команда
Нажмите, чтобы развернуть и увидеть больше

Часто используемые ключи:

Ну а практику мы начнем, пожалуй, с одной распространенной, но весьма комичной ситуации — когда для получения root полномочий используют команду:

BASH
sudo su
Нажмите, чтобы развернуть и увидеть больше

По сути, в ней нет ничего страшного, но она неверна в синтаксическом плане.

Вместо нее рекомендуется использовать следующие команды:

BASH
sudo -s

# или

sudo -i

# или

su -
Нажмите, чтобы развернуть и увидеть больше

Дело в том, что при выполнении sudo su вы создаете лишний процесс. Получается одновременный запуск двух разных команд.

Для демонстрации, выполним:

BASH
sudo su

ps

exit

sudo -s

ps
Нажмите, чтобы развернуть и увидеть больше

Как видно в верхней части скрина, на один процесс больше🤷♂️.

Теперь попробуем выполнить отдельную команду, без перехода на другого пользователя:

BASH
sudo -u postgres 'whoami'
Нажмите, чтобы развернуть и увидеть больше

А чтобы перейти в оболочку другого пользователя (аналог su - <пользователь>) выполним:

BASH
sudo -iu postgres

whoami

pwd
Нажмите, чтобы развернуть и увидеть больше

В таком случае и рабочая директория и окружение будут целевого пользователя.

Файлы sudoers

Плавно подходим в основной фишке утилиты sudo — файлы sudoers. Это такие файлы, в которых следуя правилам строгого синтаксиса, можно тонко настроить разграничение полномочий для пользователей и групп.

Основной файл конфигурации расположен по пути: /etc/sudoers. Обычно он уже заполнен дефолтными и прокомментированными значениями.

По умолчанию, в данном файле уже заданы максимальные привилегии для группы sudo в Deb системах (Debian, Ubuntu, Linux Mint) и wheel для RPM (RHEL, Centos, Fedora, OpenSuse).

Пользователи такой группы имеют возможность выполнять переход в учетную запись root.

Для проверки выполните:

BASH
sudo cat /etc/sudoers

groups
Нажмите, чтобы развернуть и увидеть больше

Чтобы расширить стандартную конфигурацию sudo, рекомендуется создавать отдельные файлы в директории /etc/sudoers.d. Часто в разных дистрибутивах, там уже есть какие-то файлы. Например в Linux Mint лежит:

BASH
ls -l /etc/sudoers.d
Нажмите, чтобы развернуть и увидеть больше

Создавать такие файлы рекомендуется с помощью специальной команды visudo, которая перед сохранением файла проверяет его синтаксис, и в случае ошибки выводит предупреждение.

Давайте создадим такой файл. Но сперва выберем консольный редактор по умолчанию такой командой (для Deb систем):

BASH
sudo update-alternatives --config editor
Нажмите, чтобы развернуть и увидеть больше

Разумеется мы выбираем 😉, потому что я давненько не перезагружал компьютер😁

Теперь создадим файл с перечнем доступных команд для УЗ из примера выше — postgres и группы — ivan:

BASH
sudo visudo -f /etc/sudoers.d/postgres
Нажмите, чтобы развернуть и увидеть больше

Пример наполнения может быть такой:

BASH
Cmnd_Alias PG = \ 
    /usr/sbin/ldconfig, \ 
    /usr/sbin/setcap CAP_NET_ADMIN\,CAP_NET_BIND_SERVICE+epi /usr/lib/postgresql/16/bin/postgres, \ 
    /usr/bin/systemctl status postgresql, \
    /usr/bin/systemctl start postgresql, \
    /usr/bin/systemctl stop postgresql, \
    /usr/bin/systemctl restart postgresql, \
    /usr/bin/journalctl * postgresql, \
    /usr/bin/cat /var/log/auth.log

postgres ALL = (root) NOPASSWD: PG
%ivan ALL = (postgres) NOPASSWD: ALL
Нажмите, чтобы развернуть и увидеть больше

Сами команды я расписывать не буду, опишу лишь директивы sudoers:

Сохраняем и выходим из редактирования.

Если допустить ошибку, вы увидите такое сообщение с указанием места, где ошиблись:

Введите e и нажмите Enter для возврата в редактор. Про букву e нужно знать, т.к. никаких подсказок программа не дает, сурово однако🤔.

Если все заполнили корректно, то visudo позволит сохранить файл и закрыть редактор.

В примере выше, мы настроили полный доступ к пользователю postgres для членов группы ivan. А ему (postgres) в свою очередь, разрешили выполнять строгий перечень команд от имени root.

Проверяем:

BASH
sudo -l

sudo -iu postgres

sudo -l
Нажмите, чтобы развернуть и увидеть больше

При вводе разрешенной команды, она просто выполнится🤷♂️. А при использовании команды не из разрешенного списка и если ваш пользователь не добавлен в админскую группу (sudo или wheel), утилита sudo ожидаемо запретит ее выполнение. Пример:

BASH
sudo systemctl status postgresql

sudo systemctl enable postgresql
Нажмите, чтобы развернуть и увидеть больше

Ну вот, вроде все рассказал.

Ах да, совсем недавно я узнал, что при использовании sudo, переменная окружения $PATH становится неактуальной. Для утилиты sudo задается специальная директива secure_path в файле /etc/sudoers со списком директорий, где хранятся исполняемые файлы:

BASH
Defaults  secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/opt/bin"
Нажмите, чтобы развернуть и увидеть больше

Теперь и вы знаете об этом☺️.

Просмотр журнала событий sudo

По умолчанию программа sudo записывает свои действия в системный журнал, он же syslog. В дистрибутивах Linux, использующих систему инициализации systemd посмотреть журнал действий, связанных с sudo можно с помощью утилиты journalctl:

BASH
sudo journalctl | grep -i sudo
Нажмите, чтобы развернуть и увидеть больше

Если необходимо смотреть использование sudo в реально времени — добавльте ключ -f или --follow:

BASH
sudo journalctl --follow | grep -i sudo
Нажмите, чтобы развернуть и увидеть больше

Обратите внимание, что в лог попадают также и выполняемые команды.

Если вам необходимо сохранять журнал действий в файл, то настроить это можно добавлением соответствующего параметра в основной файл конфига /etc/sudoers. Открываем его на редактирование командой:

BASH
sudo -E visudo
Нажмите, чтобы развернуть и увидеть больше

И добавляем строку:

PLAINTEXT
Defaults    logfile="/var/log/sudo.log"
Нажмите, чтобы развернуть и увидеть больше

Сохраняем файл и закрываем редактор. На всякий случай проверяем права на файл журнала:

BASH
sudo ls -l /var/log/sudo.log
Нажмите, чтобы развернуть и увидеть больше

Должно быть так:

Если нет, установите ограниченные права вручную:

BASH
sudo chmod 600 /var/log/sudo.log
Нажмите, чтобы развернуть и увидеть больше

Если вам необходимо записывать вывод пыполняемых с помощью sudo команд, то аналогичным образом добавьте в файл /etc/sudoers такую настройку логирования:

PLAINTEXT
Defaults    log_input, log_output
Нажмите, чтобы развернуть и увидеть больше

Теперь после каждой выполненной с помощью sudo команды, весь ее вывод будет сохраняться в директории /var/log/sudo-io.

Для просмотра сохраненного вывода используется специальная команда sudoreplay (чертова магия). Пример просмотра первой сохраненной команды:

BASH
sudo head -n15 /etc/sudoers

sudo sudoreplay /var/log/sudo-io/00/00/01
Нажмите, чтобы развернуть и увидеть больше

Стоит вас предупредить, что в таком режиме записываются даже сеансы псевдографических программ, таких как консольные редакторы (vim, nano) и визуализаторы (top, htop), что может быстро заполнить дисковое пространство.

Послесловие

Мы с вами сделали еще один шаг на пути изучения командной строки Linux. Как я уже сказал в начале статьи, тема привилегий, да и безопасности в целом, в мире Linux — очень обширна и будет всегда актуальной. Поэтому старайтесь уделять время не только изучению каких-то технологий, но и их безопасному использованию.

Спасибо, что читаете. Успехов вам! И старайтесь все делать со здравой толикой безопасности.

Полезные материалы

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/linux/komandnaya-stroka-linux-povyshenie-privilegij-komandy-su-sudo/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша