Чому команді sudo не потрібен пароль для кореневого доступу?


48

Я деякий час використовую Linux і кожного разу, коли я вводив текст, sudoя вважав, що я переходжу на кореневого користувача для команди.

Мабуть, це неправда, тому що мені потрібно лише пароль мого облікового запису користувача. Я здогадуюсь, оскільки я не працював із кількома користувачами, я не дуже помітив цього в реальному світі.

Я не впевнений, як Ubuntu налаштовує свій перший акаунт. Чи є користувач root? Я корінь? Я здогадуюсь, що я щойно створив нового користувача після встановлення, але він дав мені привілеї root? Тут трохи розгублено ...

То чому мені дозволяється запускати кореневі команди із паролем мого користувача?


Використовуючи, кому користувачеві потрібен пароль, а в якому - ні? Яку команду ви виконуєте? Пам'ятайте, що sudo зберігає ваш пароль деякий час, перш ніж вам доведеться його повторно вводити.
Брайам

11
sudoвстановлений біт "setuid". Отже, він працює як користувач, який йому належить (що є коренем у всіх стандартних системах, якщо я не помиляюся), а не користувач, який його запускає. sudoпотім завантажує /etc/sudoersфайл і перевіряє, що дозволено, залежно від того, хто його запустив.
ЛоуренсC


1
Вибачте, якщо повторюю щось, що хтось сказав, але я не міг його знайти. Відповідь: Це політичне рішення. Моя найкраща здогадка про мотивацію полягає в тому, що у великій установці, де у вас багато людей з sudoпривілеями, можливо, працюєте в географічно розподілених місцях і на 24 × 7 змінах, ви хочете негайно відкликати пільговий доступ однієї людини (наприклад, якщо ви підозрюєте його цілісність). Якщо всі користуються єдиним кореневим паролем, і ви змінюєте це без попередньої координації, може виникнути хаос. …
G-Man каже: «Відновіть Моніку»

1
@HagenvonEitzen Я знаю, що я запізнююся на пару днів, але як це не є справою нашого питання?
strugee

Відповіді:


65

У деталях він працює наступним чином:

  1. /usr/bin/sudoвиконуваний файл встановлений встановлений біт , тому навіть коли він виконується іншим користувачем, він працює з ідентифікатором користувача власника файлу (root у цьому випадку).

  2. sudoперевіряє у /etc/sudoersфайлі, які у вас є привілеї та чи дозволено вам виконувати команду, яку ви викликаєте. Говорячи просто, /etc/sudoersце файл, який визначає, які користувачі можуть запускати, які команди використовують sudoмеханізм.

    Ось як виглядає цей файл на моєму Ubuntu:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    Третій рядок - це те, що, мабуть, вас цікавить. Це дозволяє будь-кому з групи "sudo" виконувати будь-яку команду, як будь-який користувач.

    Коли Ubuntu налаштовує перший обліковий запис під час встановлення, він додає цей обліковий запис до групи "sudo". Ви можете перевірити, до яких груп належать користувачі за допомогою groupкоманди.

  3. sudoзапитує вас про пароль. Щодо того, що йому потрібен пароль користувача, а не корінний, то це уривок із посібника із судерів :

    Аутентифікація та ведення журналів

    Політика безпеки sudoers вимагає, щоб більшість користувачів ідентифікували себе, перш ніж вони могли використовувати sudo. Пароль не потрібен, якщо користувач, що викликає, є root, якщо цільовий користувач такий, як користувач, що викликає, або якщо політика вимкнула автентифікацію для користувача або команди. На відміну від su (1), коли sudoers вимагає автентифікації, він перевіряє облікові дані користувача, а не цільового користувача (або root). Це можна змінити за допомогою прапорів rootpw, targetpw та runaspw, описаних пізніше.

    Однак насправді sudoне потрібен ваш пароль користувача ні для чого. Він попросить це просто переконатися, що ви насправді є вами, і надати вам якесь попередження (або шанс зупинитися), перш ніж викликати якусь потенційно небезпечну команду. Якщо ви хочете вимкнути пароль із запитом, змініть запис sudoers на:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Після аутентифікації sudoстворюється дочірній процес, який запускає викликану команду. Дитина успадковує ідентифікатор користувача root від свого батька - sudoпроцес.


Отже, відповідаючи на ваші запитання точно:

Я думав, що я перейшов на кореневого користувача для команди.

Ви були праві. Кожна команда, що передує sudoзапуску, має ідентифікатор користувача root.

Чи є користувач root?

Так, існує кореневий обліковий запис користувача, окремо від вашого облікового запису користувача, створеного під час встановлення системи. Однак за замовчуванням в Ubuntu вам не дозволяється входити в інтерактивний термінал як користувач root.

Я корінь?

Ні, ти не корінь. Ви маєте право лише запускати окремі команди як корінь , використовуючи sudoописаний вище механізм.

То чому мені дозволяється запускати кореневі команди із паролем мого користувача?

Вам потрібно ввести пароль користувача лише через sudoвнутрішній механізм захисту. Його можна легко відключити. Ви отримуєте свої кореневі повноваження через встановлений біт /usr/bin/sudo, а не через паролі, які ви вводите.


6
Відповідь дійсно повинна починатися з встановленої частини, тому що це насправді можливо. / etc / sudoers - лише причина гнучкості команди sudo.
Даніель Куллманн

Цікаво. Я не знав, що ви можете вказати, що sudoможна запустити без введення мого пароля. Чудова відповідь!
jwir3

1
Зауважте, що sudo може бути налаштований на запит кореневого пароля з rootpwпрапором sudoers.
Відновіть Моніку - М. Шредер

2
Насправді ви можете увійти як користувач root: sudo su - rootзробить саме це і дасть вам кореневий термінал. Однак ви не можете легко увійти в сеанс робочого столу як root.
jmiserez

1
По суті, він sudoмає власне привілей на root, і він вирішує, надавати вам це на основі файлу конфігурації.
Siyuan Ren

15
  • Вся справа в sudoтому, щоб надати вам чужі привілеї (як правило, root), не запитуючи пароль цього іншого облікового запису (на відміну від цього su).

  • sudo просить тут ввести пароль просто для того, щоб перехожий не зловживав вашим розблокованим терміналом.

  • Ubuntu та багато інших ОС Linux та Unix надають початковому обліковому запису, створеному в момент встановлення, право запускати будь-які команди як root.

  • Незважаючи на те root, що все ще є обліковий запис під Linux, прямі rootвходи відключені за замовчуванням для кращої безпеки та простежуваності.


7
Хоча прямий кореневий вхід дійсно вимкнено за замовчуванням, у Ubuntu все ще є кореневий рахунок. Це вже не обліковий запис принаймні Solaris, де це за замовчуванням роль.
jlliagre

Велике спасибі - я завжди цікавився, як це все одно працювало, і тепер це має набагато більше сенсу.
mikeserv

5

Пьотр дав дуже вдале пояснення того, як sudoпрацює. Однак він насправді не мотивував, чому це працює саме так, тому я спробую додати це тут.

Перш ніж sudoкоманда була створена, ми мали suкоманду. Ця команда дозволяє одному користувачеві виконувати команди як іншому користувачеві, як правило, root(як sudoце стосується цільового користувача за замовчуванням). Це було абсолютно недискримінаційно, ви можете виконати будь-яку команду. Оскільки цим користувачем міг користуватися будь-який користувач, він фактично був еквівалентним входу в систему як такому користувачеві, він вимагав від вас знати пароль цільового користувача.

У якийсь момент було додано трохи більше контролю доступу: щоб користуватися su, ти повинен був бути членом wheelгрупи. Але оскільки ви все-таки можете виконати будь-яку команду, все одно має сенс вимагати від вас знати їх пароль.

Потрібно, щоб користувачі знали один одного або пароля суперпользователя, але не дуже безпечні. Часто просто потрібно надати певним користувачам обмежений доступ до якогось іншого облікового запису (це частина концепції безпеки, що називається принципом найменшої привілеї ). Це також ускладнює підзвітність: якщо кілька людей знають пароль облікового запису, і цей обліковий запис є помилкою чи зловживанням, ви не можете сказати, хто з них насправді це зробив.

Так sudoбуло створено. Замість того, щоб дозволити користувачам виконувати будь-яку команду, у неї є розроблений файл конфігурації, який коротко торкнувся у відповіді Пьотра, який точно визначає, хто може ним користуватися, до яких користувачів вони можуть перейти та які команди їм дозволено виконувати. За допомогою цього тонкодисперсного контролю над тим, хто може робити що кому, нам більше не потрібно вказувати користувачам цільового пароля облікового запису; якщо б ми це зробили, вони могли легко обійти всі елементи керування у файлі конфігурації, увійшовши як цей користувач. Натомість ми зазвичай вимагаємо від них довести, що вони є тим, ким вони ввійшли в систему, ввівши власний пароль - це покликане запобігти комусь скористатися обліковим записом, якщо термінал залишити без нагляду.

Ця вимога відхиляється від суперпользователя - цей обліковий запис може робити майже все, що потрібно в системі, не використовуючи її sudo, тому він вважався зайвим. Також у файлі конфігурації можна вказати, що користувачам взагалі не потрібно вводити пароль - деякі організації використовують це, коли вважають, що фізична безпека середовища їх робочої станції є достатньою для запобігання зловживань.


Я цього не досліджував, але я розумію, що однією з особливостей sudo, якої не має su, є те, що він (здатний?) Вести журнал про те, які команди виконувались користувачем, щоб легше було відслідковувати проблеми назад їх джерела. Я просто подивився на свою систему kubuntu і не бачу такого журналу, тому, можливо, це не поведінка за замовчуванням.
Джо

Щойно знайшли sudo вхід у /var/log/auth.log - разом з багатьма іншими речами, включаючи деякі IP-адреси з Китаю, які намагаються отримати кореневий доступ до моєї системи - так, якщо ви просто хочете побачити sudo, вам доведеться фільтрувати це через grep або подібне.
Джо

Правильно. suтакож записує журнали, але оскільки він лише запускає нову оболонку, вона просто записує факт, що хтось її запустив.
Бармар

Ви не можете покладатися на журнали, кожен, хто може отримати корінь, може змінити журнали (якщо ви не увійдете на іншу машину та переконайтеся, що ви не надаєте доступ до завершення транзакції журналу). Однак sudoдозволяє відкликати привілеї, не потребуючи повторного випуску пароля root для всіх, хто цього потребує.
ctrl-alt-delor

1
@richard Оскільки sudoви можете обмежити, які команди може виконувати користувач, ви можете спробувати переконатися, що ви не надаєте їм доступ до команд, які б перезаписали журнал.
Бармар

3

Відповідь на ваше запитання:

Коли ви запускаєте команду з sudo , ви запускаєте команду з підвищеними привілеями , тобто кореневими привілеями . Вам потрібно тільки ввести ваш звичайний пароль користувача , тому що ви (користувач) були додані в sudoers файл , який дає вам кореневі priviliges .


2
За винятком того, що sudo не передбачає підвищених привілеїв, просто різних для поточного користувача. Наприклад, ви могли запускати програму як звичайний користувач, який не має оболонки. Крім того, знаходження у файлі sudoers не дає кореня.
Джеймс Токнелл

1
@aragilar так sudoне завжди дає підвищені привілеї, але він працює з підвищеними привілеями, виконавши свою справу (перевіривши автентифікацію, вона може скинути привілеї). Для отримання змін користувачеві потрібні ці підвищені привілеї.
ctrl-alt-delor

1
Звичайно, sudoвикористовує підвищені привілеї (але це не характерно для sudo, наприклад, також mount), але команда, яку ви викликаєте, тобто commandв, sudo commandможе не використовувати (залежно від того, що встановлено /etc/sudoers).
Джеймс Токнелл

1

По-перше, вимкнення облікового запису зазвичай відбувається шляхом встановлення зашифрованого пароля на *, що не є зашифрованим значенням жодного рядка. Я зараз не можу перевірити, але я вважаю, що саме це робить і Ubuntu для root. Тож технічно немає кореневого пароля на Ubuntu.

Але судо передує Ubuntu; він був розроблений для систем, де, безумовно, були кореневі паролі. То чому він не вимагає пароля root? В основному, sudo призначений для надання дозволу на виконання певних команд певним користувачам --- наприклад, дозволити кореневому доступу розробника перезапустити веб-додаток, але не запускати довільні сервери. Знання пароля root, з іншого боку, надає вам необмежений доступ; ви можете використовувати login або su для відкриття кореневої оболонки та запуску довільних команд. Оскільки sudo повинен працювати для людей без такого рівня доступу, він не може вимагати запуску кореневого пароля.


Це також дозволяє скасувати корисні права користувача без зміни кореневого пароля.
Ян Д. Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.