Надання доступу до набору команд некорінному користувачеві без sudo


13

Я хочу надати не-sudo доступ до некореневого користувача на моїй машині, є користувач dns-менеджер, його єдина роль - запускати всі команди BIND (rndc, dnssec-keygen) тощо.

Тепер кожен раз, коли він повинен виконувати команду, він набирає,

sudo rndc reload

Чи є спосіб я позбутися цього судо, але тільки на певному наборі команд (і лише для dns-manager)?


5
Дискреційний контроль доступу, як це, в значній мірі sudoпризначений. Які заперечення вашого бізнесу щодо його використання sudoдля цього?
MadHatter

1
@peterh Повторюю своє запитання: дискреційний контроль доступу (тобто часткове делегування системи) - це роль sudo. Які заперечення?
MadHatter

3
А як щодо пароля sudo? Або захищений паролем sudo для запуску інструмента управління DNS , який потім може працювати з namedгруповою або користувацькою привілеєм або кореневою привілеєю, якщо потрібно.
MadHatter

4
@peterh "вагомим приводом зробити це так" буде відсутній біт. Зазвичай такі питання виявляються проблемами XY у маскуванні, і я вважаю, що розуміння основного питання є ключовим для їх повного та професійного відповіді.
MadHatter

2
@peterh Я думаю, що ми погоджуємось між собою. Я теж хочу, щоб ОП покращила його питання; свердління в нього працює добре для мене, як спосіб допомогти авторові мислити поза рамкою, яку він побудував навколо себе. Він цілком може мати вагомі причини для того, щоб хотіти уникати sudo. Намагаючись висловити це нам, він може або очистити нашу плутанину, або свою власну - або і те і інше!
MadHatter

Відповіді:


31

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

Однак, sudo може мати дуже дрібну структуру дозволів, що дозволяє дозволити одному або більше користувачам видавати одну конкретну команду без пароля та TTY. Нижче я покажу три способи налаштувати це для ваших потреб. Що б ви не вибрали, користувач тепер зможе видавати команду sudo rndc reloadбез необхідності введення пароля.

(Крім того , це може бути зайвим, але ... будь ласка , чи не забудьте зробити резервну копію файлу sudoers , перш ніж редагувати його, щоб зберегти оболонку , де ви корінь відкритим в разі , якщо вам потрібно повернутися до резервної копії, і редагувати це використовується visudoзамість sudo vi /etc/sudoers. Сподіваємось, ці запобіжні заходи будуть непотрібними, але ... краще мати їх і не потребувати їх, ніж зворотне!)

1. Якщо ви не хочете вимагати TTY для будь-яких запитів

Найпростіший спосіб позбутися вимог TTY (якщо такий існує) - переконатися, що рядок, що починається з Defaultsна /etc/sudoers, не містить слова requiretty- натомість він повинен містити !requiretty. Однак якщо ви це зробите, це означає, що жодна команда sudo не потребуватиме tty!

Вам також потрібно буде додати рядок

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Якщо ви хочете вимагати TTY для всіх користувачів, крім цього

Це можна зробити, встановивши за замовчуванням для цього одного користувача, як-от цього:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Якщо ви хочете вимагати TTY для всіх команд, крім цієї однієї команди цим користувачем

Це трохи складніше, завдяки синтаксису файлу sudoers. Вам потрібно буде створити псевдонім для команди, а потім встановити типовий псевдонім для команди, як-от так:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

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

4

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

Конфігурація sudo є /etc/sudoersв більшості систем. Ви можете дізнатися його синтаксис за допомогою Googling або за допомогою man sudoкоманди.

Ви не повинні редагувати цей файл безпосередньо; це може призвести до перегонів безпеки. Натомість використовуйте visudoкоманду (яка є обгорткою навколо $EDITORзмінної середовища).


Після налаштування sudo ви можете легко обернути це навколо видимих ​​команд. Це дуже просто:

  1. Створіть каталог для списку скриптів для обгортки sudo (fe /usr/local/dnsadmin/bin)
  2. Створіть скрипт для обгортки для тих команд, які ви хочете, щоб вони використовувались без судо. Це буде дуже проста команда, наприклад, /usr/local/dnsadmin/bin/rndcбуде:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Отримайте цей каталог у PATHзмінній їх середовища (наприклад, на всій системі чи їх локальній .profile).


З цікавості - чому б ви використовували execв скрипті оболонки замість того, щоб просто викликати команду безпосередньо? (Я не кажу, що це неправильно. Мені просто подобається знати, чому ви це зробите, щоб я, можливо, щось дізнався)
Дженні Д

2
Я закінчую з безоплатним бітом sudo, ідея обгорткового сценарію чудова.
Відповіді

2
@JennyD :-) Через стабільність та продуктивність. У випадку exec, якщо викликана команда буде заміщена на місці оболонки. Оболонка піде. Без exec оболонка запустить цю команду, а потім чекає її закінчення, а потім виходить. Це друге, без виконання, означає безліч взаємодіючих процесів, що зайве. Але немає великої різниці, без exec це працювало б так добре, як і з цим.
петерх

@JennyD Моя благання :-)
peterh

@Snowbody Дякую вам дуже лекторство! Це дуже велика честь.
петерх

2

Хоча це зовсім не загальне рішення, у конкретному випадку rndcвам взагалі не потрібно sudo.

rndcможе спілкуватися з будь-яким namedпроцесом або через локальний сокет, або через віддалений порт, використовуючи секретний ключ для аутентифікації. За замовчуванням (або, принаймні, для debian, який є дистрибутивом, який я використовую) цей файл можна знайти в /etc/bind/rndc.keyі, як правило, читається лише для користувачів bindта групи bind.

Кожен, хто прочитав доступ до цього ключового файлу (або ідентичної його копії), може використовувати rndcдля управління сервером BIND, тому найпростішим рішенням у цьому конкретному випадку було б додати користувача до bindгрупи.

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


-1

Ви не хочете використовувати sudo для надання root для деяких команд. Натомість ви можете chmod 4750 конкретну програму [яка може обернути команду], щоб підвищити права звичайного користувача виконувати це як root.

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