Резюме: "root" - це фактична назва облікового запису адміністратора. "sudo" - це команда, яка дозволяє звичайним користувачам виконувати адміністративні завдання. "Судо" не є користувачем.
Довга відповідь:
"root" (він же "суперпользователь") - це ім'я облікового запису системного адміністратора. Походження назви трохи архаїчне, але це не має значення.
Користувач Root має ідентифікатор користувача 0 і номінально має необмежені привілеї. Root може отримати доступ до будь-якого файлу, запустити будь-яку програму, виконати будь-який системний виклик та змінити будь-які настройки. (Але див. Нижче¹).
До винаходу команди "sudo", якщо ви хотіли виконувати адміністративні завдання, вам довелося увійти як корінь, або отримавши підказку для входу² якось, або за допомогою su
команди ("su" є короткою для користувача-замінника.) ³
Це трохи клопоту, а також не дає користувачам часткові адміністративні повноваження. Таким чином, була придумана команда "sudo" (скорочено "user substitute do").
Команда "sudo" дозволяє виконувати команди з привілеями суперрузера, поки ваш ідентифікатор користувача знаходиться у файлі sudoers, надаючи вам необхідну авторизацію.
Так, наприклад sudo vi /etc/hosts
, дозволить вам редагувати файл хостів так, як якщо б ви працювали як root. Вам навіть не потрібен кореневий пароль, а лише ваш власний пароль для входу.
І звичайно, sudo su
дозволив би вам просто стати root. Результат такий же, як якщо б ви увійшли в систему як root або виконали su
команду, за винятком того, що вам не потрібно знати пароль root, але вам потрібно бути у файлі sudoers.
Файл sudoers визначає, хто може використовувати команду sudo і що вони можуть робити з нею.
Файл sudoers - це те, що дає вам декілька адміністраторів⁴. Фактично, ваші адміністратори є root, а також усі, перелічені у файлі sudoers. Без файлу sudoers єдиним адміністратором є root.
Насправді в організаціях, де хтось інший адмініструє ваш комп’ютер для вас, звичайно не знати кореневого пароля вашого власного комп'ютера - доки ви знаходитесь у файлі sudoers, це не має значення.
В одній компанії, в якій я працював, з великою фермою серверів, лише дуже, дуже невелика кількість людей знала корінні паролі. Натомість була база даних про те, кому дозволено працювати на яких серверах. Автоматизований процес додав би вас до файлів sudoers тих серверів, до яких ви мали право доступу, і видалили вас, коли термін дії вашої авторизації закінчився.
Ще одне: сучасні версії Unix тепер можуть обмежувати навіть те, що може робити користувач root.
Під SELinux (Security Enhanced Linux) фактично існує список контролю доступу, який визначає, яка програма може робити що, і навіть root не може подолати ці обмеження.
У системі Apple Integrity Protection (SIP) (яка називається "без корінців") деякі файли та каталоги блокуються, щоб доступ до них мали лише програми із відповідного білого списку.
Ці системи існують для захисту системи від випадків, коли зловмисним користувачеві вдається отримати кореневий доступ. (Або в деяких випадках, щоб не допустити, щоб користувачі не могли зламати свої вбудовані пристрої.) З очевидних причин надзвичайно важко обійти ці обмеження, навіть із кореневим доступом.
² Запрошення "login:" - це ще один архаїчний фрагмент історії Unix, починаючи з тих часів, коли ми використовували термінали ascii на послідовних лініях замість віконних систем. Ви все одно можете отримати підказку "login:", просто ввівши login
будь-яке вікно терміналу або відкривши з'єднання ssh (або telnet або rsh) до свого комп'ютера з інших місць. Ви можете увійти як інший користувач звідти, якщо хочете. (І якщо на вашому комп'ютері є послідовні порти, ви все одно можете налаштувати його для входу в них.)
³ Можливо також, щоб окремі програми отримали кореневий доступ. Ці програми можуть робити все, що може зробити користувач із кореневим доступом, навіть коли він працює звичайним користувачем. Зазвичай вони обмежуються конкретними завданнями. Наприклад, програма crontab має привілеї root, щоб вона могла редагувати таблиці cron. Очевидно, що "sudo" має кореневі привілеї, щоб він міг робити те, що робить.
Я розкрию ще одну точку, яку я оглянув раніше. Я використовую взаємозамінно "адміністратор" і "root", але є й інші види адміністраторів. Їх часто називають "рольовими обліковими записами", що означає, що ці рахунки не належать до реальних людей, а натомість існують для виконання певної ролі в системі. Якщо ви подивитесь на /etc/passwd
файл у своїй системі, ви знайдете десятки і десятки таких акаунтів.
Наприклад, якби mysql був встановлений у вашій системі, був би користувач "mysql", а всі файли баз даних, конфігураційні файли тощо були б у власності цього користувача. Лише цей користувач мав би необхідні дозволи для доступу до файлів та запуску сервера mysql. У певному сенсі цей користувач був би обліковим записом адміністратора, але лише для mysql.
Якщо вам потрібно було виконати адміністративні завдання бази даних, ви або станете "mysql" за допомогою su mysql
команди, або використовуєте sudo
там, де файл sudoers надасть вам привілеї mysql для цих конкретних команд.