Чи можу я створити * super * суперкористувача, щоб я міг фактично мати користувача, який може відмовити в дозволі на root?


34

Я думав, що може бути вигідніше мати користувача з дозволами, вищими за кореневих.

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

Однак, я хотів би можливість відмовити у привілеях використовувати корінь у надзвичайно відокремленому випадку.

Одна з переваг цього дозволить мені запобігти встановленню певних небажаних файлів під час оновлень. Це лише приклад однієї можливої ​​переваги.

Оскільки оновлення apt-get запускаються під коренем або з привілеями sudo, apt-get має можливість замінювати певні непотрібні файли під час оновлень.

Якщо я міг би відмовити в цих привілеях для цих окремих файлів, я міг би встановити їх як посилання на /dev/nullабо, можливо, мати порожній файл-заповнювач, який міг би мати дозволи, які б заперечували його заміну під час оновлення.

Крім того, я не можу не нагадати про рядок, про який було сказано в інтерв'ю одному з творців Ubuntu, коли хлопець сказав щось про те, як користувачі краще довіряють "нам" (маючи на увазі розробників Ubuntu) ", ​​оскільки у нас є root ", яка була посиланням на те, як виконуються оновлення системи з дозволом root.

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

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

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


Примітка. Хоча я вважаю, що прийнята відповідь найбільше відповідає критеріям, мені дуже подобається відповідь від @CR. також.

Я хотів би створити фактичного користувача вище на дереві (мені), але, мабуть, мені просто доведеться сісти одного дня, коли встигну розібратися.

Крім того, я не намагаюся тут вибрати Ubuntu; Я б не використовував це як основний дистриб'ютор, якби я відчував це негативно.


4
Про які файли ви говорите і чому? " запобігти встановленню певних небажаних файлів _" передбачає, що файли (як правило) не існують, і ви хочете зупинити їх; але "_ що б заперечувало заміну файлу під час оновлення. " припускає, що файли вже існують (з, мабуть, бажаним вмістом), і ви не хочете нових версій.
TripeHound

6
Майте на увазі, що будь-який метод, який запобігає apt(над) запису файлів, може призвести до помилки, перервавши процес оновлення. aptПотім відмовлятиметься робити будь-які оновлення чи установки, поки "проблема" не буде вирішена.
Дубу

6
"Просто змінити процедуру установки, щоб сказати, що вирішення цієї проблеми абсолютно не те, що мене тут цікавить." Можливо, і так, але це, як правило, правильний спосіб вирішити проблему, як заявлено. Обмеження root може бути зроблено (формально, root-in-userland - це не той самий рівень доступу, як режим ядра), і існують системи для його виконання, але це суперечить філософії Unix та основним принципам безпеки. Взагалі, коли у когось є "частковий" корінь, виключно складно зафіксувати чорний список всього, що він може використовувати, щоб отримати "повний" корінь. Віддайте перевагу лише корінню для надійного коду.
Кевін

8
@mchid: root - повний контроль. У цьому вся суть. Для того, щоб він не мав повного контролю, ви повинні заперечувати так багато речей, що він більше не схожий на root (наприклад, не встановлюється модулів ядра, немає встановлення довільних пристроїв тощо). Якщо ви не хочете запускати речі як root, то не запускайте їх як root. Натомість, роздайте можливості (за винятком усіх кореневих еквівалентів , не турбуйтеся з ними) або запустіть демон, як polkitd, який виконує кореневі операції від імені некореневих процесів.
Кевін

4
@mchid: У цьому проблема: Існує велика кількість способів, щоб програми обходили ваші обмеження. Якщо ви не встановите чорний список усіх цих способів, будь-яка програма, яку ви запускаєте як "обмежений корінь", все одно може стати повноцінним корінням, коли цього захоче. Отже вся ваша схема - це не що інше, як шарада театру безпеки.
Кевін

Відповіді:


83

Потрібного користувача називають LSM: Linux модулем захисту. Найвідоміші - SELinux та AppArmor.

Цим ви можете запобігти певним файлам файлів (та їх дочірнім процесам) робити певні речі (навіть якщо їх UID є root). Але ви можете дозволити ці операції gettyі дочірнім процесам, щоб ви могли це робити вручну.


2
Але якщо їх UID є кореневим, чи не можуть вони змінити дозволи selinux, які перешкоджають їм доступу в першу чергу?
curious_cat

11
@curious_cat: Так, звичайно, вам потрібно відмовити процесу "обмеженого корінця" у можливості змінити / підняти власний дозвіл! Люди, які писали SELinux, думали про це вже ...
Пітер Кордес

8
@curious_cat Ви можете налаштувати LSM так, що змінити їх конфігурацію під час роботи абсолютно неможливо. Вам потрібно перезавантажити і надати параметр ядра, щоб потім це зробити.
Hauke ​​Laging

5
@Joshua Якщо у вашій копії apt-get використовується Rowhammer, у вас виникають більші проблеми.
Драконіс

3
@corsiKa По-перше, ви хочете обмежити людей, які можуть завантажувати машину, людям, які фактично знаходяться за машиною, оскільки системи вразливі під час завантаження. Запуск перезавантаження через мережу - це добре, але дозволяти керувати, оскільки він завантажується, це не так. По-друге, правило комп’ютерної безпеки полягає в тому, що ви не можете нічого робити, коли зловмисник має фізичний доступ, оскільки тоді вони також можуть занурити все в LN2 / перемотати апаратне забезпечення / тощо. Так, так, звичайно вважається, що хтось, хто може змінити завантаження машини, "виграв" машину.
HTNW

51

Ви нерозумієте поняття rootкористувача.

Простий англійською мовою rootзнаходиться на «верхівці дерева».

Що робити, якщо ви одного дня вирішите мати "супер супер користувача", а потім наступного місяця "супер супер користувача" (!). Наскільки далеко "дерево" ви хотіли б зайти? Як би ви змінили всі дозволи та ієрархію, щоб це працювало? Хто завжди на вершині? Хтось повинен бути на вершині, і це root. Кінець історії.

Наведені тут рішення - включаючи AppArmor та SELinux - насправді цього не змінюють. Вони просто дозволяють тонший контроль зерна за rootдозволами та процесами.

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

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

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


Я був би вгорі не корінь, кінець історії. Оскільки в ієрархії користувачів немає рівня, що є вищим, саме тому я хотів би створити більш високого користувача.
mchid

Хоча, це те, що я хочу: контроль над кореневими дозволами та процесами, щоб я міг відмовити в дозволі на root. Якщо я можу якось відмовити в дозволі на root, не створюючи нового користувача за допомогою SELinux або AppArmor, я думаю, мені не потрібен новий користувач. Я хочу повного контролю, більше контролю, ніж root.
mchid

16
Ви не можете мати користувача, який має "більше дозволів", ніж root. Ось і вся проблема. Користувач, якого ви хочете створити, - це по суті кореневий користувач. До цього потрібно підходити іншим способом, наприклад, створити користувача з rootпривілеями, а потім відмовити певним, де ви хочете більш точного контролю. Те, що ви запитуєте ("більше контролю, ніж root"), неможливо, або навіть річ!
Енді

@mchid Отже, що ви насправді хочете зробити, це перейменувати поточного користувача root на mchid, створити нового користувача під назвою root та змусити apt-get et al використовувати нового, некористувального користувача?
Одалрік

У деяких системах rootнемає дозволу на прямий доступ до обладнання. Якщо ви вимкнете завантаження модулів ядра, ви можете залишити root заблокованим від повного контролю над апаратним забезпеченням ( /dev/memі подібними речами). Не дуже актуально для дозволів файлової системи, оскільки ви б не використовували apt-get, який спілкувався безпосередньо з вашим контролером SATA або NVMe ... Але технічно, стан "більше дозволів ніж root", і він називається режимом ядра. : P
Пітер Кордес

26

Якщо ви просто хочете запобігти зміні / видаленню файлів чи каталогів, просто встановіть на них непорушний прапор.

chattr +i <file>

Навіть root не зможе зробити їм що-небудь, якщо прапор не буде знято. Також можна використовувати систему контейнерів / простору імен для запобігання доступу до коренів, але це здається зайвим для того, що вам потрібно.


11
Але корінь може видалити прапор.
sebasth

10
apt, як і майже все, не використовуватиме chattr для видалення цього прапора.
CR.

13
@sebasth: Правильні, але сценарії встановлення Apt, dpkg та пакетів не (як правило) змінюють атрибути файлів. Натомість вони просто не зможуть і скаржаться, коли намагаються змінити файли незмінним прапором.
Девід Фоерстер

4
@TripeHound Отже, ОП хоче apt-getдосягти успіху в заміні файлу, не маючи цього файлу недоторканим? Це дещо суперечливо смію сказати.
Дмитро Григор’єв

3
@DmitryGrigoryev Це звучить , як вони хочуть , apt-getщоб думати , що вдалося , але залишити один або кілька файлів без змін. Вони не кажуть, які файли чи чому, але, як ви кажете, дещо суперечливі - і схильні до "дивної поведінки" в майбутньому.
TripeHound

9
  • Замість того, щоб мати супер-суперкористувача, ви можете обмежити root. див. Які різні способи встановлення дозволів на файли тощо на gnu / linux

  • Є також AppArmor та SELinux.

  • І / або конфігуруйте sudoтак, щоб не надавати повних привілеїв root. Ви можете налаштувати його так, щоб користувач міг виконувати лише попередньо узгоджені команди з попередньо узгодженими аргументами.

  • Ви також можете використовувати віртуалізацію для обмеження root:

    • групи, простори імен, chroot тощо (докер робить це)
    • Ксен
    • Virtualbox
  • Дивіться також etckeeper: редакція цього інструменту керує /etcкаталогом та синхронізується з apt. За замовчуванням він не захищений, шкідливий інсталятор може його саботажу, але ви також можете змусити його перенести зміни до сховища резервного копіювання, захищеного стіною.

  • Використання контролю версій в цілому, із сховищем резервного копіювання, захищеним від стін. Це допомагає при випадковій, навмисній корупції та несправності обладнання.


Репозиторії резервного копіювання, що захищаються файлом, можуть знаходитися на іншій машині, в Інтернеті або на іншій віртуальній машині (або на хості віртуальної машини).


8

Для програмного забезпечення типу APT , які в звичайному режимі вимагають доступу майже до всієї системи, обмеження є проблематичним. Навіть якщо ви заважаєте йому отримати доступ до певних частин системи, швидше за все, зловмисним дистриб'юторам є більш ніж достатньо можливостей. Наприклад, замінивши бібліотеку або просто двійкову або додавши зловмисну ​​зміну конфігурації, яку необмежений корінь збирається використовувати з часом.

Залежно від обсягу обмежень, деякі сценарії встановлення можуть бути порушені.

Щоб обмежити програми та користувачів, ви можете написати AppArmor або політику SELinux. Така політика, яка підтримується більше, залежить від вашого розповсюдження: на базі Debian є краща підтримка AppArmor, тоді як дистрибутиви на базі Fedora / RHEL включають SELinux за замовчуванням.

І AppArmor, і SELinux працюють над політиками білого списку , які містять правила, які дозволяють (або відмовляти) певні дії. Політика застосовується до процесу в exec , так само користувачі можуть бути обмежені, коли політика застосовується до їх процесів під час входу. Добре продуманої політики не можна обійти (якщо помилки ядра не враховуються). Обмежений процес, що працює як root (uid 0), обмежений налаштованою політикою і не може його змінити, якщо прямо не дозволено в політиці.

Мова політики AppArmor визначає правило заперечення , яке можна використовувати для створення політики чорного списку . Місце хороше , щоб почати з AppArmor це AppArmor сторінки людини , вики і шукає існуючу конфігурацію на вашому дистрибутиві в /etc/apparmor.d/.

Багато матеріалів для адміністрування та розробки SELinux надаються у вікі SELinux . Довідкова політика SELinux розміщується на github.


7

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

Пару років тому Microsoft випустила патч, який зламав машини Windows 10 від спілкування з нашими старими контролерами домену Samba NT4. Коли проблему було знайдено, ми прикрепили пакет Samba, щоб залишитися в поточній версії, і aptвсе ще функціонували правильно.

Повний посібник Debian добре пояснює процес:

У /etc/apt/preferences(або новий файл внизу /etc/apt/preferences.d/) додайте текст, щоб вказати пакет та версію:

Package: samba
Pin: release v=3.6.6-6+deb7u7
Pin-Priority: 900

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

ПРИМІТКА. Ця відповідь передбачає, що у вас проблема XY


Я відповів на ряд проблем XY сам на askubuntu. Однак apt - це лише приклад, і це те, що веде мене до ідеї. Мене більше цікавить аспект усієї справи "влада-корупція-і-абсолют-влада-корумпованість-абсолютно". Повна і абсолютна влада над моєю власною системою - це те, що веде мене в першу чергу до Linux. Усвідомлення того, що моя влада не завжди є абсолютною над коренем, - це щось непорушне; ідея абсолютної влади є привабливою.
mchid

Крім того, я думаю, це дещо проблема XY, але Y ось "як я відмовити в дозволі на отримання root, коли root є суперрусером?"
mchid

1
@mchid не в тому, щоб заборонити права доступу до root, а відмовити щось у програмі, що працює як root.
Джон Кітс

6

Насправді це досить просто.

Корінь - ваш "супер супер користувач"

Створіть обліковий запис під назвою "адміністратор" і дайте йому всі права доступу root, крім тих, які ви не хочете.

Потім створіть користувача під назвою bob, і нехай він "стає адміністратором". Використовуючи su або навіть sudo.

Тепер у вас є звичайний користувач (bob), супер користувач, який може робити адміністратор (адміністратор) та супер супер користувач (root).

Якщо ви хочете змінити ім'я "корінь" на щось інше, ви навіть можете це зробити. Технічно має значення лише ідентифікатор користувача (0).


Якби у мене був звичайний користувач (bob), суперкористувач, який може робити адміністратор (адміністратор), і супер супер користувач (root), корінь би все одно не робив усі адміністративні матеріали з фоновими процесами, кроніфікаціями та інші речі як ідентифікатор користувача (0)?
mchid

ні, якщо ви цього не хочете. Більшість сервісів дозволяють вам вибрати, який користувач виконує роботу. Ви можете налаштувати його, щоб користувач адміністратора був тим, хто запускає процеси. Є кілька винятків, але не багато.
coteyr

Чи не довелося б мені пройти і встановити всі ці процеси окремо?
mchid

3
Ось що відбувається, коли ви намагаєтесь порушити стандартні умови. Я думаю, що вам потрібно краще зрозуміти, як і чому дозволу системи в * nix середовищі.
Шауна

2
Я погоджуюся з Shauna, вам здається, вам не вистачає принципового розуміння системи дозволів * nix. Це дуже потужно, але це не що інше, як вікна.
coteyr

3

Якщо ви хочете просто запобігти встановленню конкретних файлів, обмеження дозволів root не є способом робити це. Варто також відзначити, що звичайні відповіді (незмінні файли або LSM) не працюватимуть для вашого конкретного випадку використання, оскільки APT (і більшість інших менеджерів пакетів) виграють, якщо вони не зможуть встановити файли.

Справжнє питання, яке ви хочете задати:

Чи є спосіб запобігти установці APT певних файлів?

Це щось зовсім інше, ніж те, що ви запитуєте на кількох рівнях.

Що стосується цього питання, я не впевнений на 100%, але я знаю, що ряд інших менеджерів пакетів мають можливість запобігти встановленню конкретних файлів (наприклад, система Portage Gentoo має опцію INSTALL_MASK=, яка фактично приймає оболонку -стилі шаблони речей, які не встановлювати). Я б більше хотів зробити ставку на те, що такий варіант існує для APT (або, можливо, і самого dpkg).


Дійсно, "Чи існує спосіб запобігти встановленню APT конкретних файлів?" не моє питання; це лише приклад і те, що донесло питання до мене. Новий Firefox постачається з додатками та встановлює ці файли навіть після того, як користувач видалить їх новими оновленнями. Це насправді не проблема; саме це змусило мене зрозуміти, що я хочу ще більше контролювати свою систему. Я, однак, ціную вашу логіку тут, оскільки я сам відповів на кілька запитань таким чином, дякую за внесок.
mchid

dpkg-divert робить це: unix.stackexchange.com/a/157896/70847
mchid

1

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


1

Робота з встановленого приводу

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

Нехай система X є вашою робочою системою, а система Y іншою системою, якою ви керуєте

  1. Змонтуйте каталог з Y як привід X
  2. Налаштуйте права таким чином, щоб кореневий користувач X мав права на все на цьому встановленому диску, за кількома винятками

Тепер у вас є "робочий корінь", який може робити майже все, і у вас є "суперкорень", фактичний кореневий обліковий запис системи Y, який справді може зробити все.


Мені подобається ідея, хоча, я хотів би це зробити в запущеній системі.
mchid

1

Ви можете запустити подібний гіпервізор типу 1 гіперсенсор Xen, і мати хостинг звичайної ОС як віртуалізований гість. Гіпервізор контролює віртуальну гостьову ОС на рівні "глибшому", ніж кореневий, оскільки він має контроль над (віртуальним) обладнанням, на якому працює гостьова ОС.

Ви можете запрограмувати гіпервізор для маніпулювання гостьовою ОС різними способами, включаючи зміну дозволів, створення та застосування резервних копій, підключення певних змін або вказівок у гостьовій ОС для введення додаткової функціональності, перевірки тощо. реалізувати систему типу Unix з "користувачем" (фактично функцією гіпервізора) для "робити речі, навіть root не може зробити"

Моє відчуття, що такий підхід, мабуть, є надмірним


Як гіпервізор перешкоджає користувачеві з дозволом root виконувати все, що завгодно, в гостьовій машині?
fpmurphy

Ця відповідь починається нормально, але потім граматично збивається з глузду (це читання неправильним способом чи принаймні двозначністю). Я зробив виправлення.
ctrl-alt-delor

1
@ fpmurphy1 гіпервізор може підключити системні виклики, застосувати політику тощо, щоб застосувати довільні обмеження для користувача root або будь-якої іншої частини гостьової ОС. Можливо, моя відповідь не є хорошою, тому що це занадто багато роботи, якщо у вас немає справжнього випадку використання підприємства чи щось, хоча ...
Nathan Smith

@ ctrl-alt-delor Дякую за виправлення, але я не думаю, що граматика була проблемою. Я уточнив, що мав намір сказати, і я ціную відгуки, що спочатку мої думки були не зрозумілі
Натан Сміт

1
@ fpmurphy1 у гостя ви маєте повний корінь. Однак це не той самий корінь, як корінь на хості. Тому він є меншим коренем, ніж корінь-хост. Докер дозволить речам бути більш інтегрованими, але все-таки поставити обмеження на root.
ctrl-alt-delor

1

Подивіться на контрольних групах і просторах імен Linux в якості альтернативного способу досягнення цього типу мети, а також інструментів , заснований на них , як Докер і LXD .

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


0

НЕУСТАНОВА sudo

Як про видалення sudoта лінк /bin/suдо /bin/false? З'єднайте це, переконавшись, що rootне можете увійти через систему, sshі ви заблокували систему.

Це робить rootкористувача Super * Super і всі інші підпорядковані цьому.

Для файлів, замінених під час оновлень, просто не робіть жодних оновлень. Більш реалістично, змінити права доступу до файлів , щоб 440або 444таким чином , вони не можуть бути записані. Або помістіть їх у сховище git, щоб, якщо вони перезаписалися, його можна буде повернути.


Розумієте, я все ще хочу робити оновлення, і я все ще хочу, щоб root робив майже все те, що зазвичай робить root. Однак я хочу сказати, що корінь "ей, не роби цього" або "ні, ти не можеш цього зробити", як батьківський авторитет міг би зробити це для потомства. Як і зараз, Корінь схожий на батьківський авторитет у моїй системі, і всі маленькі діти говорять: "Мама я можу?" коли вони використовують судо. Це добре. Однак майже кожна людина на цій планеті є кимось потомством. Здається, що деякі відповіді тут схожі на те, що малюк був би перед самосвідомістю, коли не усвідомлює
mchid

. . . що бабуся і дідусь - це матері і батьки мами і тата. Я хотів би попросити дідуся жити в моїй системі, тому що зараз корінь - це тато будинку, і дідусь може сказати тато, що робити, тому що дідусь є
татовим

Здається, ви додали занадто багато людей, які мають сили судо. Відрегулюйте sudoersфайл, щоб лише вибрані користувачі могли судо наперед обрані команди.
користувач176717

У файлі sudoers у мене є лише два користувачі, включаючи root. Я намагався за допомогою іміджу пояснити, як, здається, деякі люди не розуміють мого питання і чого я хотів би досягти.
mchid

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