Начнем с необходимости в файле sudoers!

Введение:

Мы воспринимаем команды sudo и su как должное. Мы так часто используем его для получения привилегий root, но то, что происходит под капотом, интересно! Когда мы выполняем sudo для команды, ОС проверяет файл, чтобы узнать, есть ли у нас права на обновление. Можно представить себе это как VIP-список, и только если там указано ваше имя, вам будет предоставлен доступ.

Политика безопасности sudoers требует, чтобы большинство пользователей аутентифицировали себя, прежде чем они смогут использовать sudo. Пароль не требуется, если вызывающий пользователь является пользователем root, если целевой пользователь совпадает с вызывающим пользователем или если политика отключила аутентификацию для пользователя или команды. В отличие от su (1), когда sudoers требует аутентификации, он проверяет учетные данные вызывающего пользователя, а не учетные данные целевого пользователя (или пользователя root). - страница руководства

Зачем нам нужен файл sudoers?

Файл Sudoers используется системными администраторами для предоставления системных привилегий пользователям. Когда команда выполняется с помощью sudo пользователем, система проверяет, есть ли у пользователя или группы пользователей доступ для выполнения команд от имени пользователя root. Если в файле sudoers есть запись, соответствующая пользователю / группе, команда будет выполнена с привилегиями root.

Всегда рекомендуется запускать команды с помощью sudo, а не становиться root (с помощью su) и выполнять команду. Когда вы являетесь root, все двери широко открыты, и вы можете делать все, что захотите, намеренно или ненамеренно. Поэтому, если в этом нет крайней необходимости, запускать команды путем переключения пользователя (sudo su) на пользователя root не рекомендуется.

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

# /etc/sudoers
#
# This file MUST be edited with the ‘visudo’ command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root    ALL=(ALL) ALL
# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d
# Members of the admin group may gain root privileges

Где следует создать файл sudoers?

Файл sudoers по умолчанию (/etc/sudoers) находится под управлением вашего диспетчера пакетов Linux Distros. Если в этот файл внесены какие-либо изменения, во время обновлений вам будет предложено проверить изменения и утвердить способ их объединения. Чтобы избежать этого запроса, пользовательский файл sudoer можно поместить в /etc/sudoers.d каталог. Файлы из каталога sudoers.d будут прочитаны только в том случае, если в ваш /etc/sudoers файл включена следующая строка. Начальный фунт (#) не означает, что строка прокомментирована. Поддержка @includedir и @include была добавлена ​​из sudo версии 1.9.1, чтобы избежать путаницы (поскольку # часто рассматривается как символ комментария)

#includedir /etc/sudoers.d

Есть несколько исключений, когда файлы в sudoers.d не читаются.

  1. Когда в имени файла стоит .
  2. Когда имена файлов заканчиваются на ~

Эти исключения сделаны с учетом диспетчера пакетов (1) и того факта, что файлы резервных копий можно игнорировать (2).

Права доступа к файлам в /etc/sudoers.d относительно легкие по сравнению с /etc/sudoers

Когда мы можем использовать файл sudoer?

Файл sudoers можно использовать в тех случаях, когда пользователи, не являющиеся пользователями sudo, могут получать доступ и запускать двоичные файлы без ввода каких-либо паролей. Один из вариантов немедленного использования, который я могу придумать, - это случай, когда tcpdump, сетевая утилита, должен запускаться пользователем, не являющимся пользователем sudo! Существуют и другие способы, такие как добавление файловых возможностей в двоичный файл tcpdump, о которых я рассказывал в отдельной статье, но если вы предпочитаете использовать файл sudoers для предоставления вашему пользователю root-подобного доступа без ввода пароля, его можно использовать используя файл sudoers.



Использование файла sudoers для предоставления привилегий пользователю или группе пользователей:

В приведенном ниже примере добавляются привилегии для перехвата пакетов с помощью tcpdump для группы пользователей net_admins.

  • Создание пользователя test_user и добавление пользователя в группу net_admins, если группа существует, если не создать новую группу
groupadd net_admins 
adduser test_user -g net_admins
  • Добавление содержимого в файл sudoers для включения привилегий захвата пакетов для net_admins
sudo visudo -f /etc/sudoers.d/networking
# Adding the lines below in the file
%net_admins ALL=(root) NOPASSWD: /usr/sbin/tcpdump

После внесения этих изменений любой пользователь, добавленный в группу net_admins, может запустить команду tcpdump как пользователь sudo без ввода пароля, запустив sudo tcpdump и передав необходимые параметры.

Какие псевдонимы поддерживает файл sudoers?

Файл sudoers поддерживает четыре типа псевдонимов.

  • User_Alias
  • Runas_Alias
  • Host_Alias
  • Cmnd_Alias

Каждое определение псевдонима имеет следующий синтаксис

Alias_Type NAME = item1, item2,

Где Alias_Type может быть одним из четырех типов, упомянутых выше, а ИМЯ может включать прописные буквы, числа и символы подчеркивания. Поле ИМЯ всегда должно начинаться с заглавной буквы.

Специальное ключевое слово ALL может использоваться как элемент в приведенном выше синтаксисе, который будет соответствовать всему в контексте, в котором оно используется. Например, в User_Alias, если ВСЕ присутствует в списке пользователей, он соответствует всем доступным пользователям в системе.

Псевдоним пользователя:

Эти псевдонимы используются для указания групп пользователей. Можно указать список пользователей, системных групп (с префиксом%).

# Everybody in the system group "admin" is covered by alias ADMINS
User_Alias ADMINS = %admin
# Users "tesla","dodge" & "honda" are covered by the TDH_USERS alias
User_Alias TDH_USERS = tesla, dodge, honda
# You can also use ! to exclude users from an alias
# This matches anyone in the USERS alias who isn't in ADMINS aliases
 User_Alias LIMITED_USERS = USERS, !ADMINS

Псевдоним Рунас:

Это похоже на псевдоним пользователя, за исключением того, что он поддерживает использование UID (с префиксом #). Имена пользователей и имена групп обычно сопоставляются как строки в псевдониме пользователя. С псевдонимом runas мы можем сопоставить двух пользователей с одинаковым UID, но разными именами с UID.

# UID 0 is normally used for root
Runas_Alias ROOT = #0
# The alias below is for all the admin users along
# with the addition of "root"
Runas_Alias ADMINS = %admin, root

Псевдоним хоста:

Псевдоним хоста устанавливает псевдоним для списка IP-адресов, сетей, имен хостов.

# Alias for all the database servers
Host_Alias DB_SERVERS = 192.168.0.1, 192.168.0.2
# Alias for the whole network
Host_Alias NETWORK = 192.168.0.0/255.255.255.0
# Alias for all the systems that are in the network but aren't servers.
Host_Alias WORKSTATIONS = NETWORK, !DB_SERVERS

Псевдоним команды:

Псевдонимы команд - это список двоичных файлов и каталогов. Если каталог присутствует в списке, включаются все файлы в этом каталоге, но не подкаталоги.

# Admin commands
Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod
Cmnd_Alias CAPTURE = /usr/sbin/tcpdump

Что такое пользовательские спецификации?

Пользовательские спецификации - это суть файла sudoers. Это часть файла, которая решает, кто и что может запускать! Все различные типы псевдонимов, описанные выше, настроены для использования в этих пользовательских спецификациях. Формат пользовательских спецификаций можно резюмировать следующим образом:

<user list> <host list> = <operator list> <tag list> <command list>
    |            |        |                           |--- cmd alias
    |            |        |-runas alias(or userlist they must runas)
    |            |--- host alias
    |--- user alias

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

Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |
              'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' |      'NOLOG_INPUT:' | 'LOG_OUTPUT:' | 'NOLOG_OUTPUT:') - Sudoers manpage

Примеры пользовательских спецификаций на основе псевдонима, указанного выше

# This lets the admins run all the admin commands on the servers
ADMINS DB_SERVERS = ADMIN_CMDS
# This lets all the TDH_USERS run admin commands on the workstations 
# they give the root password or and admin password (using "sudo -u <username>")
 TDH_USERS WORKSTATIONS=(ADMINS) ADMIN_CMDS
#Lets ADMINS run commands on all systems without typing password
ADMINS ALL=(root) NOPASSWD: /usr/sbin/tcpdump
# This lets "tom" shutdown his own machine without a password
tom tom-machine= NOPASSWD: SHUTDOWN_CMDS

Как проверить изменения, внесенные в файл?

Проверить изменения в файле sudoers довольно просто. Например, мы можем добавить следующие строки в /etc/sudoers.d/10_custom и убедиться, что #include /etc/sudoers.d присутствует в файле / etc / sudoers. Добавленную пользовательскую спецификацию можно протестировать, создав сценарий, соответствующий спецификации. Например, если вы добавили приведенный выше пример tcpdump в свой файл sudoers, вы можете попробовать запустить команду tcpdump как test_user, и она должна работать без запроса пароля и без каких-либо ошибок.

su test_user
sudo tcpdump -i any

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