Как редактировать файл Sudoers
Введение
Разделение привилегий — одна из фундаментальных парадигм безопасности, реализованных в Linux и Unix-подобных операционных системах. Обычные пользователи работают с ограниченными привилегиями, чтобы ограничить сферу своего влияния своей собственной средой, а не более широкой операционной системой.
Специальный пользователь root имеет права суперпользователя. Это административная учетная запись без ограничений, которые есть у обычных пользователей. Пользователи могут выполнять команды с правами суперпользователя или root различными способами.
В этой статье мы обсудим, как правильно и безопасно получить привилегии суперпользователя, уделив особое внимание редактированию файла /etc/sudoers
.
Мы будем выполнять эти шаги на сервере Ubuntu 20.04, но большинство современных дистрибутивов Linux, таких как Debian и CentOS, должны работать аналогичным образом.
В этом руководстве предполагается, что вы уже выполнили описанную здесь начальную настройку сервера. Войдите на свой сервер как обычный пользователь без полномочий root и продолжите ниже.
Примечание. В этом руководстве подробно рассматривается повышение привилегий и файл sudoers
. Если вы просто хотите предоставить пользователю привилегии sudo
, ознакомьтесь с нашими краткими руководствами Как создать нового пользователя с поддержкой Sudo для CentOS.
Как получить root-права
Существует три основных способа получения привилегий суперпользователя, которые различаются по уровню сложности.
Вход в систему как root
Самый простой и прямой способ получить привилегии суперпользователя — это напрямую войти на ваш сервер в качестве пользователя root.
Если вы входите на локальный компьютер (или используете функцию внешней консоли на виртуальном сервере), введите root
в качестве имени пользователя в строке входа и введите пароль root при появлении запроса.
Если вы входите через SSH, укажите пользователя root перед IP-адресом или доменным именем в строке подключения SSH:
- ssh root@server_domain_or_ip
Если вы не настроили ключи SSH для пользователя root, введите пароль root при появлении запроса.
Использование su для получения root-прав
Вход в систему напрямую как root обычно не рекомендуется, потому что легко начать использовать систему для неадминистративных задач, что опасно.
Следующий способ получения привилегий суперпользователя позволяет вам стать пользователем root в любое время, когда вам это нужно.
Мы можем сделать это, вызвав команду su
, что означает «заменить пользователя». Чтобы получить привилегии суперпользователя, введите:
- su
Вам будет предложено ввести пароль пользователя root, после чего вы попадете в сеанс корневой оболочки.
Когда вы закончите задачи, требующие привилегий root, вернитесь в свою обычную оболочку, набрав:
- exit
Использование sudo для выполнения команд от имени root
Последний способ получения привилегий root, который мы обсудим, — это команда sudo
.
Команда sudo
позволяет вам выполнять одноразовые команды с привилегиями root без необходимости создавать новую оболочку. Выполняется так:
- sudo command_to_execute
В отличие от su
, команда sudo
запросит пароль текущего пользователя, а не пароль root.
Из соображений безопасности доступ к sudo
не предоставляется пользователям по умолчанию, и его необходимо настроить, прежде чем он будет работать правильно. Ознакомьтесь с краткими руководствами Как создать нового пользователя с поддержкой Sudo для CentOS, чтобы узнать, как настроить пользователя с поддержкой sudo
.
В следующем разделе мы более подробно обсудим, как изменить конфигурацию sudo
.
Что такое Визудо?
Команда sudo
настраивается через файл, расположенный в /etc/sudoers
.
Предупреждение: Никогда не редактируйте этот файл в обычном текстовом редакторе! Вместо этого всегда используйте команду visudo
!
Поскольку неправильный синтаксис в файле /etc/sudoers
может привести к поломке системы, в которой невозможно получить повышенные привилегии, важно использовать команду visudo
для редактирования файл.
Команда visudo
открывает текстовый редактор, как обычно, но проверяет синтаксис файла при сохранении. Это предотвращает блокировку операций sudo
из-за ошибок конфигурации, которые могут быть вашим единственным способом получения привилегий суперпользователя.
Традиционно visudo
открывает файл /etc/sudoers
с помощью текстового редактора vi
. Ubuntu, однако, настроил visudo
для использования текстового редактора nano
.
Если вы хотите изменить его обратно на vi
, введите следующую команду:
- sudo update-alternatives --config editor
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
:
- export EDITOR=`which name_of_editor`
Исходный файл для реализации изменений:
- . ~/.bashrc
После настройки visudo
выполните команду для доступа к файлу /etc/sudoers
:
- sudo visudo
Как изменить файл Sudoers
Вам будет представлен файл /etc/sudoers
в выбранном текстовом редакторе.
Я скопировал и вставил файл из Ubuntu 20.04 с удаленными комментариями. Файл CentOS /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
Давайте посмотрим, что делают эти строки.
Линии по умолчанию
Первая строка, Env_reset по умолчанию
, сбрасывает среду терминала, чтобы удалить все пользовательские переменные. Это мера безопасности, используемая для удаления потенциально опасных переменных среды из сеанса sudo
.
Вторая строка, Defaults mail_badpass
, указывает системе отправлять уведомления о неправильных попытках ввода пароля sudo
настроенному пользователю mailto
. По умолчанию это учетная запись root.
Третья строка, начинающаяся с Defaults secure_path=...
, указывает PATH
(места в файловой системе, в которых операционная система будет искать приложения), которые будут использоваться для sudo
операций. Это предотвращает использование пользовательских путей, которые могут быть вредными.
Линии привилегий пользователя
Четвертая строка, определяющая привилегии sudo
пользователя root, отличается от предыдущих строк. Давайте посмотрим, что означают разные поля:
-
корень ALL=(ALL:ALL) ALL
В первом поле указывается имя пользователя, к которому будет применяться правило (root). -
корень ВСЕ=(ВСЕ:ВСЕ) ВСЕ
Первый «ALL» указывает, что это правило применяется ко всем хостам. -
корень ВСЕ=(ВСЕ:ВСЕ) ВСЕ
Это \ALL указывает, что пользователь root может выполнять команды как все пользователи. -
корень ВСЕ=(ВСЕ:ВСЕ) ВСЕ
Это \ALL указывает, что пользователь root может запускать команды как все группы. -
корень ВСЕ=(ВСЕ:ВСЕ) ВСЕ
Последнее \ALL указывает, что эти правила применяются ко всем командам.
Это означает, что наш пользователь root может запускать любую команду, используя sudo
, если он предоставляет свой пароль.
Линии групповых привилегий
Следующие две строки аналогичны строкам привилегий пользователя, но они определяют правила sudo
для групп.
Имена, начинающиеся с %
, обозначают имена групп.
Здесь мы видим, что группа администраторов может выполнять любую команду от имени любого пользователя на любом хосте. Точно так же группа 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 visudo -f /etc/sudoers.d/file_to_edit
Как предоставить пользователю привилегии Sudo
Наиболее распространенная операция, которую пользователи хотят выполнить при управлении разрешениями sudo
, — предоставить новому пользователю общий доступ sudo
. Это полезно, если вы хотите предоставить учетной записи полный административный доступ к системе.
Самый простой способ сделать это в системе, настроенной с помощью группы администрирования общего назначения, такой как система Ubuntu в этом руководстве, — фактически добавить рассматриваемого пользователя в эту группу.
Например, в Ubuntu 20.04 группа sudo
имеет полные права администратора. Мы можем предоставить пользователю такие же привилегии, добавив его в группу следующим образом:
- sudo usermod -aG sudo username
Также можно использовать команду gpasswd
:
- sudo gpasswd -a username sudo
Они оба будут выполнять одно и то же.
В CentOS это обычно группа wheel
вместо группы sudo
:
- sudo usermod -aG wheel username
Или с помощью gpasswd
:
- sudo gpasswd -a username wheel
В CentOS, если добавление пользователя в группу не работает сразу, вам может потребоваться отредактировать файл /etc/sudoers
, чтобы раскомментировать имя группы:
- sudo visudo
. . .
%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
выполнять эти команды.
Мы также можем создать псевдонимы «Запуск от имени», которые могут заменить часть правила, указывающую, что пользователь должен выполнять команду как:
. . .
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 -u run_as_user command
- sudo -g run_as_group command
Для удобства по умолчанию sudo
сохраняет ваши данные аутентификации в течение определенного времени в одном терминале. Это означает, что вам не придется вводить пароль снова, пока не истечет этот таймер.
В целях безопасности, если вы хотите сбросить этот таймер после выполнения административных команд, вы можете запустить:
- sudo -k
Если, с другой стороны, вы хотите «подготовить» команду sudo
, чтобы она не появлялась позже, или продлить аренду sudo
, вы можете всегда вводите:
- sudo -v
Вам будет предложено ввести пароль, который будет сохранен в кэше для последующего использования sudo
до истечения срока sudo
.
Если вам просто интересно, какие привилегии определены для вашего имени пользователя, вы можете ввести:
- sudo -l
Это перечислит все правила в файле /etc/sudoers
, которые применяются к вашему пользователю. Это дает вам хорошее представление о том, что вы можете или не можете делать с sudo
как любой пользователь.
Много раз вы будете выполнять команду, и она завершится ошибкой, потому что вы забыли предварить ее sudo
. Чтобы избежать повторного ввода команды, вы можете воспользоваться функциональностью bash, которая означает «повторить последнюю команду»:
- sudo !!
Двойной восклицательный знак будет повторять последнюю команду. Мы предшествовали ему sudo
, чтобы быстро изменить непривилегированную команду на привилегированную команду.
Для развлечения вы можете добавить следующую строку в свой файл /etc/sudoers
с помощью visudo
:
- sudo visudo
. . .
Defaults insults
. . .
Это приведет к тому, что sudo
вернет глупое оскорбление, когда пользователь введет неправильный пароль для sudo
. Мы можем использовать sudo -k
, чтобы очистить предыдущий кешированный пароль sudo
, чтобы попробовать его:
- sudo -k
- 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. Не относитесь к ответственности легкомысленно. Узнайте, как лучше всего использовать эти инструменты для вашего случая использования, и заблокируйте все функции, которые не нужны.