Как я могу позволить пользователю редактировать определенный системный файл, обычно ограниченный root?

8

Я пытаюсь написать /etc/network/interfacesс пользователем, который не имеет привилегий root.

Причиной желания писать в этом было бы разрешение пользователю устанавливать статический IP, так как я запускаю сервер только из командной строки. Какое разрешение мне нужно дать пользователю etc/sudoers?

Я не хочу, чтобы у пользователя были полные права root. Просто возможность редактировать этот файл.

Кит
источник

Ответы:

25

Вместо использования sudoпросто установите ACL для файла:

$ ls -l /var/tmp/foo
-rw-rw---- 1 root root 4 Jul 31 15:26 /var/tmp/foo
$ sudo setfacl -m u:white:rw /var/tmp/foo
$ whoami
white
$ cat /var/tmp/foo
bar

Теперь файл принадлежит пользователю root, но пользователь white может читать и писать в него. Пользователь «white» теперь может использовать свой любимый редактор для редактирования файла.

Джефф Уайт
источник
Немного смущен. Есть /var/tmp/foo= /etc/network/interfaces? Никогда не видел, что вы пытаетесь сказать, я довольно новичок в Linux.
Кит
Это просто файл. Вы можете использовать любой файл, который вы хотите.
Джефф Уайт
1
Ницца. Я думал, что списки ACL могут использоваться только для ограничения разрешений, а не для их предоставления - приятно знать, что это неправда!
Рмано
Похоже, не поддерживается в WSL:setfacl: /etc/logrotate.conf: Operation not supported
mpen
8

Подготовьте сценарий, который выполняет требуемое редактирование, например сценарий, который пишет правильный файл со статическим IP-адресом (что включить в этот сценарий выходит за рамки этих вопросов и ответов). Давайте назовем этот скрипт /root/set_static_ip. (1)

Edit /etc/sudoers(2) ( visudoлучше, он проверяет работоспособность, очень трудно восстановить систему с недопустимым файлом sudoers, даже невозможно из удаленного (3)), и добавить

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Теперь этот пользователь может использовать sudo /root/set_static_ip без запроса пароля, и скрипт будет работать со всеми привилегиями; никакая другая команда не будет разрешена.

Если вы хотите, чтобы пользователь просто заменил файл тем, что он хочет, сценарий может быть просто (вызвать его /root/unsafe-overwrite-interface)

#! /bin/bash -e
#
cp /tmp/temp-iface.txt /etc/network/interfaces 
exit 0

... и вы говорите пользователю отредактировать, /tmp/temp-iface.txtа затем запустить sudo /root/unsafe-overwrite-interface--- включив его в sudoers, как указано выше. Или вы можете добавить пользователя в список ACL и дать ему разрешение на запись в конкретный файл .

Но обратите внимание, что если вы не проверяете содержимое файла на предмет безопасности, может произойти хаос , преднамеренный или непреднамеренный.


Сноски :

(1) этот сценарий должен быть максимально безопасным. Проверьте входы и так далее. Он будет выполнен с полными разрешениями.

(2) в современной установке sudo, вы можете добавить файл в /etc/sudoers.d/каталог, который лучше --- переживет обновления.

(3) Я обычно держу терминал с открытым сеансом root ( sudo -i), когда я изменяю механизм sudoers, и резервное копирование удобно.

Rmano
источник
Единственная проблема заключается в том, что настройки статического IP-адреса должны быть изменены по требованию. Мое понимание сценария, который вы рекомендуете, будет в основном переписывать /etc/network/interfacesфайл, каким бы он ни был /root/set_static_ip. Если вы не можете создать сценарий, который запрашивает у пользователя ввод IP-адреса, шлюза и т. Д. Я не достаточно хорош для этого.
Кит
Вы можете написать скрипт, который принимает параметры ... но да, это самый безопасный способ. Если вы позволите пользователю редактировать файл вслепую, что произойдет, если они допустят ошибку? Вы можете иметь свой сервер вне досягаемости ... поэтому скрипт должен не только каким-то образом запрашивать параметры, но и проверять, безопасны ли они.
Рмано
3
Что касается /etc/sudoers, это visudoне так sudoedit.
saiarcot895
Если кто-то задает такой вопрос, возможно, он не в силах написать безопасный сценарий bash. Есть причина, по которой вы не можете установить root в bash-скрипте.
rox0r