sudo – делегируем полномочия
Задача
sudo
, дать обычному пользователю в Linux возможность выполнения команд от имени root или другого пользователя. Помимо этого ведется лог всех выполненных команд и аудит безопасности – неудачных доступов. Все выгоды использования
sudo
очевидны. Если пользователю необходимо выполнять некие задачи, для которых требуется root-доступ, нет необходимости давать ему пароль от суперпользователя. Можно просто задать доступ именно к необходимым функциям. При этом все его действия будут писаться в лог-файл и в случае необходимости можно всегда провести аудит.
Установка
В 90% случаев пакет уже установлен, но бывают редкие исключения. Но это легко исправить, установка не отличается от установки любого другого ПО.
Установка sudo в CentOS/RedHat и т.п.
с менеджером yum
1 | yum install sudo |
с dnf
1 | dnf install sudo |
Установка sudo в Debian/Ubuntu и т.д.
1 | apt-get install sudo |
Вводная информация
Для начала давайте создадим пользователей над которым будем ставить эксперименты (подробно про создание пользователей можно почитать тут – Пользователи в Linux — добавление, изменение, удаление):
1 2 | useradd hc-m-Gwheel passwd hc |
Сразу поместим нашего пользователя hc в группу wheel. Традиционно, в эту группу помещаются пользователи, которые будут иметь административный доступ. Это повелось еще с тех пор, когда основным инструментом для делегирования прав была команда
su
. Если интересуют подробности – поищите сами.
1 2 | useradd user1-m passwd user1 |
Второй пользователь нужен нам для разнообразия.
Файл конфигурации /etc/sudoers и visudo
Все настройки хранятся в файле
/etc/sudoers
. Файл этот не совсем обычный, даже под рутом просто так его отредактировать не получиться, т.к. запись в файл запрещена. Для работы с этим файлом есть специальная утилита
visudo
. Смысл такого ограничения вот в чем. Любая ошибка делает
sudo
неработоспособным, стоит ошибиться или описаться и получаете кучу проблем. Вы можете совсем лишиться доступа к административным функциям и придется пользоваться recovery mode для восстановления доступа. Это если у вас есть физический доступ к серверу. А если это VPS?
Что бы такое не происходило
visudo
при запуске блокирует файл
sudoers
и для редактирования открывает копию. При сохранении происходит проверка синтаксиса и если допущена ошибка – выдаст об этом предупреждение.
1 2 | visudo:>>>/etc/sudoers:syntax error near line28<<< What now? |
В ответ введите:
e
– откроет снова файл для исправления ошибки;
x
– не сохранять изменения;
Q
– сохранит файл не смотря на ошибки (так лучше не делать);
ВАЖНО! В некоторых “инструкция” которые можно найти предлагают делать следующее – сначала root разрешает запись в файл
sudoers
, что то типа:
1 | chmod+w/etc/sudoers |
потом просто редактируем файл и снимаем запись
chmod -w
. Ни когда так не делайте!
Чаше всего так советуют из нежелания пользоваться редактором vi, который запускается по умолчанию через
visudo
. Если вам не нравиться
vi
, его можно спокойно заменить на любой другой. Для этого в консоли выполните, например:
1 | EDITOR=nano visudo |
В этом случае запуститься редактор nano вместо vi.
Меняем редактор visudo
Если же хотите, назначить редактор на постоянную основу, переопределите значение EDITOR. Я обычно это делаю через пользовательский конфиг оболочки – для bash это
~/.bashrc
. Добавьте в файл следующую строку:
1 | export EDITOR=nano |
Зайдите в сессию заново, выполните для проверки:
1 2 | [root@hc~]# env | grep EDIT EDITOR=nano |
Если не хотите менять системный редактор, а задать только для visudo, добавьте в sudoers след. строки:
1 2 3 4 | # Сбрасываем переменных окружения окружения Defaults env_reset # Устанавливаем nano редактором по умолчанию и запрещаем использовать EDITOR/VISUAL из окружения Defaults editor=/usr/bin/nano,!env_editor |
Использование
Давайте теперь рассмотрим использование sudo на конкретных примерах.
Активируем запись log-файла для sudo
Добавляем в конфигурационный файл след. строку:
1 | Defaults logfile=/var/log/sudo.log |
Теперь в этот файл будет писаться информация случаях некорректного использования
sudo
.
Разрешим пользователям группы wheel полный административный доступ.
Откройте конфигурационный файл и найдите строку:
1 | # %wheel ALL=(ALL) ALL |
уберите символ
#
, чтобы раскомментировать строку и сохраните файл. Если вдруг такой строки вы не нашли, то просто добавьте ее.
Для проверки зайдите на сервер пользователем hc и выполните
sudo -s
:
1 2 3 | [hc@hc]~%sudo-s [sudo]password forhc: [root@hc]/home/hc# |
Введя еще раз пароль от пользователя hc вы получите доступ к консоли с правами root.
Для сравнения залогиньтесь как user1 – получите что-то похожее:
1 2 3 | [user1@hc]~%sudo-s [sudo]password foruser1: user1 isnotinthe sudoers file. Thisincident will be reported. |
Посмотрим log-файл
/var/log/sudo.log
, увидим информацию, что user1 пытался использовать sudo, не имея на это прав:
1 2 | Jul2816:00:55:user1:user NOTinsudoers;TTY=pts/2;PWD=/home/user1; USER=root;COMMAND=/bin/bash |
Убираем запрос пароля при запуске команд через sudo
Для той же группы wheel:
1 | %wheel ALL=(ALL) NOPASSWD:ALL |
А ТЕПЕРЬ ВНИМАНИЕ! Ни когда не даем пользователю полного доступа, как в предыдущем примере и тем более, без ввода пароля, как описано в этом! Всегда давайте ровно столько, сколько надо!
Примеры безопасного делегирования прав
Разрешим user1 пользоваться yum (для Debian/Ubuntu заменить yum на apt-get), добавим строчку:
1 | %user1 ALL=/usr/bin/yum |
Теперь user1 может выполнить:
1 | sudo yum install ineedthisprogram |
и установить ту программу которая ему нужна.
Если же выполнить без добавления sudo:
1 2 3 | yum install htop Loaded plugins:fastestmirror You need tobe root toperform thiscommand. |
Создадим группу yumusers и добавим туда user1:
1 2 | # groupadd yumusers # usermod user1 -aG yumusers |
Изменим строчку в
sudores
следующим образом:
1 | %yumusers ALL=/usr/bin/yum |
Теперь все пользователи этой группы смогут пользоваться yum, а нового пользователя достаточно добавить в группу, не прописывая в конфиг.
Формат записей выделения прав
Давайте поподробнее разберем, что же значат все эти ALL. Структура строки следующая:
1 | [пользователь|группа][хост]=([кемможетстать])[чтоможетсделать] |
Т.е. запись:
1 | %user1 ALL=(root)/usr/bin/yum,/user/bin/mount |
означает – пользователь user1, на любом хосте, может от имени root запустить yum и mount, т.е. установить программу или примонтировать раздел.
Алиасы в sudo
В реальности, вряд ли вы ограничитесь только одной командой для одного пользователя. Скорее всего вам будет нужно выдать целый список доступов. Можно конечно каждый раз перечислять все через запятую, а можно и задать алиас. Что он из себя представляет:
1 | Cmnd_Alias NETWORKING=/sbin/route,/sbin/ifconfig,/bin/ping,/sbin/dhclient,/usr/bin/net,/sbin/iptables,/usr/bin/rfcomm,/usr/bin/wvdial,/sbin/iwconfig,/sbin/mii-tool |
и теперь вы можете написать:
1 | %user1 ALL=(root)Cmnd_Alias |
В
sudoers
уже созданы несколько алиасов на наиболее распространенные группы команд, их достаточно раскомментировать и можно использовать.
00:06
Спасибо огромное! Очень полезная статья!
08:55
Подскажите, пожалуйста, как можно дать права на редактирование файла, используя sudoers?