X

sudo – делегируем полномочия

Задача sudo, дать обычному пользователю в Linux возможность выполнения команд от имени root или другого пользователя. Помимо этого ведется лог всех выполненных команд и аудит безопасности – неудачных доступов. Все выгоды использования sudo очевидны. Если пользователю необходимо выполнять некие задачи, для которых требуется root-доступ, нет необходимости давать ему пароль от суперпользователя. Можно просто задать доступ именно к необходимым функциям. При этом все его действия будут писаться в лог-файл и в случае необходимости можно всегда провести аудит.

Установка

В 90% случаев пакет уже установлен, но бывают редкие исключения. Но это легко исправить, установка не отличается от установки любого другого ПО.

Установка sudo в CentOS/RedHat и т.п.

с менеджером yum

yum install sudo

с dnf

dnf install sudo

Установка sudo в Debian/Ubuntu и т.д.

apt-get install sudo

Вводная информация

Для начала давайте создадим пользователей над которым будем ставить эксперименты (подробно про создание пользователей можно почитать тут – Пользователи в Linux — добавление, изменение, удаление):

useradd hc -m -G wheel
passwd hc

Сразу поместим нашего пользователя hc в группу wheel. Традиционно, в эту группу помещаются пользователи, которые будут иметь административный доступ. Это повелось еще с тех пор, когда основным инструментом для делегирования прав была команда su. Если интересуют подробности – поищите сами.

useradd user1 -m 
passwd user1

Второй пользователь нужен нам для разнообразия.

Файл конфигурации /etc/sudoers и visudo

Все настройки хранятся в файле /etc/sudoers. Файл этот не совсем обычный, даже под рутом просто так его отредактировать не получиться, т.к. запись в файл запрещена. Для работы с этим файлом есть специальная утилита visudo. Смысл такого ограничения вот в чем. Любая ошибка делает sudo неработоспособным, стоит ошибиться или описаться и получаете кучу проблем. Вы можете совсем лишиться доступа к административным функциям и придется пользоваться recovery mode для восстановления доступа. Это если у вас есть физический доступ к серверу. А если это VPS?

Что бы такое не происходило visudo при запуске блокирует файл sudoers и для редактирования открывает копию. При сохранении происходит проверка синтаксиса и если допущена ошибка – выдаст об этом предупреждение.

visudo: >>> /etc/sudoers: syntax error near line 28 <<<
What now?

В ответ введите:
e – откроет снова файл для исправления ошибки;
x – не сохранять изменения;
Q – сохранит файл не смотря на ошибки (так лучше не делать);

ВАЖНО! В некоторых “инструкция” которые можно найти предлагают делать следующее – сначала root разрешает запись в файл sudoers, что то типа:

chmod +w /etc/sudoers

потом просто редактируем файл и снимаем запись chmod -w. Ни когда так не делайте!
Чаше всего так советуют из нежелания пользоваться редактором vi, который запускается по умолчанию через visudo. Если вам не нравиться vi, его можно спокойно заменить на любой другой. Для этого в консоли выполните, например:

EDITOR=nano visudo

В этом случае запуститься редактор nano вместо vi.

Меняем редактор visudo

Если же хотите, назначить редактор на постоянную основу, переопределите значение EDITOR. Я обычно это делаю через пользовательский конфиг оболочки – для bash это ~/.bashrc. Добавьте в файл следующую строку:

export EDITOR=nano

Зайдите в сессию заново, выполните для проверки:

[root@hc ~]#  env | grep EDIT
EDITOR=nano

Если не хотите менять системный редактор, а задать только для visudo, добавьте в sudoers след. строки:

# Сбрасываем переменных окружения окружения
Defaults      env_reset
# Устанавливаем nano редактором по умолчанию и запрещаем использовать EDITOR/VISUAL из окружения
Defaults      editor=/usr/bin/nano, !env_editor

Использование

Давайте теперь рассмотрим использование sudo на конкретных примерах.

Активируем запись log-файла для sudo

Добавляем в конфигурационный файл след. строку:

Defaults logfile=/var/log/sudo.log

Теперь в этот файл будет писаться информация случаях некорректного использования sudo.

Разрешим пользователям группы wheel полный административный доступ.

Откройте конфигурационный файл и найдите строку:

# %wheel  ALL=(ALL)       ALL

уберите символ #, чтобы раскомментировать строку и сохраните файл. Если вдруг такой строки вы не нашли, то просто добавьте ее.

Для проверки зайдите на сервер пользователем hc и выполните sudo -s:

[hc@hc]~% sudo -s
[sudo] password for hc:
[root@hc]/home/hc#

Введя еще раз пароль от пользователя hc вы получите доступ к консоли с правами root.

Для сравнения залогиньтесь как user1 – получите что-то похожее:

[user1@hc]~% sudo -s
[sudo] password for user1:
user1 is not in the sudoers file.  This incident will be reported.

Посмотрим log-файл /var/log/sudo.log, увидим информацию, что user1 пытался использовать sudo, не имея на это прав:

Jul 28 16:00:55 : user1 : user NOT in sudoers ; TTY=pts/2 ; PWD=/home/user1 ;
    USER=root ; COMMAND=/bin/bash

Убираем запрос пароля при запуске команд через sudo

Для той же группы wheel:

%wheel        ALL=(ALL)       NOPASSWD: ALL

А ТЕПЕРЬ ВНИМАНИЕ! Ни когда не даем пользователю полного доступа, как в предыдущем примере и тем более, без ввода пароля, как описано в этом! Всегда давайте ровно столько, сколько надо!

Примеры безопасного делегирования прав

Разрешим user1 пользоваться yum (для Debian/Ubuntu заменить yum на apt-get), добавим строчку:

%user1  ALL=/usr/bin/yum

Теперь user1 может выполнить:

sudo yum install ineedthisprogram

и установить ту программу которая ему нужна.
Если же выполнить без добавления sudo:

yum install htop
Loaded plugins: fastestmirror
You need to be root to perform this command.

Создадим группу yumusers и добавим туда user1:

# groupadd yumusers
# usermod user1 -aG yumusers

Изменим строчку в sudores следующим образом:

%yumusers  ALL=/usr/bin/yum

Теперь все пользователи этой группы смогут пользоваться yum, а нового пользователя достаточно добавить в группу, не прописывая в конфиг.

Формат записей выделения прав

Давайте поподробнее разберем, что же значат все эти ALL. Структура строки следующая:

[пользователь | группа] [хост]=([кем может стать]) [что может сделать]

Т.е. запись:

%user1 ALL=(root) /usr/bin/yum, /user/bin/mount

означает – пользователь user1, на любом хосте, может от имени root запустить yum и mount, т.е. установить программу или примонтировать раздел.

Алиасы в sudo

В реальности, вряд ли вы ограничитесь только одной командой для одного пользователя. Скорее всего вам будет нужно выдать целый список доступов. Можно конечно каждый раз перечислять все через запятую, а можно и задать алиас. Что он из себя представляет:

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

и теперь вы можете написать:

%user1 ALL=(root) Cmnd_Alias

В sudoers уже созданы несколько алиасов на наиболее распространенные группы команд, их достаточно раскомментировать и можно использовать.

hc:

View Comments (2)

  • Спасибо огромное! Очень полезная статья!

  • Подскажите, пожалуйста, как можно дать права на редактирование файла, используя sudoers?