opened image

Руководство для начинающих и профессионалов: visudo и sudoers - Часть 1

 

Одним из важнейших принципов безопасности в Linux и подобных Unix операционных системах является ограничение привилегий (privilege separation). Идея в том, чтобы каждый пользователь имел минимальный набор полномочий, необходимых для своей работы, и не мог повлиять на всю систему. При этом механизм sudo позволяет временно получать повышенные права для запуска определённых команд или выполнения административных действий.

 

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

 

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

 

Именно поэтому существует утилита visudo, которая бережно и с проверкой синтаксиса вносит изменения в /etc/sudoers, уменьшая риск «сломать» систему.

 

Ниже разберём, как правильно пользоваться visudo, какие возможности предоставляет файл sudoers и почему безопасное редактирование так важно.

 

Что такое файл sudoers и почему он важен

 

Файл sudoers определяет правила, по которым пользователи (или группы пользователей) могут запускать команды с правами суперпользователя (root) или других учётных записей. С одной стороны, администраторы могут настроить гибкий механизм разграничения доступа: кому-то дать право выполнять только одну конкретную команду, а кому-то разрешить вообще всё. С другой стороны, слишком широкие настройки (например, «пользователь может делать всё») несут потенциальные угрозы безопасности. Поэтому важно понимать, как устроен файл sudoers, и уметь грамотно его настраивать.

 

Почему visudo, а не обычный текстовый редактор

 

visudo – это специальная утилита, которая открывает файл sudoers в безопасном режиме. Основные преимущества по сравнению с обычным текстовым редактором:

  • Проверка синтаксиса. Если в процессе редактирования была допущена ошибка (например, пропущен двоеточие, скобка или значение), visudo сообщит об этом и откажется сохранять файл в «сломанный» вид. Это защищает систему от неправильной конфигурации, которая может привести к полной блокировке sudo.
  • Исключительная блокировка файла. visudo блокирует файл sudoers, чтобы не допустить параллельного редактирования несколькими пользователями или процессами. Это важно, поскольку две конфликтующие правки могут повредить конфигурацию.
  • Выбор проверенного редактора. По умолчанию visudo запускает тот редактор, который прописан в настройках системы (часто это vi или nano). Но при необходимости можно указать любой другой редактор, например, export EDITOR=nano, чтобы использовать nano вместо vi.

 

Использовать visudo рекомендуется всегда, когда вам нужно скорректировать права в sudoers, будь то добавление нового пользователя или изменение уже существующего правила.

 

Основы синтаксиса файла sudoers

 

Чтобы лучше понять, как составлять нужные правила, посмотрим на пример записи в sudoers:

 

user host = (run_as_user : run_as_group) commands

 

Разберём основные элементы:

  • user – имя пользователя или, если используется знак процента (%), то имя группы.
  • host – хост (или список хостов), на которых допускается выполнение команд с повышенными правами. Чаще всего пишут ALL, чтобы не привязываться к конкретной машине.
  • run_as_user – от какого пользователя разрешено запускать команды. Наиболее часто это ALL, что подразумевает возможность запускать от имени любого пользователя, включая root.
  • run_as_group – группа, под именем которой выполняется команда. Эта опция встречается реже и тоже часто указывается как ALL.
  • commands – список команд, которые разрешается выполнять. Можно указать одну, несколько или вообще все (ALL).

 

Пример самого распространённого разрешения:

 

johndoe ALL=(ALL:ALL) ALL

 

Эта строка даёт пользователю johndoe право выполнять любые команды (ALL) на любом хосте (ALL) от имени любого пользователя и группы (ALL:ALL). Когда johndoe вводит sudo перед командой, он должен будет ввести свой пароль, после чего команда запустится с правами root (или другого указанного пользователя).

 

Ещё один пример — запись для группы:

 

%developers ALL=(ALL) ALL

 

Здесь символ % означает, что это не пользователь, а именно группа developers. Все участники этой группы смогут выполнять любые команды через sudo.

 

Как использовать visudo на практике

 

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

 

sudo visudo

 

По умолчанию откроется файл /etc/sudoers в редакторе vi или nano (зависит от настроек системы). Внесите правки и сохраните файл. visudo проверит синтаксис и только потом применит изменения.

 

 

Смена текстового редактора

 

Если вы не хотите работать в vi (что бывает неудобно для начинающих) или просто привыкли к другому редактору, укажите нужный:

 

export EDITOR=nano
sudo visudo

 

После установки переменной окружения EDITOR команда visudo будет использовать указанный редактор (в данном примере nano) на протяжении текущей сессии терминала. Если нужно использовать nano постоянно, можно прописать эту строку в файле ~/.bashrc или ~/.zshrc (в зависимости от оболочки).

 

Добавление sudo-доступа для пользователя или группы

 

Самый распространённый случай – дать конкретному пользователю возможность использовать sudo. Для этого внутри /etc/sudoers добавляется строка:

 

johndoe ALL=(ALL:ALL) ALL

 

Таким образом, пользователь johndoe получает доступ ко всем командам с правами root после ввода своего пароля. Аналогично можно настроить группу:

 

%developers ALL=(ALL) ALL

 

Все члены группы developers смогут выполнять команды через sudo. Важно помнить про символ процента (%), указывающий на то, что речь идёт о группе.

 

Ограничение списка команд

 

Иногда требуется, чтобы пользователь мог выполнять только определённые команды, а не всё подряд. Допустим, нам нужно, чтобы johndoe имел доступ только к /bin/ls и /bin/cat:

 

johndoe ALL=(ALL) /bin/ls, /bin/cat

 

Теперь при вызове sudo ls или sudo cat пользователь johndoe сможет выполнить команду. Однако любая другая команда через sudo ему будет недоступна, и система вернёт ошибку «не хватает прав».

 

 

Настройка sudo без пароля (NOPASSWD)

 

Для сценариев автоматизации или для удобства в определённых случаях можно разрешить sudo без запроса пароля:

 

johndoe ALL=(ALL) NOPASSWD:ALL

 

Так johndoe сможет выполнять все команды через sudo без ввода пароля. Но такой подход является потенциально небезопасным, поэтому его надо применять осмотрительно и только там, где это действительно необходимо (например, в скриптах, чтобы не «зашивать» пароль).

 

При необходимости можно упростить только запуск отдельных команд без пароля:

 

johndoe ALL=(ALL) NOPASSWD:/bin/ls

 

Теперь johndoe сможет выполнять sudo ls без пароля, но любые другие sudo-команды будут требовать авторизации.

 

Использование алиасов

 

В больших компаниях или на серверах с несколькими десятками (или сотнями) пользователей упрощает конфигурацию применение алиасов (alias). С помощью алиасов можно группировать команды, пользователей или хосты.

 

Создадим алиас для набора команд по работе с файлами:

 

Cmnd_Alias FILEOPS = /bin/cp, /bin/mv, /bin/rm

 

Теперь вместо перечисления каждой команды в разных местах файла мы можем использовать короткое имя FILEOPS:

 

johndoe ALL=(ALL) FILEOPS

 

  • johndoe получает права на cp, mv и rm. Аналогичным образом можно создавать алиасы для пользователей:

 

User_Alias ADMINS = johndoe, janedoe
ADMINS ALL=(ALL) ALL

 

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

 

Ограничение доступа по хостам

 

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

 

johndoe webserver01=(ALL) ALL

 

В таком случае johndoe сможет выполнять привилегированные команды только на сервере с именем webserver01. Для других серверов такая запись не будет работать.

 

 

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

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