Предоставление доступа к набору команд пользователю без полномочий root без sudo


13

Я хочу предоставить не-sudo доступ пользователю без полномочий root на моем компьютере, есть пользователь dns-manager, его единственная роль - запускать все команды BIND (rndc, dnssec-keygen) и т. Д.

Теперь каждый раз, когда он должен выполнить команду, он печатает,

sudo rndc reload

Есть ли способ, которым я могу избавиться от этого sudo, но только по определенному набору команд (и только для dns-manager)?


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

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

3
sudoТогда как насчет пароля ? Или пароль sudo для запуска инструмента управления DNS , который может при необходимости работать с namedпривилегиями группы или пользователя, либо с привилегиями root.
MadHatter

4
@peterh "хорошая причина сделать это таким образом" будет отсутствующим битом. Обычно подобные вопросы оказываются скрытыми проблемами XY , и я считаю, что понимание основной проблемы является ключом к полному и профессиональному ответу на них.
MadHatter

2
@peterh Думаю, мы согласны друг с другом. Я тоже хочу, чтобы ОП улучшил его вопрос; углубление в это хорошо работает для меня как способ помочь автору мыслить вне рамок, которые он построил вокруг себя. У него вполне могут быть веские причины для того, чтобы избежать этого sudo. Пытаясь выразить это нам, он может или прояснить наше замешательство, или свое собственное - или оба!
MadHatter

Ответы:


31

Если я правильно понимаю ваши комментарии, проблема заключается в том, что команда будет отправлена ​​через соединение, которое не имеет возможности ввести пароль, который по умолчанию запрашивает sudo. Кроме того, во многих дистрибутивах ОС sudo по умолчанию требует TTY, чего может не быть в этой программе.

Однако sudo может иметь очень детализированную структуру разрешений, позволяющую одному или нескольким пользователям выполнять одну конкретную команду без пароля и TTY. Ниже я покажу три способа настроить это для ваших нужд. Какой бы вы ни выбрали, пользователь теперь сможет sudo rndc reloadвводить команду без необходимости ввода пароля.

(Кроме того, это может быть ненужным, но ... пожалуйста, не забудьте сделать резервную копию файла sudoers перед его редактированием, чтобы сохранить оболочку, в которой вы являетесь пользователем root, на случай, если вам потребуется вернуться к резервной копии, и отредактировать он использует visudoвместо sudo vi /etc/sudoers. Надеюсь, эти меры предосторожности будут ненужными, но ... лучше иметь их, а не нуждаться в них, чем наоборот!)

1. Если вы не хотите требовать TTY для каких-либо запросов

Самый простой способ избавиться от требований TTY (если он существует) - убедиться, что строка, начинающаяся с Defaultsin /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в большинстве систем. Вы можете узнать его синтаксис, используя Google или man sudoкоманду.

Вы не должны редактировать этот файл напрямую; это может привести к условиям гонки безопасности. Вместо этого используйте visudoкоманду (которая является оберткой вокруг вашего$EDITOR переменной среды).


После настройки sudo вы можете легко обернуть это вокруг видимых команд. Это очень просто:

  1. Создайте каталог для списка ваших сценариев оболочки sudo (например /usr/local/dnsadmin/bin)
  2. Создайте скрипт-обертку для команд, которые вы хотите, чтобы они могли использоваться без sudo. Это будет очень простая команда, например, /usr/local/dnsadmin/bin/rndcбудет:

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

  3. Получить этот каталог в их PATHпеременную среды (например, общесистемной или локальной .profile).


Из любопытства - зачем использовать execсценарий оболочки вместо простого непосредственного вызова команды? (Я не говорю, что это неправильно, я просто хотел бы знать, почему вы это делаете, чтобы я мог чему-то научиться)
Дженни Д

2
Я покончил с паролем sudo, идея сценариев-обёрток великолепна.
Anss

2
@JennyD :-) Из-за стабильности и производительности. В случае exec, вызываемая команда будет подставлена ​​вместо оболочки. Снаряд уйдет. Без exec оболочка запустит эту команду, затем дождется ее завершения и затем завершится. Этот второй, exec-less означает несколько взаимодействующих процессов, которые не нужны. Но нет большой разницы, без exec эта работа так же хорошо, как и с этим.
Петер - Восстановить Монику

@JennyD Моя просьба :-)
Петер - Восстановить Монику

@ Снеговик Спасибо большое за лекции! Это очень большая честь.
Петер - Восстановить Монику

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.