Mam bardzo wrażliwą konfigurację sieci i naprawdę nie chcę z tym popsuć. Moja sieć składa się z grupy użytkowników posiadających uprawnienia sudo.
Chcę zatrzymać ich przed uruchomieniem
service NetworkManager restart
service network restart
polecenia.
Czy jest jakiś sposób, aby to osiągnąć?
networking
inetwork-manager
? Ponadto, dlaczego Twoi użytkownicy mająsudo
dostęp? Nie powinny, chyba że chcesz, aby mieli pełne uprawnienia root.Odpowiedzi:
Korzystanie z CmndAlias
ALL
nigdy nie będzie bezpieczneIstnieje 1000 sposobów na uruchomienie
service network restart
bez robieniasudo service network restart
. Oto przykład tego, co niegrzeczny użytkownik może spróbować:Jeśli podasz użytkownikom
ALL
alias polecenia, a następnie spróbujesz utworzyć czarną listę, zawsze będą w stanie ją obejść. Czarna lista bash, a oni będą używać Pythona. Python z czarnej listy, a oni użyją Perla. Perl z czarnej listy, a oni będą używać PHP. Nikt tego nie chce!Jeśli naprawdę nie chcesz, aby ktoś coś zrobił, powinieneś zrobić, jak mówi Thomas, i utworzyć białą listę rzeczy, które mogą robić.
Konfigurowanie białej listy z wyjątkiem
Przykład małej białej listy z wykluczeniem można znaleźć u dołu
man sudoers
:(W rzeczywistości ten przykład ze strony podręcznika jest niebezpieczny i można go wykorzystać do zmiany hasła roota! Zobacz komentarze poniżej).
Możemy starać się przystosować, że w Twoim przypadku, aby oferować wszystkie
service
polecenia do grupy pracowników, ale wyklucza teservice network
polecenia, które dotyczą Ciebie:(Ta
ALL
pozycja odnosi się do Host_Alias, a nie do Cmnd_Alias - mylące, prawda?)Użytkownik nie będzie mógł uruchomić
sudo bash
lubsudo tee
lubsudo wget
lubsudo /path/to/malicious_script
. Jeśli zachowasz ostrożność, możesz dodać do białej listy więcej poleceń administratora dla swoich użytkowników. Po prostu bądź konkretny!Uwaga: dodałem
*
przed słowemnetwork
powyżej, na wypadek, gdybyservice
w przyszłości do narzędzia dodano niegroźną flagę . Wyobraźmy sobie, że--verbose
flaga zostanie dodana w przyszłości, a następnie użytkownicy będą mogli uruchomić następujące funkcje:Musimy więc
*
użyć flag przed nazwą usługi. Jedyną wadą jest to, że może to blokować inne usługi, które nie mają nic przeciwko działającym użytkownikom, np. Usługa o nazwiesafe-network
lubnetwork-monitor
też zostanie odrzucona.Pozwól użytkownikom edytować plik przy użyciu uprawnień grupy
Poniżej można znaleźć różne próby użycia
rnano
za pomocą,sudo
aby umożliwić użytkownikom edycję pliku lub plików. Ale tak naprawdę są bardziej złożone i bardziej niebezpieczne niż powinny.Dużo prostszym i bezpieczniejszym rozwiązaniem jest zmiana uprawnień grupy do określonych plików, dla których chcesz otworzyć uprawnienia do edycji. Oto kilka przykładów:
Jeśli potrzebujesz bardziej szczegółowej kontroli (na przykład: dostęp tylko dla 3 użytkowników, ale nie dla wszystkich pracowników), możesz utworzyć nową grupę za pomocą
addgroup
polecenia i dodać do niej tylko kilku użytkowników.Pozwól użytkownikom edytować plik
sudo
Pozostała część tej odpowiedzi stała się badaniem, jak łatwo jest pozostawić dziury w
sudo
konfiguracji, próbując zaoferować użytkownikom elastyczność. Nie polecam robienia żadnej z poniższych czynności!Jeśli chcesz przyznać użytkownikom dostęp do edycji określonego pliku, możesz spróbować użyć
rnano
:rnano
pozwoli im tylko edytować określony plik. Jest to ważne, aby uniemożliwić złośliwemu użytkownikowi edytowanie innej usługi upstart (na przykład/etc/init.d/urandom
) i dodawanie do niej wiersza, który byłby uruchomionyservice network restart
.Niestety nie znalazłem sposobu na
rvim
wystarczające ograniczenie (użytkownik może nadal otwierać dowolny plik za pomocą:e
), więc utknęliśmynano
.Niestety umożliwienie użytkownikom edycji wielu plików jest znacznie trudniejsze ...
Pozwól użytkownikom edytować wiele plików (znacznie trudniejsze niż powinno)
1. Niebezpieczne podejścia
Uważaj na symbole wieloznaczne! Jeśli oferujesz zbyt dużą elastyczność (lub dowolną), możesz ją wykorzystać:
W takim przypadku złośliwy użytkownik będzie mógł edytować dowolny inny skrypt usługi wstępnej, a następnie uruchomić go:
(Sudo faktycznie uniemożliwia
.
i..
rozwija polecenie, ale niestety nie argumenty.)Miałem nadzieję, że coś takiego może zadziałać, ale nadal nie jest pewne:
Ponieważ
sudo
obecnie oferuje tylko globalne wzorce, które*
będą pasować do wszystkiego - nie jest to wyrażenie regularne!(Edycja: I uznała, jeśli może uciec z powyższym w sytuacji, ponieważ nie istnieją żadne podfoldery znajdujące się pod
sites-available
. Zrobiliśmy popyt jeden char być dopasowane po folderze, a/..
. Nie uda po nazwie pliku Jednak nie jest to wykonalne rozwiązanie, ponieważrnano
akceptuje wiele argumentów. W każdym razie nadal byłoby to niebezpieczne w przypadku folderu zawierającego podfoldery!)Nawet jeśli nie mamy podfolderów i nie uwzględniamy żadnych wierszy zawierających
/../
, reguła oferująca*
glob może być nadal wykorzystywana, ponieważrnano
akceptuje wiele argumentów (<C-X>
przełączanie się między nimi , a przestrzeń jest chętnie akceptowana przez*
glob).2. Pchanie koperty (również ostatecznie niebezpieczne)
A co jeśli odrzucimy dowolne wiersze zawierające spacje lub spróbujemy dotrzeć
/..
? Wtedy ostatecznym wykonalnym rozwiązaniem może być:Przyjmujemy wszystko „pod” w folderze, ale także odrzucić wszelkie wywołanie
rnano
czy/..
lub/.
czysą przekazywane, lub jeśli folder jest kierowane bezpośrednio. (Technicznie
/.
wykluczenie sprawia, że/..
wykluczenie jest zbędne, ale pozostawiłem oba dla jasności).Znalazłem folder i
/.
wyjątki były potrzebne, ponieważ w przeciwnym razie użytkownik mógłby skierować folder na sam folder. Teraz możesz pomyśleć,rnano
że zablokuje się, jeśli wskażesz na folder, ale pomylisz się. W rzeczywistości moja wersja (2.2.6-1ubuntu1) uruchamia się z łagodnym ostrzeżeniem i pustym plikiem, a następnie<C-X>
prosi mnie o podanie nazwy pliku, w którym chcę zapisać, otwierając nowy wektor ataku! Cóż, przynajmniej odmówił zastąpienia istniejącego pliku (w jednym teście, który zrobiłem). W każdym razie, ponieważ nie ma sposobu na umieszczenie podfolderów na czarnej liście w sudo, musimy stwierdzić, że takie podejście jest znowu niebezpieczne. Przepraszamy użytkowników!To odkrycie sprawiło, że wątpię w dokładność
nano
trybu „ograniczonego”. Mówią, że łańcuch jest tak silny, jak jego najsłabsze ogniwo. Zaczynam odczuwać połączeniesudo
czarnej listy z czarną magią irnano
może nie być bardziej bezpieczny niż łańcuch stokrotek.3. Bezpieczne, ale ograniczone podejścia
Globy są bardzo ograniczone - nie pozwalają nam wielokrotnie dopasowywać klasy postaci. Państwo mogli zaoferować wiele edycje pliku, jeśli wszystkie nazwy plików mają taką samą długość (w tym przypadku
host
następuje jednej cyfry):Ale jeśli chcesz dać użytkownikowi dostęp do edycji różnych plików, konieczne może być jawne określenie każdego z nich:
Nie daj się skusić na użycie
*
w żadnym momencie. Dlaczego? Zobacz sekcje 1. i 2. powyżej! Pamiętaj: jeden mały poślizg może narazić na szwank całe konto administratora i cały system.4. Napisz własny moduł do sprawdzania argumentów (bezpieczeństwo jest teraz Twoim obowiązkiem)
Mam nadzieję, że dodadzą obsługę wyrażeń regularnych
sudo
w przyszłości; może poprawnie rozwiązać wiele problemów. Ale możemy również potrzebować możliwości sprawdzenia właściwości argumentów (aby zezwolić tylko na pliki, tylko foldery lub tylko niektóre flagi).Ale istnieje jedna alternatywa dla stworzenia elastyczności w sudo. Zwalać odpowiedzialność:
Następnie napisz własny
staffedit
skrypt lub plik wykonywalny, aby sprawdzić, czy argumenty przekazane przez użytkownika są zgodne z prawem, i zrealizuj ich żądanie tylko wtedy, gdy są.źródło
ALL=(ALL:ALL) ALL
brakuje mi semantyki, ale zawsze zakładałem, że gdzieś będzie miał przyzwoitą kontrolę argumentów ... Myliłem się. To naprawdę bardzo ograniczone. Nawet passwd wykluczenie korzeń oferowane w roboczogodziny stronie można podzielić za pomocą prostego wiersza poleceń argumentusudo passwd -q root
. Cóż, autorzy sudo wymieniają [kilka alternatyw] (sudo.ws/sudo/other.html) na swojej stronie internetowej. Mam nadzieję, że dodadzą obsługę wyrażeń regularnych w przyszłości.rnano
w opisie tutaj, ponieważ jest to wersja nano, której brakuje funkcji „zapisz jako”? Nie znam programu.$ man nano
a następnie/-R<Enter>
-q
musi przyjść później:sudo passwd root -q
. Przykład Pete'a można zahartować przez wykluczenie*root*
.sudoedit
aby bezpiecznie włączyć modyfikację pliku za pomocąsudo
.Najpierw otwórz plik sudoers za pomocą
sudo visudo
. Dodanieuser ALL=!/usr/sbin/service
will, IIRC, zabraniaservice
polecenia dla użytkownikauser
.Źródła: http://nixcraft.com/showthread.php/15132-Sudo-Exclude-Commands-And-Disable-sudo-su-Bash-Shell
źródło
Znalazłem rozwiązanie.
Otworzyłem terminal i zmieniłem się w użytkownika root, a
su -
następnie napisałem,visudo
aby edytować.potem na końcu napisałem wiersze jak
Następnie zapisałem i zamknąłem i ponownie uruchomiłem.
Teraz, jeśli piszę jako
service network restart
lubservice NetworkManager restart
wtedy to nie pozwala mi i daje błąd podobny doi podobnie
service network restart
również dla dowodzenia.źródło
sudo cp -p /etc/init.d/network /etc/init.d/network-not-in-sudo
I wtedysudo /etc/init.d/network-not-in-sudo restart
). Dlatego o wiele bezpieczniej jest tworzyć inkluzje zamiast wykluczeń w pliku sudoers, np. Określić, z którymi usługami mogą one wchodzić w interakcje.Prawdziwą odpowiedzią jest to, że tak naprawdę nie można temu zapobiec. Możesz zapobiec przypadkowemu uruchomieniu tej komendy przez złośliwych użytkowników metodami opisanymi w innych odpowiedziach, ale jeśli ktoś naprawdę chce ją uruchomić i znajduje się na liście sudoers, może ją uruchomić. Na przykład mogą wykonać następujące czynności:
joe@box:~$ sudo bash root@box:~# service network restart
Lub inne zabawne polecenie, którego mogliby użyć w celu obejścia twoich ograniczeń w pliku sudoers:
sudo visudo
Krótko mówiąc, jeśli potrafisz sudo i nie ogranicza się to do uruchamiania określonych poleceń, możesz robić prawie wszystko, co chcesz. Nawet jeśli ograniczysz je do danego zestawu poleceń, będziesz musiał upewnić się, że użytkownik nie będzie mógł skopiować innego polecenia, które chciałoby uruchomić pod tą samą nazwą, jak to, do którego miał uprawnienia ( na przykład poprzez zastąpienie polecenia, które mają uprawnienia do uruchomienia).
źródło
Użyj Firejail, aby ograniczyć użytkowników za pomocą piaskownicy.
https://github.com/netblue30/firejail/
Ustaw firejail jako powłokę zamiast bash w / etc / passwd, dla każdego użytkownika, którego chcesz ograniczyć. Jest bardzo łatwy w użyciu i ma dobrą dokumentację.
Przykład:
źródło