Який найбезпечніший спосіб отримати привілеї root: sudo, su або login?


120

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

У Ubuntu ви можете використовувати sudo лише з "міркувань безпеки" за замовчуванням. Однак я не впевнений, що це безпечніше, ніж просто використовувати логін на текстовій консолі. Є занадто багато речей, які можуть піти не так, якщо зловмисник може запустити код як мій звичайний користувач. Наприклад, додавання псевдонімів, додавання матеріалів до мого PATH, встановлення LD_PRELOAD та X11 кейлогерів, щоб згадати лише деякі. Єдина перевага, яку я бачу, - це час очікування, тому я ніколи не забуду вийти з системи.

У мене такі ж сумніви щодо су, але у нього навіть немає обмеження в часі. Деякі операції (особливо перенаправлення IO) є більш зручними для su, але безпечніше це здається гіршим.

Вхід на консоль текстового режиму видається найбезпечнішим. Оскільки він запускається init, якщо зловмисник може керувати PATH або LD_PRELOAD, він вже вкорінюється. Події натискання клавіші не можуть бути перехоплені програмами, що працюють на X. Я не знаю, чи можуть програми, що працюють на X, перехоплювати [ctrl] + [alt] + [f1] (і відкривати вікно на повноекранному екрані, схоже на консоль) або це безпечно, як [ctrl] + [alt] + [del] у Windows. Крім того, єдиною проблемою, яку я бачу, є відсутність тайм-ауту.

То я щось пропускаю? Чому хлопці з Ubuntu вирішили дозволити лише судо? Що я можу зробити для підвищення безпеки будь-якого з методів?

Що з SSH? Традиційно root не може увійти через SSH. Але використання вищезгаданої логіки не було б це найбезпечніше:

  • дозволити root через SSH
  • перейти в текстовий режим
  • увійдіть як корінь
  • ssh на іншу машину
  • увійти як корінь?

Ви маєте на увазі у своєму рішенні ssh, що ви хочете перенести скриньку в потенційно обмежене поле з іншого поля? 1 / Якщо так, то, щоб слідкувати за своїм поглядом думки, ви повинні переконатися, що ваш інший ящик не буде порушений, перш ніж ви з нього схибите. 2 / Якщо ні, то у вас така ж проблема.
asoundmove

@asoundmove: У моїй службі ssh є 4 користувачі: root @ hosta, root @ hostb, stribika @ hosta, stribika @ hostb. Якщо припустити, що зловмисник може запускати довільний код як обидва stribikas (адже вони працюють з flashplugin та багато чого іншого), я все ще хочу безпечний кореневий доступ. Таким чином, обидва ящики можуть бути частково порушені.
stribika

Відповіді:


105

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

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

Важливо врахувати, для чого судо було розроблено судо: делегування певних команд (як, наприклад, для управління принтерами) "суб-адміністраторам" (можливо, студентам класів у лабораторії), не віддаючи повністю корінь. Використання sudo для виконання всього - це найпоширеніше використання, яке я бачу зараз, але це не обов'язково проблема, яку програма мала на меті вирішити (отже, смішно складний синтаксис конфігураційного файлу).

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

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

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

Використовувати паролі взагалі для SSH небезпечно, тому що нюхаючи паролем троянізовані ssh-демони встановлюються на щось на зразок 90% компромісів із реальною системою, які я бачив. Набагато краще використовувати SSH ключі, і це може бути працездатною системою і для віддаленого кореневого доступу.

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

Найвища безпека буде забезпечуватися одноразовими ключами або криптографічними маркерами на основі часу / лічильника. Це можна зробити за допомогою програмного забезпечення, але обладнання, стійке до фальсифікації, ще краще. У світі з відкритим кодом є WiKiD , YubiKey або LinOTP , і звичайно є також власна RSA SecurID у важкій вазі . Якщо ви є середньою чи великою організацією або навіть малою мірою безпекою, я настійно рекомендую вивчити один із цих підходів для адміністративного доступу.

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


Я прийму це як відповідь, оскільки він багато роз'яснює, про що думали розробники Ubuntu, роблячи метод sudo як метод за замовчуванням. Віддалений журнал також здається чудовою ідеєю, і якщо я вже використовую syslog-ng, налаштування не повинно бути надто важким, щоб усі мої комп'ютери входили в журнал для всіх інших. Я буду дотримуватися своєї сучасної практики переходу в текстовий режим і входу звідти для повного доступу до кореня. Делегування підмножини прав - це, безумовно, хороший спосіб використовувати судо, і я ніколи не розглядав.
stribika

7
sudoдуже схожий на контроль облікових записів користувачів у Windows Vista. Обидва насправді розроблені не для підвищення безпеки, а насправді для полегшення їх зниження у контрольованому вигляді. Але оскільки вони полегшують тимчасове підвищення ваших привілеїв низьким рівнем тертя, вам не потрібно працювати з підвищеними привілеями протягом тривалого періоду часу, тим самим підвищуючи безпеку. (Це не велика проблема в Unix, але в Windows я пам’ятаю, що я працював адміністратором цілими днями, лише тому, що переключення було настільки болісним.)
Jörg W Mittag

Пароль нюхає троянські демони ssh? Якщо вони можуть замінити демона ssh, вони вже мають root.
psusi

@psusi: так, у цій системі; У середовищі, де паролі (службою каталогів) розподіляються між кількома системами, компроміс легко поширюється таким чином. Навіть коли це єдина система, це клопотання переробити пароль кожного після перевстановлення після виявлення компромісу.
mattdm

1
Потенційні труднощі зміни всіх rootпаролів вашої компанії також згадуються як заключний пункт у картці звіту Ops , який варто прочитати.
Wildcard

30

Це дуже складне питання. mattdm вже охопив багато моментів .

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

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

Я підозрюю, що рішення Ubuntu було частково в інтересах простоти (пам'ятати лише один пароль) і частково в інтересах безпеки та простоти розповсюдження облікових даних на спільних машинах (бізнес чи сім’я).

У Linux немає захищеного уважного ключа або іншого захищеного інтерфейсу користувача для аутентифікації. Наскільки я знаю, навіть у OpenBSD немає. Якщо ви стурбовані кореневим доступом, ви можете взагалі вимкнути кореневий доступ із запущеної системи: якщо ви хочете мати root, вам потрібно буде ввести щось у запиті завантажувача. Це, очевидно, не підходить для всіх випадків використання. (* BSD в рівні захист працює таким чином: при високому рівні безпеки, є речі , які ви не можете обійтися без перезавантаження, таких , як зниження рівня захисту або доступу встановлена вихідних пристроїв безпосередньо.)

Обмеження способів стати корінним не завжди є вигодою для безпеки. Запам’ятайте третього члена тріади безпеки : конфіденційність , цілісність , доступність . Вимкнення себе із системи може запобігти реакції на інцидент.


Якщо вони можуть знайти ваш пароль, то вони можуть знайти кореневий пароль так само легко, якщо не простіше. Також ви можете використовувати sysrq-k як безпечну послідовність уваги.
psusi

У Linux є ключі уваги безпеки, ознайомтеся з документацією на ядро
btshengsheng

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

9

Дизайнери захищеного дистрибутива OpenWall GNU / * / Linux також висловили критичні думки щодо su(набуття root) та sudo. Можливо, вам буде цікаво прочитати цю тему:

... на жаль, і су, і судо є тонкими, але принципово хибними.

Крім обговорення недоліків suта інших речей, Сонячний дизайнер також орієнтується на одну конкретну причину використання su:

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

У своєму розпорядженні вони "повністю позбулися кореневих програм SUID у встановленні за замовчуванням" (тобто, у тому числі su; і для цього не використовують можливості):

Щодо серверів, я думаю, що людям потрібно переглянути і, в більшості випадків, заборонити користуватися су і судо користувачами. Немає додаткової захищеності від старого "входу як некорінного, тоді su або sudo до root" sysadmin "мудрості", порівняно з входом у систему як некорінне, так і як кореневе безпосередньо (два окремих сеанси). Навпаки, останній підхід є єдино правильним, з точки зору безпеки:

http://www.openwall.com/lists/owl-users/2004/10/20/6

(Для підзвітності декількох системних адміністраторів система повинна підтримувати кілька кореневих привілейованих облікових записів, як це робить Сова.)

(Для настільних ПК з X це стає складніше.)

Ви також абсолютно повинні мати справу з ...

До речі, вони повинні були замінити suloginз , msuloginщоб дозволити установку з декількома кореневих рахунками: msuloginдозволяють ввести ім'я користувача і при переході в одного користувача режим (і зберегти «відповідальність») (ця інформація виходить від цієї дискусії російською мовою ) .


1
Для системи, яка в основному призначена для брандмауера, і це не набагато більше, це добре, але якщо ви збираєтеся запускати, як випадковий приклад, mysql / postgresql / bind / powerdns / apache і що не у виробничій системі, ви запускаєте зіткнувшись з проблемами, як вони описують з X. По суті, вони торгували великою кількістю юзабіліті для певної безпеки; адміністратор системи вирішує, чи це справедливий компроміс. Особисто я буду дотримуватися Debian.
Шадур

4

Ви, здається, припускаєте, що використання sudoзавжди зберігає змінні середовища, але це не завжди так. Ось уривок із сторінки "Судо":

Є два різних способи поводження зі змінними середовища. За замовчуванням параметр env_reset sudoers увімкнено. Це призводить до того, що команди виконуються з мінімальним середовищем, що містить TERM, PATH, HOME, SHELL, LOGNAME, USER та USERNAME на додаток до змінних з процесу виклику, дозволеного параметрами env_check та env_keep sudoers. Існує фактично білий список змінних середовища.

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

У всіх випадках змінні середовища зі значенням, що починається з (), видаляються, оскільки їх можна інтерпретувати як функції bash. Список змінних середовища, які sudo дозволяє чи заперечує, міститься у висновку sudo -V при запуску як root.

Отже, якщо env_resetце ввімкнено (за замовчуванням), зловмисник не може замінити ваші PATHчи інші змінні середовища (якщо ви спеціально не додали їх до списку змінних, які слід зберегти).


1
Я мав на увазі, якщо зловмисник може контролювати мій шлях, він може змусити мене бігати чим-небудь замість реального / usr / bin / sudo. Наприклад / tmp / sudo, який друкує, Password: нічого не показує, коли я набираю текст, надсилає те, що я набрав до нього, каже, що пароль неправильний, а потім виконує справжнє sudo.
stribika

Хм, я думаю, у такому випадку ви можете просто запустити / usr / bin / sudo безпосередньо, а не покладатися на оболонку, щоб знайти її для вас. Але ти маєш рацію, це проблема, про яку я не думав.
Седрік

1
@CedricStaub: Наскільки я можу сказати, ніхто про це не думає. Я можу дати повний шлях, але спробуйте це: alias /usr/bin/sudo="echo pwned"окрім того, що існує багато програм (X, xterm, оболонка), будь-яка з яких може вкрасти пароль. Ось чому я сказав, що проблем із переключенням безпечно.
stribika

1
Ви пробували? Я зробив:bash: alias: `/usr/bin/sudo': invalid alias name
maaartinus

@maaartinus: Цікаво. Працює в ЗШ.
stribika

4

Найбезпечніший підхід - це вхід в ssh, використовуючи (принаймні) довгий ключ 2048 (при відключенні входу пароля), використовуючи фізичний пристрій для зберігання ключа.


1
Звичайно, крім кореня до кореня чи непривілейованого до непривілейованого, тоді переходимо на корінь? (Я фактично використовую 4096 бітові клавіші лише для того, щоб бути захищеним. Більші клавіші підтримуються не скрізь.)
stribika

@stribika Ну, і те, і інше. Якщо машина зламана, ви все одно не втрачаєте ключ. Це запобігає поширенню (найбільша проблема з паролями).
Let_Me_Be

3

Я просто хочу додати щось трохи поза темою. (для теми одна перевірка "/ bin / su -" тут після)

Я думаю, що вищезазначена "безпека" також повинна бути пов'язана з фактичними даними, які ми хочемо захистити.

Це буде і має бути інакше, якщо ми хочемо захистити: my_data, my_company_data, my_company_network.

Зазвичай, якщо я кажу про безпеку, я також про "безпеку даних" та резервне копіювання. Ми також можемо додати відмовні системи тощо.

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

Ціль Ubuntu був і, в основному, є кінцевим користувачем: Судо за замовчуванням.

Fedora - це безкоштовна версія RedHat, яка, в свою чергу, орієнтована більше на сервери: Sudo раніше було відключено.

Для інших дистрибутивів у мене немає прямої інформації.

Зараз я в основному використовую Fedora. І як старий користувач стилю я ніколи не набирав "су". Але я можу набрати "/ bin / su -" за дуже короткий час, навіть якщо я не зовсім друкарка. Змінна PATH .. не повинна бути проблемою (я набираю шлях). Крім того, "-" (мінус) в принципі має видалити змінні середовища мого користувача та завантажити лише кореневі. тобто уникати додаткових можливих неприємностей. Можливо, також LS_PRELOAD.

Я вважаю, що @mattdm був досить точним.

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

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

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

Другий випадок є більш тонким. Але є сигнали про ці заходи. У будь-якому випадку, ви можете зробити можливе, але я б не налаштовував свій домашній ПК на захист від терористичних атак!

Я пропущу інші сценарії.

ура F


2

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

Ви можете змусити використовувати клавіші для віддалених користувачів, але це може не пройти збирання для відповідності. Можливо, буде ефективніше встановити вікно шлюзу SSH, який потребує двофакторного аутентифікації, а потім дозволити використання ключа звідти. Ось документ про таке налаштування: Захистіть розгортання SSH за допомогою двофакторної автентифікації WiKID .


0

Ви також можете поглянути на PrivacyIDEA , який не лише надає вам можливість використовувати OTP для входу в машину (або для того, щоб робити su / sudo), але також може робити OTP в автономному режимі.

Крім того, він здатний керувати вашими ключами SSH. Тобто якщо у вас багато машин і декілька користувачів root, всі SSH ключі зберігаються централізовано. Таким чином, легко "відкликати" / видалити ключ SSH, якщо ключ більше не можна довіряти.

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

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