Один из основных способов обеспечить безопасность на сервере — дать возможность пользователям влиять только на собственную рабочую среду, а не на систему в целом. Такое разделение ответственности гарантирует, что никто из пользователей не сможет нанести ущерб конфигурации сервера или запускать команды, которые работают с защищёнными файлами.
Представим, что на нашем сервере работает несколько пользователей. Один из пользователей случайно удалил важные файлы, и сервер перестал работать. Второй поменял права на директории, и злоумышленники получили доступ к конфигурации вашей системы. Третий установил вредоносное ПО. Мы, как администратор, не сможем даже проверить журнал действий — каждый из пользователей свободно его удалит, сославшись на системную ошибку.
Чтобы избежать таких ситуаций, используется технология разделения прав доступа для разных учётных записей. Но администратор сервера всё ещё должен обладать всеми привилегиями, потому что он отвечает и за конфигурацию сервера, и за работу с пользователями.
Для таких случаев в unix-системах предусмотрен специальный пользователь root
. Особенность этой учётной записи в том, что на неё не действует ни одно ограничение, установленное на сервере. Если вы выполняете действия от пользователя root
, перед вами открываются все возможности по администрированию и настройке системы.
В этой статье расскажем о том, как получить права суперпользователя в Ubuntu и CentOS. Самое простое — зайти на сервер как root
:
ssh root@server.name
После того, как вы введёте пароль пользователя root
у вас появятся все привилегии, дополнительных действий предпринимать не нужно. Такой способ поможет вам сконфигурировать сервер сразу после того, как вы развернули его на timeweb.cloud, разбираться с настройкой прав и созданием пользователей можно позже.
Но работать под root
не рекомендуется — учётную запись root
принято использовать только для административных задач. Постоянно работать в этой оболочке опасно, потому что существует риск случайно нанести непоправимые изменения в конфигурацию системы. К тому же прямой доступ пользователя root
зачастую ограничивают.
VDS
Ещё один способ получить неограниченные привилегии — сменить текущего пользователя на root
. Это можно сделать с помощью команды смены пользователя su
(от англ. substitute user).
Чтобы войти в учётную запись root
, просто введите в консоли su
. После того, как вы введёте пароль, будет создан сеанс суперпользователя. Когда вы закончите все административные действия, не забудьте вернуться в оболочку обычного пользователя с помощью команды exit
.
su
cat journal.log
exit
Если вам нужно выполнить какое-то разовое действие с привилегиями суперпользователя, не нужно создавать новую оболочку. Вместо этого воспользуйтесь командой sudo
. Но в отличие от su
, вам нужно будет ввести пароль учётной записи текущего пользователя, а не root
.
Например, вам нужно прочитать лог-файл, который закрыт для обычных пользователей. Тогда просто добавьте перед командой чтения слово sudo
:
sudo cat journal.log
По умолчанию пользователи создаются в системе без доступа к sudo
. Это делается вручную с помощью добавления учётной записи к одноимённой группе:
usermod -aG sudo username
Или:
gpasswd -a username sudo
В CentOS группа с полными привилегиями администратора называется wheel
, значит вы можете использовать примеры выше, заменив sudo
на wheel
.
Настроить команду 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 у вас уже должен быть доступ к учётной записи суперпользователя. Откройте файл с помощью программы visudo
:
sudo visudo
В нашей оболочке откроется файл 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
от имени тех пользователей или групп, которых задали в файле sudoers
. Используйте для этого флаги -u
и -g
соответственно.
Чтобы посмотреть привилегии для вашего пользователя, просто используйте команду sudo -l
. Вы увидите список всех правил из файла /etc/sudoers
. Так вы поймёте, на что именно у вас есть разрешение в системе.
Выгодные тарифы на VDS/VPS
В этой статье мы рассмотрели, как пользоваться visudo, как редактировать файл sudoers
, настраивая его под нужды своей системы, а также разобрались, как задавать права sudo. Очень опасно предоставлять всем пользователям широкий спектр привилегий, потому что вред системе может быть непоправимым. Ограничьте доступ ко всем функциям и программам, которые не нужны пользователям, и оставьте только тот набор действий, который вы сможете держать под контролем.