Поиск по сайту:

Как редактировать файл 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:

  1. ssh root@server_domain_or_ip

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

Использование su для получения root-прав

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

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

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

  1. su

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

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

  1. exit

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

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

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

  1. 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, введите следующую команду:

  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 в выбранном текстовом редакторе.

Я скопировал и вставил файл из 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. Синтаксис редактирования этих файлов будет следующим:

  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
. . .
%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 соответственно. :

  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
. . .
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. Не относитесь к ответственности легкомысленно. Узнайте, как лучше всего использовать эти инструменты для вашего случая использования, и заблокируйте все функции, которые не нужны.