Jak ograniczyć uruchamianie poleceń w określonym katalogu za pośrednictwem SUDOERS?

13

Mogę skonfigurować sudo (za pomocą pliku sudoers), aby umożliwić użytkownikowi uruchamianie poleceń chowni chmodw dowolnym pliku lub katalogu w systemie. Chcę jednak przyznać użytkownikowi uprawnienia tylko do uruchamiania tych poleceń na plikach znajdujących się w /var/www/htmlkatalogu.

Jak mogę ograniczyć uprzywilejowane polecenia, aby użytkownik mógł je uruchamiać tylko we wcześniej określonym katalogu?

Na przykład: Poniższe polecenie przyznaje 777 uprawnień do index.htmlpliku.

sudo chmod 777 /var/www/html/index.html

Teraz chcę wykonać dwie akcje

  1. Ograniczyć sudotakie, że użytkownik może uruchomić tylko chmodi chownod wewnątrz/var/www/html

  2. Nie zezwalaj użytkownikowi na wykonywanie tych poleceń w innym miejscu w systemie (np. Poleceń nie można uruchomić w /var/wwwlub /var/ftp)

Prashant B.
źródło
1
Proszę nie krzyżować - superuser.com/questions/456662/…
Ulrich Dangel
7
Czy to naprawdę właściwa droga? Co powiesz na www-datagrupę eliminującą potrzebę chmod/ chownczegokolwiek?
sr_
Chłodny. W ten sposób rootowanie jest bardzo łatwe. Rozdawanie jest bardzo złym pomysłem chown. Poza tym nie widzę powodu, dla którego miałby chmodbyć uruchamiany jako root.
Nils,

Odpowiedzi:

13

To, o co pytasz, jest trudne, jeśli nie niemożliwe. Nawet jeśli nie ogranicza stosowania chowni chmoddo plików w katalogu specyficznym, ktoś może jeszcze przejść link symboliczny a więc wpływać pliki gdziekolwiek chcą.

Na szczęście wysoce prawdopodobne jest, że to, co próbujesz zrobić, nie jest właściwym rozwiązaniem twojego rzeczywistego problemu, i działa inna metoda.

Zwykle użytkownicy, którzy potrzebują dodatkowych uprawnień do tworzenia i modyfikowania plików, /var/wwwsą dodawani do grupy (często www-datalub możesz mieć różne grupy dla różnych części witryny). Możesz użyć własności grupy i katalogów setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlpozwala wszystkim członkom www-datagrupy pisać do /var/www/htmlkatalogu, a pliki utworzone w tym katalogu będą własnością www-datagrupy, a nie podstawowej grupy użytkownika, który utworzył plik. Nie jest to jednak zbyt elastyczne.

To, co prawdopodobnie powinieneś zrobić, to skonfigurować listy kontroli dostępu do plików w obszarze /var/www. Najpierw upewnij się, że listy ACL są włączone: włączony system plików /var/wwwmusi być podłączony z aclopcją. Aby uzyskać pomoc, zobacz Udostępnij wszystkie nowe pliki w katalogu grupie . Zainstaluj także narzędzia ACL ( getfacli setfacl). Następnie daj dodatkowe uprawnienia do drzewa poniżej /var/www/htmlużytkownikom, którzy powinni je mieć. Możesz ustawić listy ACL dla poszczególnych użytkowników, ale często łatwiej jest umieścić w grupie użytkowników, którzy powinni mieć takie same uprawnienia do części systemu plików, i ustawić listy ACL dla tej grupy. Na przykład, jeśli użytkownicy w grupie html-writerspowinni mieć dostęp do odczytu i zapisu do drzewa pod /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles „SO- przestań być zły”
źródło
Jeśli chodzi o „nie jest to zbyt elastyczne” (na końcu ust. 3) - dlaczego tak nie jest? Czy to dlatego, że ludzie muszą należeć do określonej grupy? (Nie wiem prawie nic o uprawnieniach, ACL i powiązanych sprawach.)
KajMagnus
3
@KajMagnus Jest nieelastyczny, ponieważ root musi zarządzać grupami, a pliki mogą należeć tylko do jednej grupy. ACL pozwala każdemu użytkownikowi wybrać, kto może uzyskać dostęp do plików, których są właścicielami, a wielu użytkowników i grup można wymienić w liście ACL.
Gilles „SO- przestań być zły”
2

Możesz ograniczyć polecenie do użycia przez „myuser” wszystkimi argumentami w /etc/sudoerspliku za pomocą polecenia visudoadd:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

włącz rejestrowanie dla każdej operacji, dodając:

Defaults logfile=/var/log/sudo.log

próbka wyjściowa:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Kiedy używasz sudo, założenie powinno być takie, że „mój użytkownik” jest osobą zaufaną. Uważaj na uprawnienia do plików, nie ma prostego sposobu na powstrzymanie złośliwego użytkownika sudo od połączenia pliku z zasobu zewnętrznego i zmiany go.

tombolinux
źródło
Próbowałem już wcześniej, ale dał błąd, ponieważ: Niestety, użytkownik prashant nie może wykonywać „/ bin / chmod 777 / var / www / html / a” jako root na prashant.xyz.com.
PrashantB
czy zmieniłeś użytkownika za pomocą su - prashantlub su prashant?
tombolinux
Tak, wykonuję polecenie użytkownika prashant. Czytam fora, mówią, że polecenia działają w całym systemie. Nikt nie napisał o takim problemie.
PrashantB
Prowadzę to whooo :). Ale to będzie polecenie statyczne. Czy możemy uczynić to ogólnym, aby móc zastosować dowolne pozwolenie na dowolny plik w katalogu / var / www / html?
PrashantB
3
Jest to całkowicie niepewne: sudo /bin/chmod 666 /var/www/html/../../../etc/passwda jeśli jakoś to naprawicie,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles „SO- przestańcie być źli”
1

W rzeczywistości istnieje dość prosty sposób, aby to zrobić, tworząc skrypt Bash (lub wybraną powłokę), aby ograniczyć modyfikacje wprowadzone do określonego pliku lub katalogu.

W twoim przykładzie wyglądałoby to tak:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Następnie zmieniłbyś plik sudoers, aby umożliwić www-data wykonanie / usr / local / bin / mychmod.

Pamiętaj jednak, że zezwalanie użytkownikom na wprowadzanie danych (na przykład zezwalanie użytkownikowi na zmianę pliku lub katalogu chmodded) w to miejsce jest niezwykle niebezpieczne i musisz wiedzieć, jak odfiltrować ataki wstrzykiwające, jeśli chcesz zrobić coś takiego że. Osoba atakująca może z łatwością wykonać dowolne polecenie jako root w ten sposób, skutecznie zagrażając bezpieczeństwu twojego systemu.

Ernie
źródło
jest to wyjątkowo niebezpieczne i naprawdę nie rozwiązuje rozwiązania ...
SomeGuy