Зрозуміло, 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 над command
s (див. 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