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 конкретному користувачу

Додайте цей рядок у кінець файлу (або у файл drop-in у `/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 і будуть мовчки не спрацьовувати або викликати помилки.

Використання файлів drop-in у /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 та набори можливостей — команда така:

“`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

“`

Видалення файлу drop-in 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`, перш ніж членство в групі матиме будь-який ефект.

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

СценарійРекомендований підхід
Розробнику потрібен повний доступ адміністратора на dev VPSДодати до групи `sudo`/`wheel`
Службовому обліковому запису потрібно перезапустити один демонЗапис `sudoers` з `NOPASSWD`, обмеженим цією командою
Тимчасовий доступ адміністратора для підрядникаФайл drop-in `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`.
  • [ ] Файли drop-in у `/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` або файл drop-in: `username ALL=(ALL) NOPASSWD: /path/to/command`. Завжди використовуйте абсолютний шлях і обмежуйте це мінімально необхідними командами.

Чи набувають зміни членства в групі чинності негайно для користувачів, що вже увійшли в систему?

Ні. Додаткові групи користувача оцінюються під час входу. Користувач, що вже увійшов у систему, не отримає та не втратить доступ sudo на основі групи до початку нового сеансу. Щоб примусово застосувати негайне скасування, завершіть їхні активні сеанси за допомогою `sudo pkill -u username`.

Як перевірити, які дозволи sudo має користувач, не входячи під його обліковим записом?

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

15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати