Как отредактировать файл sudoers

Введение

Разделение привилегий является одним из фундаментальных парадигм безопасности, реализованных в операционных системах Linux и Unix-подобных. Обычные пользователи действуют с ограниченными привилегиями, чтобы уменьшить область их влияния только на их собственное окружение, а не на всю операционную систему.

A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.

В этой статье мы обсудим, как правильно и безопасно получить привилегии root, с особым акцентом на редактировании файла /etc/sudoers.

Мы будем выполнять эти шаги на сервере Ubuntu 20.04, но большинство современных дистрибутивов Linux, таких как Debian и CentOS, должны работать аналогичным образом.

Это руководство предполагает, что вы уже выполнили начальную настройку сервера, описанную здесь. Войдите на свой сервер как обычный, не root пользователь и продолжайте ниже.Примечание: В этом руководстве подробно рассматривается эскалация привилегий и файл sudoers. Если вы просто хотите добавить привилегии sudo для пользователя, ознакомьтесь с нашими быстрыми учебниками по Как создать нового пользователя с включенными правами sudo для Ubuntu и CentOS.

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

Как получить привилегии root

Существует три основных способа получения привилегий root, которые различаются по уровню сложности.

Вход под именем root

Самый простой и прямой метод получения привилегий root – это непосредственно войти на сервер как пользователь root.

Если вы входите на локальный компьютер (или используете функцию консоли вне полосы пропускания на виртуальном сервере), введите root в качестве вашего имени пользователя при входе и введите пароль root при запросе.

Если вы подключаетесь по SSH, укажите пользователя root перед IP-адресом или доменным именем в строке подключения SSH:

  1. ssh root@server_domain_or_ip

Если для пользователя root не настроены SSH-ключи, введите пароль root при запросе.

Использование su для становления Root

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

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

Мы можем сделать это, вызвав команду su, которая означает “заменить пользователя”. Чтобы получить привилегии root, введите:

  1. su

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

Когда вы выполните задачи, требующие привилегий root, вернитесь к своей обычной оболочке, набрав:

  1. exit

Использование sudo для выполнения команд от имени Root

Конечный способ получения root привилегий, который мы рассмотрим, – это команда sudo.

Команда sudo позволяет вам выполнять одиночные команды с root привилегиями, не требуя создания нового shell. Она выполняется следующим образом:

  1. sudo command_to_execute

В отличие от su, команда sudo запрашивает пароль текущего пользователя, а не root пароль.

Из-за своих последствий для безопасности, доступ sudo не предоставляется пользователям по умолчанию и должен быть настроен до того, как он будет работать правильно. Ознакомьтесь с нашими Как создать нового пользователя с возможностью sudo руководствами по быстрому старту для Ubuntu и CentOS, чтобы узнать, как настроить пользователя с возможностью sudo.

В следующем разделе мы рассмотрим, как более подробно изменить конфигурацию sudo.

Что такое Visudo?

Команда sudo настраивается через файл, расположенный по адресу /etc/sudoers.

Внимание: Никогда не редактируйте этот файл с помощью обычного текстового редактора! Всегда используйте команду visudo вместо этого!

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

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

Традиционно, visudo открывает файл /etc/sudoers с помощью текстового редактора vi. Однако в Ubuntu настроено использование текстового редактора nano вместо vi.

Если вы хотите вернуться к vi, выполните следующую команду:

  1. sudo update-alternatives --config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual mode Press <enter> to keep the current choice[*], or type selection number:

Выберите номер, соответствующий выбору, который вы хотите сделать.

На CentOS вы можете изменить это значение, добавив следующую строку в ваш ~/.bashrc:

  1. export EDITOR=`which name_of_editor`

Источник файла для реализации изменений:

  1. . ~/.bashrc

После того, как вы настроили visudo, выполните команду для доступа к файлу /etc/sudoers:

  1. sudo visudo

Как изменить файл sudoers

Вам будет предложен файл /etc/sudoers в вашем выбранном текстовом редакторе.

I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers file has many more lines, some of which we will not discuss in this guide.

/etc/sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d

Давайте рассмотрим, что делают эти строки.

По умолчанию строки

Первая строка, Defaults env_reset, сбрасывает окружение терминала, чтобы удалить любые переменные пользователя. Это мера безопасности, используемая для очистки потенциально вредных переменных окружения из сеанса sudo.

Вторая строка, Defaults mail_badpass, сообщает системе, чтобы она отправляла уведомления о плохих попытках пароля sudo на настроенный адрес mailto пользователя. По умолчанию это аккаунт root.

Третья строка, которая начинается с Defaults secure_path=..., указывает путь PATH (места в файловой системе, где операционная система будет искать приложения), который будет использоваться для операций sudo. Это предотвращает использование вредных пользовательских путей.

Строки привилегий пользователя

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

  • root ALL=(ALL:ALL) ALL
    Первое поле указывает имя пользователя, к которому будет применяться правило (root).

  • root ALL=(ALL:ALL) ALL
    Первое “ALL” указывает, что это правило применяется ко всем хостам.

  • root ALL=(ALL:ALL) ALL
    Это “ALL” указывает, что root пользователь может запускать команды от имени всех пользователей.

  • root ALL=(ALL:ALL) ALL
    Это “ALL” указывает, что root пользователь может запускать команды от имени всех групп.

  • root ALL=(ALL:ALL) ALL
    Последнее “ALL” указывает, что эти правила применяются ко всем командам.

Это означает, что наш root пользователь может запускать любую команду с помощью sudo, при условии, что они предоставляют свой пароль.

Групповые привилегированные строки

Следующие две строки похожи на строки привилегий пользователя, но они определяют правила sudo для групп.

Имена, начинающиеся с %, указывают на имена групп.

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

Включенная строка /etc/sudoers.d

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

/etc/sudoers
. . .

#includedir /etc/sudoers.d

Она действительно начинается с #, который обычно указывает на комментарий. Однако эта строка на самом деле указывает, что файлы в директории /etc/sudoers.d будут прочитаны и применены также.

Файлы в этой директории следуют тем же правилам, что и файл /etc/sudoers сам по себе. Любые файлы, которые не заканчиваются на ~ и в которых нет ., будут прочитаны и добавлены к конфигурации sudo.

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

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

  1. sudo visudo -f /etc/sudoers.d/file_to_edit

Как предоставить пользователю привилегии sudo

Наиболее распространенная операция, которую пользователи хотят выполнить при управлении разрешениями sudo, – это предоставить новому пользователю общее доступ sudo. Это полезно, если вы хотите предоставить учетной записи полный административный доступ к системе.

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

Например, в Ubuntu 20.04 группа sudo имеет полные административные привилегии. Мы можем предоставить пользователю те же привилегии, добавив их в группу следующим образом:

  1. sudo usermod -aG sudo username

Команда gpasswd также может быть использована:

  1. sudo gpasswd -a username sudo

Оба этих метода будут иметь одинаковый эффект.

На CentOS обычно это группа wheel, а не группа sudo:

  1. sudo usermod -aG wheel username

Или, используя gpasswd:

  1. sudo gpasswd -a username wheel

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

  1. sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

Как Настроить Пользовательские Правила

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

Как Создать Псевдонимы

Файл sudoers можно организовать более удобно, объединяя вещи с помощью различных типов “псевдонимов”.

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

/etc/sudoers
. . .
User_Alias		GROUPONE = abby, brent, carl
User_Alias		GROUPTWO = brent, doris, eric,
User_Alias		GROUPTHREE = doris, felicia, grant
. . .

Имена групп должны начинаться с прописной буквы. Затем мы можем разрешить членам GROUPTWO обновлять базу данных apt, создав правило, например:

/etc/sudoers
. . .
GROUPTWO	ALL = /usr/bin/apt-get update
. . .

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

Мы можем разрешить членам GROUPTHREE выключать и перезагружать машину, создав “псевдоним команды” и используя это в правиле для GROUPTHREE:

/etc/sudoers
. . .
Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE	ALL = POWER
. . .

Мы создаем псевдоним команды под названием POWER, который содержит команды для выключения и перезагрузки машины. Затем мы разрешаем членам GROUPTHREE выполнять эти команды.

Мы также можем создавать псевдонимы “Run as”, которые могут заменить часть правила, указывающую пользователя для выполнения команды:

/etc/sudoers
. . .
Runas_Alias		WEB = www-data, apache
GROUPONE	ALL = (WEB) ALL
. . .

Это позволит любому, кто является членом GROUPONE, выполнять команды от имени пользователя www-data или пользователя apache.

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

Как заблокировать правила

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

Команда updatedb, связанная с пакетом mlocate, относительно безобидна на однопользовательской системе. Если мы хотим разрешить пользователям выполнять ее с привилегиями root без необходимости вводить пароль, мы можем создать правило, как это:

/etc/sudoers
. . .
GROUPONE	ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD – это “тег”, означающий, что пароль не будет запрошен. Существует команда-компаньон под названием PASSWD, которая является поведением по умолчанию. Тег актуален для остальной части правила, если он не переопределен своим “двойственным” тегом далее в строке.

Например, у нас может быть такая строка:

/etc/sudoers
. . .
GROUPTWO	ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

Еще один полезный тег – NOEXEC, который можно использовать для предотвращения некоторых опасных действий в определенных программах.

Например, некоторые программы, такие как less, могут порождать другие команды, набирая это из своего интерфейса:

!command_to_run

Это в основном выполняет любую команду, которую пользователь ему дает, с теми же разрешениями, под которыми работает less, что может быть довольно опасным.

Чтобы ограничить это, мы могли бы использовать такую строку:

/etc/sudoers
. . .
username	ALL = NOEXEC: /usr/bin/less
. . .

Разное

Есть еще несколько кусочков информации, которые могут быть полезны при работе с sudo.

Если вы указали пользователя или группу для “работы как” в конфигурационном файле, вы можете выполнять команды от имени этих пользователей, используя флаги -u и -g соответственно:

  1. sudo -u run_as_user command
  2. sudo -g run_as_group command

Для удобства по умолчанию sudo сохраняет ваши учетные данные на определенное время в одном терминале. Это означает, что вам не придется снова вводить пароль до тех пор, пока таймер не истечет.

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

  1. sudo -k

Если, с другой стороны, вы хотите “подготовить” команду sudo, чтобы вас не попросили позже, или обновить ваш sudo лизинг, вы всегда можете набрать:

  1. sudo -v

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

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

  1. sudo -l

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

Множество раз вы будете выполнять команду, и она будет завершаться неудачно, потому что вы забыли предварять ее sudo. Чтобы избежать необходимости перепечатывать команду, вы можете воспользоваться функциональностью bash, которая означает “повтори последнюю команду”:

  1. sudo !!

Двойной восклицательный знак повторит последнюю команду. Мы предшествовали ему sudo, чтобы быстро изменить непривилегированную команду на привилегированную.

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

  1. sudo visudo
/etc/sudoers
. . .
Defaults	insults
. . .

Это заставит sudo возвращать глупую оскорбление, когда пользователь вводит неправильный пароль для sudo. Мы можем использовать sudo -k для очистки предыдущего кэшированного пароля sudo, чтобы попробовать это:

  1. sudo -k
  2. sudo ls
Output
[sudo] password for demo: # enter an incorrect password here to see the results Your mind just hasn't been the same since the electro-shock, has it? [sudo] password for demo: My mind is going. I can feel it.

Заключение

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file