Зрозуміло, sudoщо для мене це був би перший вибір у такому випадку. Основні з'являється точка , щоб бути , що більшість (фактичні) адміни не реально використовувати /etc/sudoersйого в максимально можливій мірі ( User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias).
Більшість адміністраторів користуються лише деякими існуючими правилами та додають користувачів, або ще гірше, просто додаючи користувачів до sudoгрупи, для якої зазвичай існує правило в налаштуваннях Ubuntu ( %sudo...). Це, звичайно, дає можливість відповідним користувачам безкоштовно керувати і повною потужністю облікового запису суперпользователя.
З огляду на ваш коментар:
тому я додав їх до /etc/sudoers
Я вважаю, що ви також не використовуєте його наскільки це можливо.
У такому сценарії, як ваш, я би дослівно написав кілька дій, якими Боб повинен обмежитися. Насправді це те, що я робив на сервері, який я підтримую, щоб дозволити двом конкретним користувачам перезавантажити конкретного гостя KVM на хості. Сценарії містять хешбанг з абсолютним шляхом до інтерпретатора (наприклад, #!/bin/dashзамість #!/usr/bin/env bash) та, ймовірно, працюватимуть із оболонкою, яка використовується в іншому місці для привілейованих завдань ( /bin/dashабо /bin/sh). Це лише запобіжні заходи. Крім цього, я б переконався, що жорстко кодують всі абсолютні шляхи до двійкових файлів і використовувати якомога менше їх. Наприклад, при використанні bash/ dashя вважаю builtinза краще s над commands (див. man bash). Це можна зробити досяжним, призначивши змінній абсолютний шлях і звернувшись до програми на основі цієї змінної ($VIRSHзамість /usr/bin/virsh). Якщо можете, перевірте код будь-яких зовнішніх скриптів, перш ніж викликати їх. Особливо, якщо вам потрібно називати їх у привілейованому контексті. У моєму випадку я також обмежую користувачів певним кореневим каталогом та певною підсистемою SSH, оскільки вони підключаються до машини лише за допомогою sshdаутентифікації та відкритого ключа. Очевидно, що вам це не потрібно.
Переконайтесь, щоб chown root: <the-script>; chmod u=rw,a=,a+rx <the-script>запобігти rootповодженню з ним будь-кого, крім власника. Будьте обережні setuidі з setgidбітами, включеними на цільових бінарних файлах ( findїх можна використовувати для їх виявлення). Припустимо на даний момент, у якому знаходиться ваш сценарій /usr/sbin/priv-action.
Тепер відредагуйте свій /etc/sudoers. noexecможе використовуватися для запобігання інших двійкових файлів, окрім явно дозволених. Насправді існує маса додаткових налаштувань, не лише тих, які я тут описую. Тому обов'язково проконсультуйтеся man sudoers.
Тепер я вважаю за краще називати користувачів ( User_Alias) у своєму sudoersфайлі, але ви також можете добре використовувати Group_Alias( man sudoers) або фактичну системну групу (наприклад %sudo):
# The list is comma-separated: bob,alice,...
User_Alias LIMITED_ADMINS=bob
а потім додайте псевдонім команди, щоб дозволити виконання цього конкретного сценарію:
# The list is comma-separated: /usr/sbin/priv-action,/bin/bash,...
Cmnd_Alias PRIV_ACTION=/usr/sbin/priv-action
І останнє, але не менш важливе місце - це магічна лінія, яка дозволить bob(вірніше, переліченим у списку користувачів LIMITED_ADMINS) виконувати привілейовані команди за допомогою сценарію:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
На відміну від попередніх визначень псевдоніму, цей рядок вимагає пояснення. Тож спочатку розберемося у частинах у рядку "Специфікація користувача". Тут man sudoersдопомагає:
Основна структура специфікації користувача є who where = (as_whom) what.
Приклад рядка (знайдений у більшості установок Ubuntu):
root ALL=(ALL) ALL
Це говорить про те, що користувач з іменем root (використовувати його #0для прив'язки до UID 0) може, на всіх хостах, працювати під будь-яким контекстом користувача будь-що, але йому буде запропоновано його пароль (при умові поведінки за замовчуванням). Додавання NOPASSWDтегу до останнього ALLтакож дозволить rootзробити те ж саме, не запитуючи пароль (як-от:) root ALL=(ALL) NOPASSWD:ALL. ALLє власним псевдонімом підстановки для різних типів псевдонімів.
Але повернемося до Боба:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
дозволить bobі іншим переліченим членам команди User_Alias LIMITED_ADMINSзапускати (на всіх хостах, ALLсаме для цього) як користувачеві root(група мається на увазі, але може бути задано, див. man sudoers) команди, задані в Cmnd_Alias PRIV_ACTION. Стає краще. Припускаючи, що ви пишете цей сценарій, ви можете дозволити різні параметри, тим самим уникаючи писати кілька сценаріїв. /etc/sudoersіз задоволенням приймає символи, що подібні до оболонок, щоб обмежити можливості аргументів, дозволених для передачі.
Я послідовно виявляв, що адміністратори не використовують sudoersспосіб, яким його слід використовувати, тому я оцінив відповідний "Hack" з двох книг "Linux Server Hacks" та "Linux Server Hacks том два", з чого я почав працювати більш досконале використання цього чудового засобу.
Ви можете придумати всі види суперечностей - що може не зовсім допомогти аспекту безпеки - рішення для вашого конкретного випадку, але як тільки ви промовите основний словниковий запас, /etc/sudoersви можете здійснити досить магічні подвиги :)
Примітка: майте на увазі, що ви також можете створити новий файл під ним, /etc/sudoers.d/якщо ви відчуваєте таке нахил. Це передбачає, що ваш /etc/sudoersрядок містить:
#includedir /etc/sudoers.d