Команда sudo в операційних системах Linux дозволяє виконувати команди з правами іншого користувача, наприклад, адміністратора (root). Це також надає гнучкі можливості керування доступом до привілеїв root. Можна надати користувачам повний доступ або дозволити їм використовувати лише певні команди. Далі розглянемо, як це налаштувати.
Привілеї sudo та користувача root
У Linux часто кажуть, що «все є файлом». Насправді, майже всі елементи системи, включаючи процеси, файли, каталоги, сокети та канали, взаємодіють з ядром через файловий дескриптор. Таким чином, хоча не все є файлом у строгому сенсі, більшість об’єктів ОС обробляються саме так. Це ключовий принцип дизайну Linux та Unix-подібних систем.
Концепція “все є файлом” має значний вплив на організацію прав доступу. Права доступу до файлів у Linux є основою привілеїв користувачів. Якщо користувач має права на файл або каталог, він може виконувати з ними різні дії, як редагування, перейменування, переміщення або видалення. Також можна налаштувати права для інших користувачів або груп, щоб вони могли читати, змінювати чи запускати файли. Усі ці операції контролюються встановленими правами доступу.
Винятком з цих правил є суперкористувач, відомий як root. Цей обліковий запис має спеціальні привілеї та не обмежений жодними правами доступу. Користувач root може виконувати будь-які дії в системі.
Звісно, будь-хто, хто отримає доступ до пароля root, зможе робити те ж саме. Це може призвести до хаосу, як з навмисними, так і випадковими наслідками. Навіть користувач root може наробити помилок, адже ніхто не ідеальний. Тому використання облікового запису root вважається небезпечним.
Рекомендованою практикою є уникання входу в систему безпосередньо під обліковим записом root. Натомість, слід використовувати звичайний обліковий запис користувача та застосовувати sudo для тимчасового підвищення привілеїв, коли це потрібно. Часто це потрібно лише для виконання однієї команди.
Перелік sudoers
Інструмент sudo вже встановлений на більшості сучасних дистрибутивів Linux, таких як Ubuntu 18.04.3, Manjaro 18.1.0 та Fedora 31, які використовувалися для підготовки цієї статті. Це не є неочікуваним, оскільки sudo існує з 1980-х років і став стандартним способом отримання прав суперкористувача майже в усіх дистрибутивах.
Під час встановлення дистрибутива, перший створений користувач автоматично додається до списку sudoers. Це перелік користувачів, які можуть використовувати команду sudo. Маючи права sudo, ви можете додавати до цього списку інших користувачів.
Однак, не варто надавати повні права суперкористувача будь-кому без потреби. Список sudoers дозволяє вказати, які саме команди можуть використовувати різні користувачі з sudo. Таким чином, можна обмежити їхні можливості, але при цьому дати змогу виконувати потрібні завдання.
Виконання команди від імені іншого користувача
Спочатку sudo розшифровувалося як “суперкористувач виконує”, оскільки дозволяло виконувати команди як суперкористувач. Зараз його функціональність розширилася, і sudo можна використовувати для запуску команд від імені будь-якого користувача. Тому його перейменували на “замінний користувач виконує”.
Щоб виконати команду від імені іншого користувача, потрібно використати параметр -u (користувач). Наприклад, щоб запустити команду whoami від імені користувача mary, потрібно ввести: `sudo -u mary whoami`. Без параметра -u, команда виконуватиметься від імені root.
Звісно, використання sudo завжди вимагає введення пароля.
sudo -u mary whoami
У відповідь команда whoami повідомляє, що команда виконується від імені користувача mary.
За допомогою sudo можна увійти в систему від імені іншого користувача, не знаючи його пароля. Система запитає ваш власний пароль. Для цього потрібно використовувати параметр -i (логін).
sudo -i -u mary
pwd
whoami
ls -hl
exit
Після виконання цих команд, ви увійшли в систему як mary. Файли .bashrc, .bash_aliases та .profile для користувача mary обробляються так, ніби вона сама увійшла в систему.
Командний рядок показує, що це сеанс для користувача mary. Команда pwd повідомляє, що ви зараз у домашньому каталозі mary. whoami підтверджує, що ви використовуєте обліковий запис mary. Файли в каталозі належать mary. Команда exit повертає вас до вашого звичайного сеансу.
Редагування файлу sudoers
Щоб надати користувачам право використовувати sudo, потрібно відредагувати файл sudoers. Важливо робити це тільки за допомогою команди visudo. Вона блокує одночасне редагування файлу sudoers різними користувачами. Крім того, visudo перевіряє синтаксис файлу під час збереження.
Якщо зміни не проходять перевірку, файл не буде збережено. У вас є вибір: скасувати зміни, повернутися до редагування або примусово зберегти файл, що є поганою ідеєю. Не піддавайтеся спокусі, інакше можна втратити можливість використовувати sudo.
Команда visudo не є редактором, а лише викликає один із наявних редакторів. На Manjaro та Ubuntu visudo викликає редактор nano. У Fedora visudo запускає vim, який є більш потужним, але менш інтуїтивно зрозумілим.
Якщо ви хочете використовувати nano на Fedora, спочатку встановіть його:
sudo dnf install nano
Для використання nano на Fedora, потрібно викликати visudo наступною командою:
sudo EDITOR=nano visudo
Це чудовий кандидат для створення псевдоніма. Після цього відкриється nano з завантаженим файлом sudoers.
Додавання користувачів до групи sudo
Використовуйте visudo для відкриття файлу sudoers. Або використовуйте наведену вище команду для вказівки потрібного редактора:
sudo visudo
Прокрутіть файл sudoers до визначення запису %sudo.
Знак відсотка (%) вказує на групу, а не на користувача. У деяких дистрибутивах рядок %sudo може бути закоментований знаком #. Якщо це так, видаліть хеш та збережіть файл.
Рядок %sudo має структуру:
%sudo: ім’я групи.
ALL=: правило застосовується до всіх хостів мережі.
(ALL:ALL): члени групи можуть виконувати команди від імені будь-якого користувача або групи.
ALL: члени групи можуть виконувати будь-які команди.
Отже, члени групи sudo можуть виконувати будь-які команди від імені будь-якого користувача чи групи на цьому комп’ютері або будь-якому хості в мережі. Щоб надати користувачу повні права root та можливість використовувати sudo, потрібно просто додати його до групи sudo.
У нас є два користувача, Tom і Mary з обліковими записами tom і mary відповідно. Додамо користувача tom до групи sudo за допомогою команди usermod. Параметр -G (групи) вказує групу, до якої ми додаємо обліковий запис tom. Параметр -a (додати) додає групу до існуючого списку груп. Без цього tom буде додано до нової групи та видалено з інших.
sudo usermod -a -G sudo tom
Давайте перевіримо групи, в які входить Mary:
groups
Користувач mary є тільки в групі mary.
Перевіримо Tom:
groups
Tom є в групах tom та sudo.
Спробуємо, щоб Mary зробила щось з правами sudo:
sudo less /etc/shadow
Mary не може переглянути вміст /etc/shadow. Система повідомляє про відмову в доступі.
Подивимось, що у Tom:
sudo less /etc/shadow
Після введення пароля, Tom бачить файл /etc/shadow.
Додавши Tom до групи sudo, ми надали йому повні права sudo.
Надання користувачам обмежених прав sudo
Tom отримав повні права sudo. Це може бути більше, ніж ви хотіли. Іноді потрібно, щоб користувач виконував певні дії, які вимагають прав root, але не мати повного доступу до sudo. Для цього можна додати його до файлу sudoers і вказати, які команди він може використовувати.
У нас є Harry. Він не в групі sudo і не має прав sudo.
groups
Harry потрібно встановлювати програми, але ми не хочемо давати йому повні права sudo. Без проблем, запускаємо visudo:
sudo visudo
Прокрутіть файл вниз після визначень груп. Додамо рядок для Harry. Оскільки це визначення користувача, а не групи, знак відсотка (%) не потрібний.
Запис для Harry:
harry ALL=/usr/bin/apt-get
Зверніть увагу, що між “harry” та “ALL=” має бути табуляція.
Це означає, що Harry може використовувати команди, зазначені у списку, на всіх хостах мережі. У списку одна команда: /usr/bin/apt-get. Можна надати доступ до декількох команд, додаючи їх до списку через кому.
Додайте рядок до файлу sudoers та збережіть його. Щоб перевірити синтаксис, visudo можна запустити з параметром -c (лише перевірити):
sudo visudo -c
Visudo повідомляє про успішну перевірку. Тепер Harry має можливість використовувати apt-get для встановлення програм, але не інші команди з правами sudo.
sudo apt-get install finger
Harry має права sudo і може встановлювати програми.
Що станеться, якщо він спробує іншу команду з правами sudo?
sudo shutdown now
Harry не може виконати команду. Він має тільки обмежений доступ. Він може використовувати призначені команди, і не більше.
Використання псевдонімів sudoers
Щоб надати Mary ті ж права, що й Harry, можна додати рядок для користувача mary, аналогічно до Harry. Але більш елегантний спосіб – використовувати псевдонім User_Alias.
User_Alias у файлі sudoers містить перелік імен користувачів. Ім’я псевдоніма потім можна використовувати в правилах для представлення цих користувачів. Це спрощує зміну прав для багатьох користувачів.
Створимо псевдонім та використаємо його у файлі sudoers.
sudo visudo
Прокрутіть файл до рядка специфікації User_Alias.
Додайте псевдонім User_Alias, ввівши:
User_Alias INSTALLERS = harry, mary
Кожен елемент відокремлений пробілом, а не табуляцією. Структура псевдоніма:
User_Alias: вказує, що це псевдонім користувача.
INSTALLERS: довільне ім’я псевдоніма.
= harry, mary: список користувачів псевдоніма.
Змінимо рядок, який ми раніше додали для користувача harry:
harry ALL=/usr/bin/apt-get
Замініть його на:
INSTALLERS ALL=/usr/bin/apt-get
Тепер всі користувачі, вказані в псевдонімі INSTALLERS, мають право запускати apt-get. Перевіримо це з Mary:
sudo apt-get install colordiff
Mary може встановлювати програми, бо вона є в псевдонімі INSTALLERS, який має ці права.
Три корисні поради sudo
Якщо ви забули додати sudo до команди, введіть:
sudo !!
І остання команда буде виконана з sudo на початку рядка.
Після використання sudo та успішної автентифікації, пароль не потрібний для інших команд sudo протягом 15 хвилин. Щоб скасувати автентифікацію, скористайтеся:
sudo -k
Де можна побачити невдалі спроби sudo? Записи зберігаються у файлі /var/log/auth.log. Можна переглянути файл за допомогою команди:
less /var/log/auth.log
Тут видно запис про те, що користувач mary спробувала запустити команду вимкнення від імені root.
З великою силою…
… приходить можливість ділитися нею з іншими. Тепер ви знаєте, як надати вибіркові права іншим користувачам.