Назад | Перейти на главную страницу

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

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

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

sudo rndc reload

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

Если я правильно понимаю ваши комментарии, проблема здесь в том, что команда будет выдана через соединение, которое не имеет возможности ввести пароль, который 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 находится в /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).

Хотя это не общее решение в конкретном случае rndc тебе не нужно sudo вообще.

rndc может общаться с любым named процесс либо через локальный сокет, либо через удаленный порт, используя секретный ключ для аутентификации. По умолчанию (или, по крайней мере, для debian, дистрибутива, который я использую) этот файл можно найти в /etc/bind/rndc.key и обычно доступен для чтения только пользователю bind и группа bind.

Любой, у кого есть доступ для чтения к этому ключевому файлу (или его идентичной копии), может использовать rndc для управления сервером BIND, поэтому самым простым решением в этом конкретном случае было бы добавить пользователя в bind группа.

Удивительное количество обычных демонов имеют нечто подобное (лично я все еще выясняю возможности powerdns в этом отношении, но пока это выглядит многообещающим). Если ты не хочешь делать sudo вам нужно будет в каждом конкретном случае проверять, возможно ли то, чего вы хотите достичь.

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