Dlaczego danie sudo vimowi dostępu do zwykłych użytkowników jest ryzykowne?

30

Chciałbym utworzyć nowego użytkownika i dać mu dostęp do sudo. Mówiąc konkretnie, chcę, aby używał sudo vimi edytował httpd.conf. Napisałem to w sudoers:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Słyszałem jednak, że może to być ryzykowne. Dlaczego to jest problematyczne? Jak poważny jest problem?

mi0pu
źródło
16
Po pierwsze, twoje polecenie zapewni użytkownikowi dostęp do odczytu i zapisu do wszystkich plików na komputerze. Po wejściu vimużytkownik może swobodnie otwierać i zapisywać w dowolnym pliku, który mu odpowiada.
John1024
4
Poza tym możesz utworzyć nową grupę, aby dodać każdego użytkownika potrzebującego dostępu /etc/httpd/confs/httpd.conf. Następnie użyj, chgrp [OPTION] GROUPNAME FILEaby zmienić własność grupy /etc/httpd/confs/httpd.conf. Coś jak groupadd vimportantutworzyć nową grupę i chgrp -v vimportant /etc/httpd/confs/httpd.confzmienić jej własność. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin
4
Zauważ, że ze względu na wszystkie problemy wymienione w odpowiedziach sudo umożliwia użytkownikom edycję plików za pomocą edytora działającego z ich własnymi uprawnieniami. Poszukaj „Bezpiecznej edycji” na sudoersstronie podręcznika .
Michał Politowski
2
(Nie jestem pewien, czy to, co mówię, jest prawidłowe) Ponieważ dajesz sudodostęp do vima, użytkownik będzie mógł używać vima jako roota. W vim można uruchomić polecenia UNIX ( Jak uruchomić polecenia Unix od wewnątrz vim? ), Więc użytkownik będzie w stanie zrobić coś takiego useradd <myuser>, rm -rf /lub wiele innych rzeczy.
fedorqui
6
To pytanie jest niewłaściwe. Rozważając przyznanie jakichkolwiek podwyższonych przywilejów, nie chcesz myśleć: „Zrobię to, chyba że wymyślę jakiś powód, dla którego jest to niebezpieczne”. Chcesz pomyśleć: „Nie zrobię tego, chyba że udowodnię sobie, że jest to bezpieczne”.
Nate Eldredge

Odpowiedzi:

60

Mimo że ograniczasz argumenty wiersza poleceń, nic nie stoi na przeszkodzie, aby użytkownik używał vima do otwierania, edytowania i nadpisywania dowolnego pliku losowego po uruchomieniu go jako root.

Użytkownik może uruchomić, sudo vim /etc/httpd/conf/httpd.conf a następnie

  • usuń cały ten tekst z bufora edycji
  • następnie dla wygody źródła istniejący plik (choć nie jest to nawet wymagane): na przykład konfiguracja sudo
    :r /etc/sudoers UWAGA: O ile nie jest to ograniczone przez SELinux, użytkownik może odczytać dowolny plik w ten sposób!
  • przyznać sobie więcej przywilejów sudo user ALL=(ALL) NOPASSWD: ALL
  • zastąp starą konfigurację :w /etc/sudoers

Mogę sobie wyobrazić dziesiątki podobnych sposobów, w jakie użytkownik może uzyskać dostęp, zmodyfikować lub zniszczyć system.

Nie będziesz nawet mieć ścieżki audytu, które pliki zostały zmienione w ten sposób, ponieważ zobaczysz tylko, jak edytuje konfigurację Apache w komunikatach dziennika sudo. Jest to ryzyko bezpieczeństwa związane z przyznawaniem sudouprawnień dowolnemu edytorowi.

Jest to mniej więcej ten sam powód, dla którego przyznanie uprawnień na poziomie roota sudo do poleceń takich jak tari unzipczęsto jest niepewne, nic nie stoi na przeszkodzie, aby zamienić zamienniki plików binarnych systemu lub plików konfiguracji systemu w archiwum.


Drugie ryzyko, jak zauważyło wielu komentatorów, polega na tym, że vimpozwala na ucieczkę powłoki , w której można uruchomić podpowłokę z poziomu vima, która pozwala wykonać dowolne dowolne polecenie . Z poziomu sesji sudo vim będą one uruchamiane jako root, na przykład ucieczka powłoki:

  • :!/bin/bash da ci interaktywną powłokę roota
  • :!/bin/rm -rf / zrobi dobre historie w pubie.

Co zamiast tego zrobić?

Nadal możesz używać, sudoaby umożliwić użytkownikom edycję plików, których nie są właścicielami, w bezpieczny sposób.

W konfiguracji sudoers możesz ustawić specjalne zarezerwowane polecenie, sudoedita następnie pełną (ścieżkę) nazwę pliku (plików), które użytkownik może edytować:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

Użytkownik może następnie użyć -eprzełącznika w wierszu polecenia sudo lub użyć sudoeditpolecenia:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Jak wyjaśniono na stronie podręcznika :

Ta -e (edit)opcja wskazuje, że zamiast uruchomić polecenie, użytkownik chce edytować jeden lub więcej plików. Zamiast polecenia ciąg „sudoedit” jest używany podczas sprawdzania polityki bezpieczeństwa.
Jeśli użytkownik jest autoryzowany przez zasady, podejmowane są następujące kroki:

  • Tworzone są tymczasowe kopie plików, które mają być edytowane z ustawieniem właściciela dla wywołującego użytkownika.
  • Edytor określony przez zasadę jest uruchamiany w celu edycji plików tymczasowych. Zasady sudoers używają zmiennych środowiskowych SUDO_EDITOR, VISUAL i EDITOR (w tej kolejności). Jeśli nie ustawiono żadnego z SUDO_EDITOR, VISUAL lub EDITOR, sudoersużywany jest pierwszy program wymieniony w opcji edytora (5).
  • Jeśli zostały zmodyfikowane, pliki tymczasowe są kopiowane z powrotem do oryginalnej lokalizacji, a wersje tymczasowe są usuwane.
    Jeśli określony plik nie istnieje, zostanie utworzony.
    Zauważ, że w przeciwieństwie do większości poleceń uruchamianych przez sudo, edytor jest uruchamiany w niezmodyfikowanym środowisku wywołującego użytkownika. Jeśli z jakiegoś powodu sudo nie może zaktualizować pliku w edytowanej wersji, użytkownik otrzyma ostrzeżenie, a edytowana kopia pozostanie w pliku tymczasowym.

sudoersInstrukcja zawiera również całą sekcję jaki może zaoferować ograniczoną ochronę przed ucieczek powłoki z RESRICTi NOEXECopcji.

restrict Unikaj udzielania użytkownikom dostępu do poleceń, które pozwalają użytkownikowi na uruchamianie dowolnych poleceń. Wiele edytorów ma tryb ograniczony, w którym wyłączane są zmiany znaczenia powłoki, jednak sudoedit jest lepszym rozwiązaniem do uruchamiania edytorów przez sudo. Z powodu dużej liczby programów, które oferują ucieczki powłoki, ograniczanie użytkowników do zestawu programów, które tego nie robią, jest często niewykonalne.

i

noexec
Wiele systemów obsługujących biblioteki współdzielone ma możliwość przesłonięcia domyślnych funkcji bibliotecznych poprzez wskazanie zmiennej środowiskowej (zwykle LD_PRELOAD) na alternatywną bibliotekę współdzieloną. W takich systemach można użyć funkcji noexec sudo, aby uniemożliwić uruchamianie programu przez sudo z innych programów. Uwaga: ... ...
Aby włączyć noexec dla polecenia, użyj NOEXECznacznika zgodnie z dokumentacją w sekcji Specyfikacja użytkownika powyżej. Oto przykład, że znowu:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
To pozwala użytkownikowi Aaron uruchomić /usr/bin/morei /usr/bin/vize noexec włączona. Zapobiegnie to wykonywaniu przez te dwa polecenia innych poleceń (takich jak powłoka).

HBruijn
źródło
Nie wiedziałem o tym, sudo tara sudo unziptakże powodowałem problemy. Dziękuję Ci.
mi0pu
5
Niezła odpowiedź. Byłoby jeszcze lepiej, gdyby wspominał także o ucieczce z vima do powłoki. Gdy znajdziesz się w powłoce, jest ona bezpłatna dla wszystkich, a nadal wszystko, co pojawi się w dziennikach, to to, że użytkownik edytuje plik konfiguracyjny Apache.
CVn
2
Dodatkowo? Jeśli używasz vima, możesz zrobić coś okropnego, na przykład :!rm -rf /, ups!
Wayne Werner
1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcI bum. Dostęp root do tar jest podatnością.
Qix
1
@ MichaelKjörling to była odpowiedź, której się spodziewałem :sh, a następnie boom, root shell
Creek
5

Ta konfiguracja pozwala temu użytkownikowi edytować ten plik. W tym celu uruchamia vimedytor z uprawnieniami root.

Po uruchomieniu vimpolecenia użytkownik może robić, co chce, za pomocą tego edytora. - Może otworzyć inny plik lub nawet uruchomić powłokę z vima.

Dlatego użytkownik może teraz wyświetlać i edytować dowolne pliki oraz uruchamiać dowolne polecenia w systemie.

michas
źródło
Co rozumiesz przez „Ta konfiguracja pozwala wszystkim użytkownikom edytować ten plik”? Czy „użytkownik” ma specjalne znaczenie?
mi0pu
Ups, nie zwracałem uwagi. naprawiono odpowiedź.
michas
5

Zamki bezpieczeństwa

Niektóre programy, takie jak na przykład less, vi, vimi morepozwalają, aby inne programy uruchamiane z wiersza polecenia, co jest znane jako powłoki Shell ucieczki lub ucieczki do interpretera poleceń. W takich przypadkach możesz użyć, NOEXECaby uniemożliwić niektórym programom wykonywanie uprawnień innych programów. Przykład:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Pozwoliłoby to użytkownikowi na edycję lub uprzywilejowanie widoku dowolnego pliku w systemie z uruchomionym vimem i więcej, ale wyłącza możliwość uruchamiania innych programów z uprawnieniami z interpretera poleceń esc vim.

Co ważne, sudozawiera kilka blokad bezpieczeństwa (domyślnie), które mogą zapobiegać niebezpiecznym zadaniom, takim jak przekierowanie standardowego wyjścia wykonania programu ( STDOUT) do plików poza katalogiem osobistym użytkownika.

Jeśli zdefiniowano w pliku, /etc/sudoersże użytkownik może uruchamiać z uprawnieniami /usr/bin/vim, tj. Coś takiego:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudopozwala zdefiniowanemu zwykłemu użytkownikowi działać /usr/bin/vimna następujące sposoby:

sudo /usr/bin/vim
sudo vim

Ale należy uniemożliwić uruchomienie vima w następujący sposób:

cd /usr/bin
sudo ./vim
Pawan Kumar
źródło
2
Czy to ma być odpowiedź, czy błąd wycinania i wklejania?
jasonwryan
1
Większość tego nie jest związana z pytaniem.
Hauke ​​Laging
4

Prosta odpowiedź:

Oto polecenie Vima:

:shell

Mają teraz powłokę root.

Dzika karta
źródło
1

Jednym z możliwych stopniowych ulepszeń bezpieczeństwa byłoby zastąpienie:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

z

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

a następnie niech sudo rvim /etc/httpd/confs/httpd.confzamiast tego uruchomi użytkownika .

Vim obsługuje tryb ograniczony wyzwalany opcją -Z wiersza poleceń lub uruchamiając program jako rvim. Po włączeniu trybu ograniczonego „wszystkie polecenia korzystające z zewnętrznej powłoki są wyłączone”. Takie podejście nie uniemożliwiłoby użytkownikowi użycia :split filepolecenia ex do otwarcia innych plików, ale przynajmniej zapobiegałoby celowo złośliwym poleceniom powłoki, takim jak :!rm -rf /.

Johann
źródło
1
Niestety jest to również w 100% niepewne. Jeśli użytkownik zdoła edytować plik / etc / sudoers, aby stać się wszechmocny w systemie, może uruchomić dowolne polecenie jako root.
vurp0
0

Zgadzam się z odpowiedzią HBruijna, że uruchamianie vima jako root naprawdę otwiera system bardzo szeroko, a sudoedit byłoby bezpieczniejszym rozwiązaniem.

Ale nawet wtedy twój system prawdopodobnie nadal byłby raczej otwarty. Przynajmniej zakładając, że w oparciu o tę konfigurację zostanie uruchomiony proces apache z uprawnieniami roota. Istnieje milion sposobów na skonfigurowanie apache w taki sposób, aby uruchamiał programy zewnętrzne. Jako jeden przykład rozważ argument potoku zgodny z dyrektywą CustomLog . Podręcznik wyraźnie stwierdza:

Bezpieczeństwo:

Jeśli używany jest program, zostanie on uruchomiony jako użytkownik, który uruchomił program httpd. Będzie to root, jeśli serwer został uruchomiony przez root; upewnij się, że program jest bezpieczny.

Oczywiście, jeśli Twoi użytkownicy mogą napisać konfigurację, mogą zmienić ten program na cokolwiek im się podoba, np. Coś, co uruchamia skrypt powłoki, aby udzielić im dalszych uprawnień.

Z tego powodu niedawno zhakowałem razem sposób korzystania z funkcji w taki sposób, że apache może zyskać specjalną zdolność do łączenia się z uprzywilejowanym portem, nawet jeśli jest on wykonywany jako zwykły użytkownik. W ten sposób użytkownicy mogą edytować konfigurację, a nawet uruchomić serwer, i nadal są w większości bezpieczne. Jedynym problemem jest to, że mogą powiązać dowolny proces na dowolnym adresie IP. Pozostaje pewien stopień zaufania, ponieważ mogą znaleźć sposób na awarię sshd systemu, a następnie uruchomić własną wersję, próbując uzyskać hasło roota.

MvG
źródło
0

Należy zauważyć, że nawet a sudoedit {.../whatever.conf}może stanowić zagrożenie bezpieczeństwa.

Utwórz skrypt powłoki /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

i wywołaj ten skrypt w pliku konfiguracyjnym. Znam kilka przykładów, w których to podejście działa:

samba -> polecenie tokena log nt

log nt token command = /tmp/make_me_root.sh

syslog-ng -> program: Wysyłanie wiadomości do aplikacji zewnętrznych

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Zakładam, że można rozszerzyć tę listę w nieskończoność.

Wszystko, co musisz zrobić, to zrestartować usługę. Oczywiście po rootowaniu przywrócisz takie linie konfiguracji, aby zatrzeć ślady.

Wernfried Domscheit
źródło
0

Oczywiście wcale nie jest bezpieczniej. Jak powiedziałem wcześniej sudoedit, jest to najłatwiejszy i najbardziej odpowiedni sposób na zrobienie tego.

Chcę dodać, że vim pozwala na uruchomienie powłoki, więc nie tylko może edytować dowolny plik systemowy, ale także umożliwia uruchamianie powłoki i robienie tam, gdzie chce.

Po prostu spróbuj uruchomić vima i wpisz: sh

Lauskin
źródło