Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Редактирование файла Sudoers

Никита Кулижников
Никита Кулижников
Технический писатель
07 апреля 2022 г.
6672
9 минут чтения
Средний рейтинг статьи: 5

New Documentation

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

Редактирование Файла Sudoers (1)

Представим, что на нашем сервере работает несколько пользователей. Один из пользователей случайно удалил важные файлы, и сервер перестал работать. Второй поменял права на директории, и злоумышленники получили доступ к конфигурации вашей системы. Третий установил вредоносное ПО. Мы, как администратор, не сможем даже проверить журнал действий — каждый из пользователей свободно его удалит, сославшись на системную ошибку.

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

Для таких случаев в unix-системах предусмотрен специальный пользователь root. Особенность этой учётной записи в том, что на неё не действует ни одно ограничение, установленное на сервере. Если вы выполняете действия от пользователя root, перед вами открываются все возможности по администрированию и настройке системы. 

В этой статье расскажем о том, как получить права суперпользователя в Ubuntu и CentOS. Самое простое — зайти на сервер как root

ssh root@server.name 

После того, как вы введёте пароль пользователя root у вас появятся все привилегии, дополнительных действий предпринимать не нужно. Такой способ поможет вам сконфигурировать сервер сразу после того, как вы развернули его на timeweb.cloud, разбираться с настройкой прав и созданием пользователей можно позже.

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

Смена пользователя на root

Ещё один способ получить неограниченные привилегии — сменить текущего пользователя на root. Это можно сделать с помощью команды смены пользователя su (от англ. substitute user). 

Чтобы войти в учётную запись root, просто введите в консоли su. После того, как вы введёте пароль, будет создан сеанс суперпользователя. Когда вы закончите все административные действия, не забудьте вернуться в оболочку обычного пользователя с помощью команды exit.

su
cat journal.log
exit

Запуск команды от пользователя root

Если вам нужно выполнить какое-то разовое действие с привилегиями суперпользователя, не нужно создавать новую оболочку. Вместо этого воспользуйтесь командой sudo. Но в отличие от su, вам нужно будет ввести пароль учётной записи текущего пользователя, а не root.

Например, вам нужно прочитать лог-файл, который закрыт для обычных пользователей. Тогда просто добавьте перед командой чтения слово sudo:

sudo cat journal.log

Присвоение привилегий sudo

По умолчанию пользователи создаются в системе без доступа к sudo. Это делается вручную с помощью добавления учётной записи к одноимённой группе:

usermod -aG sudo username 

Или: 

gpasswd -a username sudo

В CentOS группа с полными привилегиями администратора называется wheel, значит вы можете использовать примеры выше, заменив sudo на wheel

Image3

Настройка sudo

Настроить команду sudo можно в файле /etc/sudoers, в нём хранятся все нужные параметры. Этот файл напрямую влияет на работу системы, если он сконфигурирован неправильно или содержит ошибки синтаксиса, система может начать работать некорректно. 

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

Работать с файлом sudoers вы можете в любом удобном текстовом редакторе. По умолчанию visudo открывает vi (в Ubuntu — nano), но может работать и с другими. Для этого выберете нужный вариант с помощью команды update-alternatives:

sudo update-alternatives --config editor

В CentOS задать редактор по умолчанию ещё проще — в ~/.bashrc нужно добавить строку:

export EDITOR=`which [editor]`

где [editor] — название программы-редактора.

После того, как вы определились с редактором, в котором вам удобно работать с файлом, можно приступать к настройке sudo.

Изменение файла sudoers 

Для работы с файлом sudoers у вас уже должен быть доступ к учётной записи суперпользователя. Откройте файл с помощью программы visudo:

sudo visudo

Image2

В нашей оболочке откроется файл sudoers. По умолчанию он состоит из нескольких групп строк. 

Настройки по умолчанию

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

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

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

secure_path определяет путь для операций sudo. Иными словами, она содержит каталоги, в которых ОС будет искать приложения. Переопределяя пользовательские настройки, мы избегаем выполнения потенциально вредоносных программ.

Вы можете добавлять настройки по умолчанию с помощью псевдонима Default. Например, если у вас сложный пароль, вы можете расширить количество попыток ввода с трёх (по умолчанию) до 5. 

Defaults passwd_tries=5

Sudo сохраняет данные сеанса в течение 5 минут после первой аутентификации. Это сделано, чтобы вам не нужно было каждый раз при выполнении программ вводить пароль. Вы можете сбросить форсировать запрос пароля с помощью флага -k при выполнении команды sudo. Если нужно вводить пароль каждый раз, установите значение этого таймаута 0.

Defaults timestamp_timeout=0 

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

Defaults passwd_timeout=5
Defaults logfile=/var/log/sudo.journal.log

Пользовательские привилегии

Четвёртая строка определяет привилегии sudo для root. Она содержит имя пользователя, список хостов, пользователей, групп и команд. 

root    ALL=(ALL:ALL) ALL

Рассмотрим внимательнее, как она расшифровывается. В начале стоит имя пользователя, затем указываются его привилегии. Первое ALL означает, что правило применяется ко всем хостам и IP-адресам. Второе ALL указывает на то, что пользователь может запускать команды от имени любого пользователя, третье — от имени любой группы. Четвёртое ALL применяет эти правила ко всем командам.

То есть эта строка означает, что пользователь root может выполнять любые команды от лица всех групп и пользователей после ввода sudo

Пятая и шестая строки определяют привилегии для групп admin и sudo (на это указывает символ процента перед названием). По умолчанию группа admin может выполнять любые команды от имени любого пользователя, а sudo — любые команды от лица любой группы. 

Добавим новые полномочия для пользователя timeweb-backup, которому нужно выполнять команду монтирования директории root/backup.d. Для этого добавим следующую строку:

timeweb-backup ALL=(root) /bin/mount /root/backup.d

Теперь пользователь timeweb-backup сможет запустить команду sudo mount /root/backup.d со своим паролем, а не с паролем пользователя root

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

Подключение других файлов

Строка, которая начинается с #includedir означает подключение конфигурации из других источников. В данном случае указано, что нужно применить правила из файлов внутри каталога /etc/sudoers.d, при этом подключается любой файл, если он не содержит в названии точку или не заканчивается тильдой (~). 

Подключение файлов из этого каталога нужно для приложений, которые после установки изменяют привилегии sudo. Все файлы в одном каталоге помогают определить какие права соответствуют учётным записям, а также работать с ними, не редактируя основной файл sudoers.

Так как все файлы из этого каталога подключаются в основной файл, редактировать их нужно с помощью visudo. Для того, чтобы открыть отдельный файл, добавьте флаг -f:

visudo -f /etc/sudoers.d/config_file

Псевдонимы

Чтобы упростить работу с конфигурацией файла sudoers, разработчики предусмотрели псевдонимы. Они позволяют создавать списки пользователей, флагов и команд и группировать их. Они делятся на четыре типа:

User_Alias. Псевдоним пользователей, которые будут использовать sudo.

Runas_Alias. Псевдоним пользователей, от имени которых команды будут выполняться.

Host_Alias. Псевдоним хоста. Представляет собой список IP-адресов или хостов, с которых выполняются программы. 

Cmnd_Alias. Псевдоним команды.

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

User_Alias Users = timeweb-backup,remote,hal9000 
Host_Alias REMOTE = timeweb.cloud

Cmd_Alias Cmds = /root/backup

После создания псевдонима применяем правило:

Users Hosts = (root) Cmds

Теперь пользователи timeweb-backup, remote, hal9000 смогут запускать команды бэкапа от имени пользователя root на хосте REMOTE

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

Users ALL = (root) NOPASSWD: /bin/mount

…а размонтировать уже нельзя:

Users ALL = (root) NOEXEC: /bin/umount

В нашей системе мы можем разрешить всем пользователям группы admin обновлять пакеты Ubuntu, но без ввода пароля:

Cmnd_Alias APT_UPDATE = /usr/bin/apt-get update,/usr/bin/apt-get upgrade
...
%admin ALL=(ALL) NOPASSWD: APT_UPDATE

Псевдонимы помогут эффективно делить пользователей на группы и выдавать им права (или забирать их с помощью флага NOEXEC) на выполнение только определённых команд.

В случае конфликта правил в приоритете более поздние. Так что располагайте в начале файла более общие установки, чем конкретнее правило, тем ниже его стоит расположить.

Флаги sudo

Вы можете запускать команды sudo от имени тех пользователей или групп, которых задали в файле sudoers. Используйте для этого флаги -u и -g соответственно. 

Чтобы посмотреть привилегии для вашего пользователя, просто используйте команду sudo -l. Вы увидите список всех правил из файла /etc/sudoers. Так вы поймёте, на что именно у вас есть разрешение в системе.  

Заключение

В этой статье мы рассмотрели, как пользоваться visudo, как редактировать файл sudoers, настраивая его под нужды своей системы, а также разобрались, как задавать права sudo. Очень опасно предоставлять всем пользователям широкий спектр привилегий, потому что вред системе может быть непоправимым. Ограничьте доступ ко всем функциям и программам, которые не нужны пользователям, и оставьте только тот набор действий, который вы сможете держать под контролем.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону