Введение
Разделение привилегий является одним из фундаментальных парадигм безопасности, реализованных в операционных системах 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
для пользователя, ознакомьтесь с нашими быстрыми учебниками по
Примечание: В этом руководстве подробно рассматривается вопрос повышения привилегий и файл sudoers
. Если вы хотите просто добавить привилегии sudo
для пользователя, ознакомьтесь с нашими быстрыми руководствами по созданию нового пользователя с привилегиями sudo для Ubuntu и CentOS.
Как получить привилегии root
Существует три основных способа получения привилегий root, которые различаются по уровню сложности.
Вход под именем root
Самый простой и прямой метод получения привилегий root – это непосредственно войти на сервер как пользователь root.
Если вы входите на локальный компьютер (или используете функцию консоли вне полосы пропускания на виртуальном сервере), введите root
в качестве вашего имени пользователя при входе и введите пароль root при запросе.
Если вы подключаетесь по SSH, укажите пользователя root перед IP-адресом или доменным именем в строке подключения SSH:
Если для пользователя root не настроены SSH-ключи, введите пароль root при запросе.
Использование su
для становления Root
Прямое логирование как root обычно не рекомендуется, поскольку легко начать использовать систему для неадминистративных задач, что опасно.
Следующий способ получить привилегии суперпользователя позволяет стать пользователем root в любое время, когда они вам нужны.
Мы можем сделать это, вызвав команду su
, которая означает “заменить пользователя”. Чтобы получить привилегии root, введите:
Вас попросят ввести пароль пользователя root, после чего вы перейдете в сессию root оболочки.
Когда вы выполните задачи, требующие привилегий root, вернитесь к своей обычной оболочке, набрав:
Использование sudo
для выполнения команд от имени Root
Конечный способ получения root привилегий, который мы рассмотрим, – это команда sudo
.
Команда sudo
позволяет вам выполнять одиночные команды с root привилегиями, не требуя создания нового shell. Она выполняется следующим образом:
В отличие от 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
, выполните следующую команду:
OutputThere 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
:
Источник файла для реализации изменений:
После того, как вы настроили visudo
, выполните команду для доступа к файлу /etc/sudoers
:
Как изменить файл 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.
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
Последняя строка может показаться комментарием на первый взгляд:
. . .
#includedir /etc/sudoers.d
Она действительно начинается с #
, который обычно указывает на комментарий. Однако эта строка на самом деле указывает, что файлы в директории /etc/sudoers.d
будут прочитаны и применены также.
Файлы в этой директории следуют тем же правилам, что и файл /etc/sudoers
сам по себе. Любые файлы, которые не заканчиваются на ~
и в которых нет .
, будут прочитаны и добавлены к конфигурации sudo
.
Это в основном предназначено для приложений, которые изменяют привилегии sudo
при установке. Размещение всех связанных правил в одном файле в директории /etc/sudoers.d
может облегчить просмотр привилегий, связанных с каждым аккаунтом, и легкое отмена учетных данных, не пытаясь напрямую манипулировать файлом /etc/sudoers
.
Как и в случае с файлом /etc/sudoers
сам по себе, вы всегда должны редактировать файлы в директории /etc/sudoers.d
с помощью visudo
. Синтаксис для редактирования этих файлов будет:
Как предоставить пользователю привилегии sudo
Наиболее распространенная операция, которую пользователи хотят выполнить при управлении разрешениями sudo
, – это предоставить новому пользователю общее доступ sudo
. Это полезно, если вы хотите предоставить учетной записи полный административный доступ к системе.
Самый простой способ сделать это на системе, настроенной для общего назначения группы администрации, как в этом руководстве для Ubuntu, на самом деле заключается в добавлении пользователя в эту группу.
Например, в Ubuntu 20.04 группа sudo
имеет полные административные привилегии. Мы можем предоставить пользователю те же привилегии, добавив их в группу следующим образом:
Команда gpasswd
также может быть использована:
Оба этих метода будут иметь одинаковый эффект.
На CentOS обычно это группа wheel
, а не группа sudo
:
Или, используя gpasswd
:
На CentOS, если добавление пользователя в группу не работает сразу, возможно, вам придется отредактировать файл /etc/sudoers
, чтобы раскомментировать имя группы:
. . .
%wheel ALL=(ALL) ALL
. . .
Как Настроить Пользовательские Правила
Теперь, когда мы познакомились с общей структурой файла, давайте создадим несколько новых правил.
Как Создать Псевдонимы
Файл sudoers
можно организовать более удобно, объединяя вещи с помощью различных типов “псевдонимов”.
Например, мы можем создать три разные группы пользователей с перекрывающимся членством:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Имена групп должны начинаться с прописной буквы. Затем мы можем разрешить членам GROUPTWO
обновлять базу данных apt
, создав правило, например:
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
Если мы не указываем пользователя/группу, как выше, sudo
по умолчанию использует пользователя root.
Мы можем разрешить членам GROUPTHREE
выключать и перезагружать машину, создав “псевдоним команды” и используя это в правиле для GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Мы создаем псевдоним команды под названием POWER
, который содержит команды для выключения и перезагрузки машины. Затем мы разрешаем членам GROUPTHREE
выполнять эти команды.
Мы также можем создавать псевдонимы “Run as”, которые могут заменить часть правила, указывающую пользователя для выполнения команды:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Это позволит любому, кто является членом GROUPONE
, выполнять команды от имени пользователя www-data
или пользователя apache
.
Просто имейте в виду, что последующие правила будут переопределять более ранние правила, когда между ними возникает конфликт.
Как заблокировать правила
Существует несколько способов, с помощью которых вы можете получить больше контроля над тем, как sudo
реагирует на вызов.
Команда updatedb
, связанная с пакетом mlocate
, относительно безобидна на однопользовательской системе. Если мы хотим разрешить пользователям выполнять ее с привилегиями root без необходимости вводить пароль, мы можем создать правило, как это:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
– это “тег”, означающий, что пароль не будет запрошен. Существует команда-компаньон под названием PASSWD
, которая является поведением по умолчанию. Тег актуален для остальной части правила, если он не переопределен своим “двойственным” тегом далее в строке.
Например, у нас может быть такая строка:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Еще один полезный тег – NOEXEC
, который можно использовать для предотвращения некоторых опасных действий в определенных программах.
Например, некоторые программы, такие как less
, могут порождать другие команды, набирая это из своего интерфейса:
!command_to_run
Это в основном выполняет любую команду, которую пользователь ему дает, с теми же разрешениями, под которыми работает less
, что может быть довольно опасным.
Чтобы ограничить это, мы могли бы использовать такую строку:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Разное
Есть еще несколько кусочков информации, которые могут быть полезны при работе с sudo
.
Если вы указали пользователя или группу для “работы как” в конфигурационном файле, вы можете выполнять команды от имени этих пользователей, используя флаги -u
и -g
соответственно:
Для удобства по умолчанию sudo
сохраняет ваши учетные данные на определенное время в одном терминале. Это означает, что вам не придется снова вводить пароль до тех пор, пока таймер не истечет.
Для целей безопасности, если вы хотите очистить этот таймер, когда вы закончите выполнять административные команды, вы можете запустить:
Если, с другой стороны, вы хотите “подготовить” команду sudo
, чтобы вас не попросили позже, или обновить ваш sudo
лизинг, вы всегда можете набрать:
Вам будет предложено ввести пароль, который будет кэширован для будущих использований sudo
до тех пор, пока временной интервал sudo
не истечет.
Если вы просто хотите узнать, какие привилегии определены для вашего имени пользователя, вы можете ввести:
Это покажет все правила в файле /etc/sudoers
, которые применяются к вашему пользователю. Это дает вам хорошее представление о том, что вы будете или не будете иметь возможность делать с sudo
в качестве любого пользователя.
Множество раз вы будете выполнять команду, и она будет завершаться неудачно, потому что вы забыли предварять ее sudo
. Чтобы избежать необходимости перепечатывать команду, вы можете воспользоваться функциональностью bash, которая означает “повтори последнюю команду”:
Двойной восклицательный знак повторит последнюю команду. Мы предшествовали ему sudo
, чтобы быстро изменить непривилегированную команду на привилегированную.
Для развлечения вы можете добавить следующую строку в файл /etc/sudoers
с помощью visudo
:
. . .
Defaults insults
. . .
Это заставит sudo
возвращать глупую оскорбление, когда пользователь вводит неправильный пароль для sudo
. Мы можем использовать sudo -k
для очистки предыдущего кэшированного пароля sudo
, чтобы попробовать это:
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