15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
08.10.2024

Как добавить пользователя в группу root и предоставить привилегии в Linux

Предоставление повышенных привилегий в Linux означает наделение учётной записи пользователя возможностью выполнять команды, требующие доступа на уровне суперпользователя — либо путём добавления в привилегированную группу, такую как `sudo` или `wheel`, либо путём явной настройки записей в файле `/etc/sudoers`. Наиболее безопасным и проверяемым методом всегда является делегирование на основе `sudo`, а не прямое членство в группе `root`.

В этом руководстве рассматриваются все практические способы: добавление пользователей в группу `sudo` или `wheel`, редактирование файла `sudoers` с помощью `visudo`, ограничение привилегий конкретными командами, корректный отзыв доступа, а также понимание того, почему прямое членство в группе `root` является угрозой безопасности в производственных средах.

Понимание модели привилегий Linux

Linux обеспечивает строгое разделение между привилегированными и непривилегированными контекстами выполнения. Каждый процесс выполняется под определённым UID (идентификатором пользователя), а UID 0 — пользователь `root` — обходит практически все проверки разрешений, применяемые ядром. Это не просто соглашение; оно применяется на уровне системных вызовов.

Ключевые механизмы привилегий, которые необходимо понимать:

  • Пользователь root (UID 0): Неограниченный доступ ко всем файлам, устройствам, параметрам ядра и системным вызовам. Одна неправильно настроенная команда, выполненная от имени root, может необратимо повредить работающую систему.
  • sudo: Бинарный файл с битом setuid, позволяющий авторизованному пользователю выполнять команды от имени другого пользователя (как правило, root) в соответствии с политикой, определённой в `/etc/sudoers`. Каждый вызов записывается в syslog или journald.
  • Группа `sudo` (Debian/Ubuntu): Члены этой группы получают полный доступ к sudo благодаря правилу по умолчанию в `/etc/sudoers`.
  • Группа `wheel` (RHEL/CentOS/Fedora/AlmaLinux): Функциональный эквивалент группы `sudo` в дистрибутивах на основе Red Hat.
  • Группа `root` (GID 0): Членство в этой группе НЕ предоставляет права на выполнение команд на уровне root. Оно лишь открывает доступ к файлам, принадлежащим группе `root`, с разрешениями на чтение или запись для группы. Это часто понимается неверно.

Группа root и группа sudo: принципиальное различие

СвойствоГруппа `root` (GID 0)Группа `sudo` / `wheel`
Предоставляет выполнение с UID 0НетДа (через sudo)
Позволяет читать файлы root с групповым доступом на чтениеДаНет (если только не root)
Записывается в журнал аудитаНетДа (syslog/journald)
Требует подтверждения паролемНетДа (по умолчанию)
Рекомендуется для делегирования прав администратораНетДа
Уровень рискаВысокий (скрытый доступ к файлам)Контролируемый
Типичный сценарий использованияУстаревшие конфигурации, специфические ACL файловВсё современное делегирование прав администратора

Добавление пользователя в группу `root` не делает его root. Это незаметно предоставляет права на чтение/запись любого файла, где группа `root` имеет соответствующие разрешения — что в неправильно настроенной системе может включать конфиденциальные файлы конфигурации, закрытые ключи или каталоги cron. Именно поэтому это опасно и редко является правильным решением.

Предварительные требования

Перед началом работы убедитесь в следующем:

  • У вас есть активный сеанс с правами root или sudo.
  • Целевая учётная запись пользователя уже существует. Если нет, создайте её:

“`bash

sudo adduser username

“`

На минимальных системах или дистрибутивах на основе RHEL используйте `useradd` с явными параметрами:

“`bash

sudo useradd -m -s /bin/bash username

sudo passwd username

“`

  • Вы знаете название привилегированной группы вашего дистрибутива (`sudo` в Debian/Ubuntu, `wheel` в RHEL/CentOS/AlmaLinux/Fedora).

Если вы управляете средой VPS Хостинга, эти шаги применимы одинаково как на физическом сервере, так и на виртуальной машине — модель привилегий Linux работает на уровне ОС, а не гипервизора.

Шаг 1: Добавление пользователя в группу sudo или wheel

Это правильный, рекомендуемый метод предоставления административного доступа во всех современных дистрибутивах Linux.

В Debian, Ubuntu и производных дистрибутивах

Группа `sudo` предварительно настроена в `/etc/sudoers` с правилом, предоставляющим полный доступ к sudo:

“`bash

sudo usermod -aG sudo username

“`

Флаг `-aG` имеет принципиальное значение: `-a` означает добавление (без удаления существующих членств в группах), а `-G` указывает дополнительную группу. Пропуск `-a` заменит все дополнительные группы только указанной — это распространённая и разрушительная ошибка.

В RHEL, CentOS, AlmaLinux, Rocky Linux и Fedora

Вместо этого используйте группу `wheel`:

“`bash

sudo usermod -aG wheel username

“`

В старых системах CentOS 6 правило группы `wheel` в `/etc/sudoers` может быть закомментировано. Убедитесь, что оно активно:

“`bash

sudo grep -i wheel /etc/sudoers

“`

Вы должны увидеть незакомментированную строку вида:

“`

%wheel ALL=(ALL) ALL

“`

Если она закомментирована, раскомментируйте её с помощью `visudo` (рассматривается в шаге 2).

Проверка членства в группе

Изменения группы вступают в силу при следующем входе в систему. Для немедленной проверки без выхода из системы:

“`bash

groups username

“`

Или проверьте `/etc/group` напрямую:

“`bash

grep -E '^sudo:|^wheel:' /etc/group

“`

Чтобы применить новую группу к существующему сеансу без повторного входа, пользователь может выполнить:

“`bash

newgrp sudo

“`

Обратите внимание, что `newgrp` запускает новую оболочку с обновлённым контекстом группы — он не изменяет родительский сеанс.

Шаг 2: Настройка детализированных привилегий через файл sudoers

Для производственных систем полный неограниченный доступ к sudo зачастую избыточен. Файл `/etc/sudoers` позволяет точно ограничивать привилегии — по команде, целевому пользователю, хосту, с запросом пароля или без него.

Всегда редактируйте `/etc/sudoers` с помощью `visudo`. Этот инструмент блокирует файл от одновременного редактирования и выполняет проверку синтаксиса перед сохранением. Синтаксическая ошибка в `/etc/sudoers` может лишить всех пользователей доступа к sudo в системе — `visudo` предотвращает это.

“`bash

sudo visudo

“`

Предоставление полного доступа к sudo конкретному пользователю

Добавьте эту строку в конец файла (или в отдельный файл в `/etc/sudoers.d/`):

“`

username ALL=(ALL:ALL) ALL

“`

Разбор синтаксиса:

  • `username` — учётная запись, к которой применяется это правило.
  • Первый `ALL` — применяется на всех хостах (актуально для общих файлов sudoers, распространяемых через системы управления конфигурацией).
  • `(ALL:ALL)` — пользователь может выполнять команды от имени любого пользователя (первый `ALL`) и любой группы (второй `ALL`).
  • Последний `ALL` — разрешены все команды.

Предоставление доступа только к конкретным командам (принцип минимальных привилегий)

Именно этот шаблон следует использовать в производственной среде. Например, чтобы разрешить пользователю перезапускать Nginx и больше ничего:

“`

username ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

“`

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

“`

username ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl stop nginx

“`

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

Использование отдельных файлов в /etc/sudoers.d/

Вместо прямого редактирования основного файла `sudoers` размещайте пользовательские правила в `/etc/sudoers.d/`:

“`bash

sudo visudo -f /etc/sudoers.d/username

“`

Добавьте правило, сохраните и убедитесь, что файл имеет правильные разрешения:

“`bash

sudo chmod 440 /etc/sudoers.d/username

“`

Этот подход хорошо интегрируется с инструментами управления конфигурацией, такими как Ansible, Puppet и Chef, и значительно упрощает аудит привилегий.

Предоставление доступа NOPASSWD (используйте с осторожностью)

Для автоматизированных скриптов или сервисных учётных записей, которым необходимо выполнять привилегированные команды без интерактивных запросов:

“`

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

“`

Замечание по безопасности: `NOPASSWD` устраняет барьер аутентификации. Используйте его только для строго ограниченных команд на учётных записях с надёжной аутентификацией по SSH-ключу. Никогда не предоставляйте `NOPASSWD: ALL` на производственном сервере.

Шаг 3: Проверка конфигурации

После внесения изменений выполните проверку, не завершая текущий привилегированный сеанс — если вы допустили ошибку, у вас ещё есть возможность её исправить.

Переключитесь на целевого пользователя и выполните проверку:

“`bash

su – username

sudo whoami

“`

Ожидаемый вывод: `root`

Чтобы вывести список всех команд, разрешённых пользователю:

“`bash

sudo -l -U username

“`

Это незаменимая диагностическая команда. Она показывает действующую политику sudoers для любого пользователя без необходимости входить под его учётной записью.

Шаг 4: Добавление пользователя в группу root (с явным предупреждением)

Если конкретное устаревшее приложение или требование к разрешениям файлов действительно требует членства в группе `root` — и вы исчерпали альтернативы, такие как ACL и наборы возможностей (capability sets) — команда выглядит следующим образом:

“`bash

sudo usermod -aG root username

“`

Что это фактически делает: Пользователь получает доступ к файлам, в которых группа `root` имеет права на чтение или запись. В стандартной установке Linux это включает файлы в `/etc/`, `/root/` и потенциально `/var/` в зависимости от решений по упаковке конкретного дистрибутива.

Что это не делает: Это не предоставляет возможность выполнять команды от имени root. Это не активирует `sudo`. Это не изменяет UID пользователя.

Рекомендуемая альтернатива: Используйте POSIX ACL для предоставления доступа к конкретному файлу вместо добавления пользователя в группу `root`:

“`bash

sudo setfacl -m u:username:r /etc/specific-config-file

“`

Это предоставляет права на чтение ровно одного файла без какого-либо воздействия на уровне группы.

Шаг 5: Отзыв привилегий

Отзыв привилегий должен быть немедленным и проверяемым. Не полагайтесь на выход пользователя из системы — удалите членство в группе и проверьте результат.

Удаление из группы sudo (Debian/Ubuntu)

“`bash

sudo deluser username sudo

“`

Или с использованием переносимого метода `gpasswd` (работает во всех дистрибутивах):

“`bash

sudo gpasswd -d username sudo

“`

Удаление из группы wheel (дистрибутивы на основе RHEL)

“`bash

sudo gpasswd -d username wheel

“`

Удаление отдельного файла из sudoers.d

“`bash

sudo rm /etc/sudoers.d/username

“`

Немедленная проверка отзыва

“`bash

sudo -l -U username

“`

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

Особый случай: Если у пользователя есть активный сеанс, изменения членства в группе не затронут этот сеанс до повторного входа в систему. Для немедленного применения завершите активные сеансы пользователя:

“`bash

sudo pkill -u username

“`

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

Шаг 6: Аудит использования sudo

Каждый вызов `sudo` записывается в журнал. На системах на основе systemd:

“`bash

sudo journalctl -u sudo

“`

Или через традиционный syslog:

“`bash

sudo grep sudo /var/log/auth.log # Debian/Ubuntu

sudo grep sudo /var/log/secure # RHEL/CentOS

“`

Типичная запись журнала выглядит следующим образом:

“`

Jan 15 14:32:01 hostname sudo: username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/bin/systemctl restart nginx

“`

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

Для расширенного аудита рассмотрите возможность включения ведения журнала `sudo` в отдельный файл, добавив в `/etc/sudoers`:

“`

Defaults logfile="/var/log/sudo.log"

Defaults log_input, log_output

“`

`log_input` и `log_output` записывают полный ввод/вывод каждого сеанса sudo — особенно полезно при расследовании действий привилегированного пользователя в ходе сеанса.

Усиление безопасности: за пределами базовой конфигурации sudo

Администраторам, управляющим VPS с cPanel или пользовательскими стеками Linux, следует применять следующие дополнительные меры контроля:

Ограничение sudo конкретными TTY:

“`

Defaults requiretty

“`

Это предотвращает вызов sudo из неинтерактивных скриптов или заданий cron, если это явно не разрешено.

Установка тайм-аута сеанса sudo:

“`

Defaults timestamp_timeout=5

“`

Это устанавливает кэш учётных данных на 5 минут. Установка значения `0` требует ввода пароля при каждом отдельном вызове sudo.

Ограничение sudo конкретными исходными IP-адресами (для многопользовательских серверов):

“`

username 192.168.1.0/24=(ALL) ALL

“`

Использование `sudo` с очисткой переменных окружения:

По умолчанию sudo сбрасывает окружение до безопасного состояния. Убедитесь, что `env_reset` активен в вашем файле sudoers:

“`

Defaults env_reset

“`

Отключение входа root по SSH: После настройки sudo отключите прямой вход root через SSH в `/etc/ssh/sshd_config`:

“`

PermitRootLogin no

“`

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

Управление привилегиями в различных дистрибутивах: краткий справочник

ДистрибутивПривилегированная группаПравило sudoers активно по умолчаниюПакет для sudo
Ubuntu 20.04+`sudo`Да`sudo` (предустановлен)
Debian 11+`sudo`Да`sudo` (установить вручную)
CentOS 7/8`wheel`Да`sudo` (предустановлен)
AlmaLinux 8/9`wheel`Да`sudo` (предустановлен)
Rocky Linux 8/9`wheel`Да`sudo` (предустановлен)
Fedora 38+`wheel`Да`sudo` (предустановлен)
Arch Linux`wheel`Нет (необходимо раскомментировать)`sudo` (установить вручную)
openSUSE`wheel`Да`sudo` (предустановлен)

В Arch Linux после установки `sudo` необходимо явно раскомментировать строку `%wheel` в `/etc/sudoers` через `visudo`, прежде чем членство в группе возымеет какой-либо эффект.

Практическая матрица решений: какой метод использовать

СценарийРекомендуемый подход
Разработчику нужен полный доступ администратора на VPS для разработкиДобавить в группу `sudo`/`wheel`
Сервисной учётной записи нужно перезапускать один демонЗапись `sudoers` с `NOPASSWD`, ограниченным этой командой
Временный доступ администратора для подрядчикаОтдельный файл `sudoers.d` (легко удалить)
Устаревшему приложению требуется доступ к файлам группы rootPOSIX ACL для конкретных файлов (`setfacl`)
Конвейеру CI/CD нужны привилегированные команды развёртыванияВыделенная сервисная учётная запись с ограниченными правилами `NOPASSWD`
Среда общего хостинга с несколькими пользователямиНе предоставлять sudo; использовать ролевой доступ панели управления
Среда с требованиями соответствия, требующая полного журнала аудитаsudo с включёнными `log_input`/`log_output`

Контрольный список ключевых выводов

Прежде чем считать повышение привилегий завершённым на любой системе Linux, проверьте каждый из следующих пунктов:

  • [ ] Пользователь добавлен в `sudo` (Debian/Ubuntu) или `wheel` (дистрибутивы на основе RHEL) — не напрямую в группу `root`.
  • [ ] `visudo` использовался для всех правок `/etc/sudoers` — никогда не обычный текстовый редактор.
  • [ ] Область привилегий максимально сужена — конкретные команды вместо `ALL` там, где это возможно.
  • [ ] `sudo -l -U username` подтверждает именно предполагаемые разрешения и ничего более.
  • [ ] `PermitRootLogin no` установлен в `/etc/sshd_config` на серверах, доступных из интернета.
  • [ ] Ведение журнала аудита sudo активно, а файлы журналов отслеживаются или пересылаются в SIEM.
  • [ ] Процедура отзыва задокументирована и протестирована — включая завершение активных сеансов с помощью `pkill -u`.
  • [ ] Отдельные файлы в `/etc/sudoers.d/` имеют разрешения `440` — файлы sudoers с доступом на чтение для всех отклоняются sudo.
  • [ ] `timestamp_timeout` установлен в значение, соответствующее вашей политике безопасности.
  • [ ] Предоставленные привилегии проверяются по установленному расписанию (ежемесячно или в рамках цикла проверки доступа).

Для команд, управляющих несколькими серверами — будь то на Панелях управления VPS или физическом оборудовании — централизация этой конфигурации через Ansible или аналогичные инструменты обеспечивает согласованность и исключает ручные расхождения.

Часто задаваемые вопросы

В чём разница между добавлением пользователя в группу root и предоставлением доступа к sudo?

Добавление пользователя в группу `root` (GID 0) предоставляет доступ к файлам, принадлежащим этой группе — это не позволяет выполнять команды от имени root. Предоставление доступа к sudo (через группу `sudo` или `wheel`, либо запись в sudoers) позволяет пользователю выполнять команды с привилегиями UID 0 в соответствии с политикой и аутентификацией по паролю.

Почему следует использовать `visudo` вместо прямого редактирования `/etc/sudoers` в nano или vim?

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

Как предоставить доступ к sudo без запроса пароля для конкретной команды?

Добавьте правило `NOPASSWD`, ограниченное точной командой, в `/etc/sudoers` или отдельный файл: `username ALL=(ALL) NOPASSWD: /path/to/command`. Всегда используйте абсолютный путь и ограничивайте это минимально необходимыми командами.

Вступают ли изменения членства в группе в силу немедленно для вошедших в систему пользователей?

Нет. Дополнительные группы пользователя определяются при входе в систему. Уже вошедший пользователь не получит и не потеряет доступ к sudo на основе группы до начала нового сеанса. Для немедленного отзыва завершите активные сеансы пользователя с помощью `sudo pkill -u username`.

Как проверить, какие разрешения sudo имеет пользователь, не входя в систему под его учётной записью?

Выполните `sudo -l -U username` от имени root или другого пользователя с правами sudo. Эта команда отображает полную действующую политику sudoers для указанного пользователя, включая все разрешённые команды, флаги NOPASSWD и применимые настройки по умолчанию.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать