Jak mogę zezwolić użytkownikowi na edycję konkretnego pliku systemowego normalnie ograniczonego do roota?

8

Próbuję pisać /etc/network/interfacesz użytkownikiem, który nie ma uprawnień roota.

Powodem, dla którego chciałbym do tego pisać, było umożliwienie użytkownikowi ustawienia statycznego adresu IP, ponieważ uruchamiam serwer tylko z linii poleceń. Jakie pozwolenie muszę dać użytkownikowi etc/sudoers?

Nie chcę, aby użytkownik miał pełne uprawnienia root. Tylko możliwość edycji tego pliku.

Keith
źródło

Odpowiedzi:

25

Zamiast używać sudo, po prostu ustaw ACL dla pliku:

$ 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

Teraz plik należy do „root”, ale użytkownik „white” może go czytać i zapisywać. Użytkownik „biały” może teraz używać swojego ulubionego edytora do edycji pliku.

Jeff White
źródło
Trochę zdezorientowany. Czy /var/tmp/foo= /etc/network/interfaces? Nigdy tak naprawdę nie widziałem tego, co próbujesz powiedzieć, jestem całkiem nowy w Linuksie.
Keith
To tylko plik. Możesz użyć dowolnego pliku.
Jeff White
1
Miły. Myślałem, że list ACL można używać tylko do ograniczania uprawnień i ich nie przyznawania - miło wiedzieć, że to nieprawda!
Rmano
Nie wydaje się być wspierane w ramach WSL:setfacl: /etc/logrotate.conf: Operation not supported
MPpl
8

Przygotuj skrypt, który chcesz edytować, na przykład skrypt, który zapisuje poprawny plik ze statycznym adresem IP (co należy umieścić w tym skrypcie jest poza zakresem tego pytania i odpowiedzi). Nazwijmy ten skrypt /root/set_static_ip. (1)

Edytuj /etc/sudoers(2) (z visudolepszym, sprawdza zdrowie psychiczne, bardzo trudno jest odzyskać system z nieprawidłowym plikiem sudoers, nawet niemożliwym ze zdalnego (3)) i dodać

user_name_to_authorize ALL=NOPASSWD: /root/set_static_ip 

Teraz ten użytkownik może korzystać sudo /root/set_static_ip bez pytania o hasło, a skrypt będzie działał ze wszystkimi uprawnieniami; żadne inne polecenie nie będzie dozwolone.

Jeśli chcesz, aby użytkownik po prostu zastąpił plik tym, czego chce, skrypt może być po prostu (nazwij go /root/unsafe-overwrite-interface)

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

... a ty każesz użytkownikowi edytować, /tmp/temp-iface.txta następnie uruchomić sudo /root/unsafe-overwrite-interface--- włączając go w sudoersach, jak określono powyżej. Możesz też dodać użytkownika do listy ACL i dać mu uprawnienia do zapisu w określonym pliku .

Ale zauważ, że jeśli nie sprawdzisz zawartości pliku pod kątem bezpieczeństwa, nastąpi spustoszenie , celowe lub niezamierzone.


Przypisy :

(1) ten skrypt musi być możliwie bezpieczny. Sprawdź dane wejściowe i tak dalej. Zostanie wykonany z pełnymi uprawnieniami.

(2) w nowoczesnej instalacji sudo, możesz dodać plik do /etc/sudoers.d/katalogu, który jest lepszy --- przetrwa aktualizacje.

(3) Zwykle trzymam terminal z otwartą sesją roota ( sudo -i), kiedy modyfikuję mechanizm sudoers, i mam pod ręką zapasową kopię zapasową.

Rmano
źródło
Jedynym problemem jest to, że statyczne ustawienia IP muszą być zmieniane na żądanie. Moje zrozumienie skryptu, który polecasz, w zasadzie przepisałoby /etc/network/interfacesplik na dowolny format /root/set_static_ip. Chyba że możesz stworzyć skrypt, który prosi użytkownika o podanie adresu IP, bramy itp. To nie jest wystarczająco dobre.
Keith
Możesz napisać skrypt, który akceptuje parametry ... ale tak, jest to najbezpieczniejszy sposób. Jeśli pozwolisz użytkownikowi edytować plik na ślepo, co się stanie, jeśli popełni błąd? Możesz mieć swój serwer poza zasięgiem ... więc skrypt musi nie tylko w jakiś sposób pytać o parametry, ale sprawdzać, czy są bezpieczne.
Rmano
3
Jeśli chodzi o /etc/sudoersto, to visudonie sudoedit.
saiarcot895
Jeśli ktoś zadaje takie pytanie, prawdopodobnie nie jest w stanie napisać bezpiecznego skryptu bash. Istnieje powód, dla którego nie można skonfigurować roota skryptu bash.
rox0r