Як я можу дозволити користувачеві редагувати певний системний файл, зазвичай обмежений коренем?


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' може читати та записувати на нього. Користувач "білий" тепер може використовувати свій улюблений редактор для редагування файлу.


Трохи розгублений. Чи /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)

Правка /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---, включивши його в судери, як зазначено вище. Або ви можете додати користувача до списку ACL і дати їм дозвіл на запис у конкретний файл .

Але зауважте, що якщо ви не перевірите вміст файлу на безпеку, відбудеться хаос , навмисний чи ненавмисний.


Виноски :

(1) цей сценарій повинен бути максимально безпечним. Перевірте входи тощо. Він буде виконаний з повними дозволами.

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

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


Єдина проблема з цим полягає в тому, що статичні параметри IP потрібно змінювати на вимогу. Моє розуміння сценарію, який ви рекомендуєте, в основному переписав би /etc/network/interfacesфайл на все, що /root/set_static_ipє. Якщо ви не можете створити сценарій, який просить користувача ввести IP-адресу, шлюз тощо ... Це я недостатньо хороший для того, щоб зробити.
Кіт

Можна написати сценарій, який приймає параметри ... але так, це найбезпечніший спосіб. Якщо ви дозволите користувачеві наосліп редагувати файл, що трапиться, якщо він помилиться? Ви можете мати ваш сервер недоступним ... тому сценарію потрібно не лише запитувати параметри, але перевіряти, чи безпечні вони.
Рмано

3
Що стосується /etc/sudoers, це visudo, ні sudoedit.
saiarcot895

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