Wprowadzenie
Rozdzielenie przywilejów jest jednym z podstawowych paradygmatów bezpieczeństwa zaimplementowanych w Linuksie i systemach operacyjnych uniksopodobnych. Zwykli użytkownicy działają z ograniczonymi uprawnieniami w celu ograniczenia zakresu ich wpływu do własnego środowiska, a nie szerszego systemu operacyjnego.
Specjalny użytkownik, zwany rootem, ma uprawnienia superużytkownika. Jest to konto administracyjne bez ograniczeń, które są obecne dla zwykłych użytkowników. Użytkownicy mogą wykonywać polecenia z uprawnieniami superużytkownika lub roota na wiele różnych sposobów.
W tym artykule omówimy, jak poprawnie i bezpiecznie uzyskać uprawnienia roota, ze szczególnym uwzględnieniem edycji pliku /etc/sudoers
.
Postaramy się wykonać te kroki na serwerze Ubuntu 20.04, ale większość współczesnych dystrybucji Linuksa, takich jak Debian czy CentOS, powinna działać w podobny sposób.
W tym poradniku założymy, że masz już za sobą wstępną konfigurację serwera omówioną tutaj. Zaloguj się na swój serwer jako zwykły użytkownik niebędący rootem i kontynuuj poniżej.
Uwaga: Ten poradnik dogłębnie omawia eskalację przywilejów i plik sudoers
. Jeśli chcesz po prostu dodać sudo
uprawnienia do użytkownika, sprawdź nasze szybkie tutoriale How To Create a New Sudo-enabled User dla Ubuntu i CentOS.
How To Obtain Root Privileges
Istnieją trzy podstawowe sposoby uzyskania uprawnień roota, które różnią się poziomem zaawansowania.
Log In As Root
Najprostszą i najbardziej bezpośrednią metodą uzyskania uprawnień roota jest bezpośrednie zalogowanie się na serwer jako użytkownik root.
Jeśli logujesz się na lokalną maszynę (lub używasz funkcji konsoli out-of-band na serwerze wirtualnym), wpisz root
jako nazwę użytkownika na ekranie logowania i wpisz hasło roota, gdy zostaniesz o to poproszony.
Jeśli logujesz się przez SSH, podaj użytkownika root przed adresem IP lub nazwą domeny w łańcuchu połączenia SSH:
- ssh root@server_domain_or_ip
Jeśli nie skonfigurowałeś kluczy SSH dla użytkownika root, wprowadź hasło root, gdy zostaniesz o to poproszony.
Użyj su, aby zostać rootem
Logowanie się bezpośrednio jako root jest zwykle niezalecane, ponieważ łatwo jest zacząć używać systemu do zadań nieadministracyjnych, co jest niebezpieczne.
Kolejny sposób na zdobycie przywilejów superużytkownika pozwala stać się użytkownikiem root w dowolnym momencie, gdy tego potrzebujemy.
Możemy to zrobić wywołując polecenie su
, które jest skrótem od „substitute user”. Aby uzyskać uprawnienia roota, wpisz:
- su
Zostaniesz poproszony o podanie hasła użytkownika root, po czym zostaniesz przeniesiony do sesji powłoki roota.
Po zakończeniu zadań wymagających uprawnień roota, wróć do normalnej powłoki wpisując:
- exit
Use sudo to Execute Commands as Root
Ostatnim sposobem uzyskania uprawnień roota, który omówimy jest polecenie sudo
.
Komenda sudo
pozwala na wykonywanie jednorazowych poleceń z uprawnieniami roota, bez potrzeby tworzenia nowej powłoki. Wykonuje się je w następujący sposób:
- sudo command_to_execute
W przeciwieństwie do su
, polecenie sudo
zażąda hasła bieżącego użytkownika, a nie hasła roota.
Z powodu implikacji związanych z bezpieczeństwem, dostęp sudo
nie jest domyślnie przyznawany użytkownikom i musi być skonfigurowany, zanim będzie działał poprawnie. Zapoznaj się z naszym poradnikiem Jak stworzyć nowego użytkownika z obsługą Sudo dla Ubuntu i CentOS, aby dowiedzieć się, jak skonfigurować użytkownika z obsługą sudo
.
W następnej sekcji omówimy, jak zmodyfikować konfigurację sudo
w sposób bardziej szczegółowy.
Co to jest Visudo?
Komenda sudo
jest konfigurowana poprzez plik znajdujący się pod adresem /etc/sudoers
.
Ostrzeżenie: Nigdy nie edytuj tego pliku za pomocą zwykłego edytora tekstu! Zamiast tego zawsze używaj polecenia visudo
!
Ponieważ niewłaściwa składnia pliku /etc/sudoers
może spowodować uszkodzenie systemu, w którym niemożliwe jest uzyskanie podwyższonych uprawnień, ważne jest, aby do edycji tego pliku używać polecenia visudo
.
Komenda visudo
otwiera edytor tekstowy jak zwykle, ale sprawdza poprawność składni pliku przy zapisie. Zapobiega to blokowaniu przez błędy konfiguracji operacji sudo
, które mogą być jedynym sposobem na uzyskanie uprawnień roota.
Tradycyjnie, visudo
otwiera plik /etc/sudoers
za pomocą edytora tekstowego vi
. Ubuntu jednak skonfigurowało visudo
, aby zamiast tego używać edytora tekstowego nano
.
Jeśli chcesz zmienić go z powrotem na vi
, wydaj następujące polecenie:
- sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status------------------------------------------------------------* 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual modePress <enter> to keep the current choice, or type selection number:
Wybierz numer, który odpowiada wyborowi, którego chcesz dokonać.
W systemie CentOS możesz zmienić tę wartość, dodając następującą linię do swojego pliku ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Źródło pliku, aby wprowadzić zmiany:
- . ~/.bashrc
Po skonfigurowaniu visudo
, wykonaj polecenie dostępu do pliku /etc/sudoers
:
- sudo visudo
How To Modify the Sudoers File
W wybranym edytorze tekstu zostanie wyświetlony plik /etc/sudoers
.
Skopiowałem i wkleiłem plik z Ubuntu 18.04, z usuniętymi komentarzami. Plik CentOS /etc/sudoers
ma o wiele więcej linii, z których niektórych nie będziemy omawiać w tym przewodniku.
Defaults env_resetDefaults mail_badpassDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"root ALL=(ALL:ALL) ALL%admin ALL=(ALL) ALL%sudo ALL=(ALL:ALL) ALL#includedir /etc/sudoers.d
Przyjrzyjrzyjmy się, co robią te linie.
Linie domyślne
Pierwsza linia, „Defaults env_reset”, resetuje środowisko terminala aby usunąć wszelkie zmienne użytkownika. Jest to środek bezpieczeństwa używany do usuwania potencjalnie szkodliwych zmiennych środowiskowych z sesji sudo
.
Druga linia, Defaults mail_badpass
, mówi systemowi, aby wysyłał powiadomienia o złych sudo
próbach podania hasła do skonfigurowanego użytkownika mailto
. Domyślnie jest to konto root.
Trzecia linia, która zaczyna się od „Defaults secure_path=…”, określa PATH
(miejsca w systemie plików, w których system operacyjny będzie szukał aplikacji), które będą używane do sudo
operacji. Zapobiega to używaniu ścieżek użytkownika, które mogą być szkodliwe.
Linie przywilejów użytkownika
Czwarta linia, która dyktuje przywileje użytkownika root sudo
, różni się od poprzednich linii. Przyjrzyjmy się, co oznaczają poszczególne pola:
-
root ALL=(ALL:ALL) ALL
Pierwsze pole wskazuje nazwę użytkownika, którego dotyczy reguła (root). -
root ALL=(ALL:ALL) ALL
Pierwsze „ALL” wskazuje, że reguła dotyczy wszystkich hostów. -
root ALL=(ALL:ALL) ALL
To „ALL” oznacza, że użytkownik root może wykonywać polecenia jako wszyscy użytkownicy. -
root ALL=(ALL:ALL) ALL
To „ALL” oznacza, że użytkownik root może wykonywać polecenia jako wszystkie grupy. -
root ALL=(ALL:ALL) ALL
Ostatnie „ALL” wskazuje, że te zasady odnoszą się do wszystkich poleceń.
To oznacza, że nasz użytkownik root może uruchomić dowolne polecenie używając sudo
, tak długo jak poda swoje hasło.
Linie przywilejów grup
Następne dwie linie są podobne do linii przywilejów użytkowników, ale określają sudo
reguły dla grup.
Nazwy zaczynające się od a %
wskazują nazwy grup.
Widzimy tutaj, że grupa admin może wykonywać dowolne polecenia jako dowolny użytkownik na dowolnym hoście. Podobnie, grupa sudo ma te same przywileje, ale może wykonywać polecenia jako dowolna grupa.
Włączony /etc/sudoers.d Line
Ostatnia linia może wyglądać jak komentarz na pierwszy rzut oka:
. . .#includedir /etc/sudoers.d
Zaczyna się od #
, co zwykle oznacza komentarz. Jednak ta linia w rzeczywistości wskazuje, że pliki znajdujące się w katalogu /etc/sudoers.d
również będą pozyskiwane i stosowane.
Pliki znajdujące się w tym katalogu podlegają tym samym zasadom co sam plik /etc/sudoers
. Każdy plik, który nie kończy się na ~
i który nie ma .
w nim, zostanie odczytany i dołączony do konfiguracji sudo
.
To jest głównie przeznaczone dla aplikacji do zmiany sudo
uprawnień po instalacji. Umieszczenie wszystkich powiązanych reguł w jednym pliku w katalogu /etc/sudoers.d
może ułatwić sprawdzenie, które uprawnienia są powiązane z jakimi kontami i łatwe odwrócenie poświadczeń bez konieczności manipulowania bezpośrednio plikiem /etc/sudoers
.
Tak jak w przypadku samego pliku /etc/sudoers
, powinieneś zawsze edytować pliki w katalogu /etc/sudoers.d
za pomocą visudo
. Składnia do edycji tych plików byłaby następująca:
- sudo visudo -f /etc/sudoers.d/file_to_edit
How To Give a User Sudo Privileges
Najczęstszą operacją, którą użytkownicy chcą wykonać podczas zarządzania uprawnieniami sudo
jest przyznanie nowemu użytkownikowi ogólnego sudo
dostępu. Jest to przydatne, jeśli chcemy nadać kontu pełny dostęp administracyjny do systemu.
Najprostszym sposobem na zrobienie tego w systemie z grupą administracyjną ogólnego przeznaczenia, jak system Ubuntu w tym przewodniku, jest dodanie danego użytkownika do tej grupy.
Na przykład, w Ubuntu 20.04, grupa sudo
ma pełne uprawnienia administratora. Możemy nadać użytkownikowi te same uprawnienia, dodając go do grupy w ten sposób:
- sudo usermod -aG sudo username
Komenda gpasswd
może być również użyta:
- sudo gpasswd -a username sudo
Obydwie te komendy osiągną to samo.
Na CentOS, jest to zazwyczaj grupa wheel
zamiast grupy sudo
:
- sudo usermod -aG wheel username
Albo, używając gpasswd
:
- sudo gpasswd -a username wheel
Na CentOS, jeśli dodanie użytkownika do grupy nie działa od razu, być może będziesz musiał edytować plik /etc/sudoers
, aby odkomentować nazwę grupy:
- sudo visudo
. . .%wheel ALL=(ALL) ALL. . .
How To Set Up Custom Rules
Teraz, gdy zapoznaliśmy się z ogólną składnią pliku, stwórzmy kilka nowych reguł.
Jak tworzyć aliasy
Plik sudoers
może być łatwiej zorganizowany poprzez grupowanie rzeczy za pomocą różnego rodzaju „aliasów”.
Na przykład, możemy stworzyć trzy różne grupy użytkowników, z nakładającymi się członkami:
. . .User_Alias GROUPONE = abby, brent, carlUser_Alias GROUPTWO = brent, doris, eric, User_Alias GROUPTHREE = doris, felicia, grant. . .
Nazwy grup muszą zaczynać się od dużej litery. Możemy następnie zezwolić członkom GROUPTWO
na aktualizację bazy danych apt
tworząc regułę jak poniżej:
. . .GROUPTWO ALL = /usr/bin/apt-get update. . .
Jeśli nie określimy użytkownika/grupy, jako którą mamy uruchamiać, tak jak powyżej, sudo
domyślnie będzie to użytkownik root.
Możemy zezwolić członkom GROUPTHREE
na wyłączanie i restartowanie maszyny tworząc „alias komend” i używając go w regule dla GROUPTHREE
:
. . .Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restartGROUPTHREE ALL = POWER. . .
Tworzymy alias poleceń o nazwie POWER
, który zawiera polecenia wyłączenia i ponownego uruchomienia maszyny. Następnie zezwalamy członkom GROUPTHREE
na wykonanie tych poleceń.
Możemy również tworzyć aliasy „Uruchom jako”, które mogą zastąpić część reguły, która określa użytkownika, jako którego należy wykonać polecenie:
. . .Runas_Alias WEB = www-data, apacheGROUPONE ALL = (WEB) ALL. . .
To pozwoli każdemu, kto jest członkiem GROUPONE
wykonywać polecenia jako użytkownik www-data
lub użytkownik apache
.
Pamiętaj, że późniejsze reguły zastąpią wcześniejsze reguły, gdy wystąpi konflikt między nimi.
How To Lock Down Rules
Istnieje kilka sposobów, dzięki którym możesz osiągnąć większą kontrolę nad tym, jak sudo
reaguje na połączenie.
Komenda updatedb
związana z pakietem mlocate
jest stosunkowo nieszkodliwa w systemie jednego użytkownika. Jeśli chcemy zezwolić użytkownikom na wykonywanie go z uprawnieniami roota bez konieczności wpisywania hasła, możemy wprowadzić następującą regułę:
. . .GROUPONE ALL = NOPASSWD: /usr/bin/updatedb. . .
NOPASSWD
NOPASSWD
to „tag”, który oznacza, że nie będzie wymagane hasło. Ma towarzyszące mu polecenie o nazwie PASSWD
, które jest domyślnym zachowaniem. Znacznik jest istotny dla reszty reguły, chyba że zostanie unieważniony przez jego „bliźniaczy” znacznik w dalszej części linii.
Na przykład, możemy mieć linię taką jak ta:
. . .GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill. . .
Innym pomocnym znacznikiem jest NOEXEC
, który może być użyty do zapobiegania niebezpiecznym zachowaniom w niektórych programach.
Na przykład, niektóre programy, takie jak less
, mogą wywoływać inne polecenia wpisując to z poziomu swojego interfejsu:
!command_to_run
To w zasadzie wykonuje każde polecenie wydane przez użytkownika z tymi samymi uprawnieniami, pod którymi działa less
, co może być dość niebezpieczne.
Aby to ograniczyć, moglibyśmy użyć linii takiej jak ta:
. . .username ALL = NOEXEC: /usr/bin/less. . .
Informacje różne
Jest jeszcze kilka informacji, które mogą być przydatne, gdy mamy do czynienia z sudo
.
Jeśli podałeś użytkownika lub grupę do „uruchamiania jako” w pliku konfiguracyjnym, możesz wykonywać polecenia jako ci użytkownicy, używając odpowiednio flag -u
i -g
:
- sudo -u run_as_user command
- sudo -g run_as_group command
Dla wygody, domyślnie, sudo
zapisze Twoje dane uwierzytelniające przez określony czas w jednym terminalu. Oznacza to, że nie będziesz musiał ponownie wpisywać swojego hasła, dopóki ten czas się nie skończy.
Dla celów bezpieczeństwa, jeśli chcesz wyczyścić ten licznik czasu, gdy skończysz wykonywać polecenia administracyjne, możesz uruchomić:
- sudo -k
Jeśli z drugiej strony chcesz „wyzerować” komendę sudo
, aby nie być później pytanym, lub odnowić swoją sudo
dzierżawę, zawsze możesz wpisać:
- sudo -v
Zostaniesz poproszony o podanie hasła, które zostanie zbuforowane do późniejszego sudo
użycia, aż do wygaśnięcia przedziału czasowego sudo
.
Jeśli po prostu zastanawiasz się jakie uprawnienia są zdefiniowane dla twojej nazwy użytkownika, możesz wpisać:
- sudo -l
Wyświetli to wszystkie reguły w pliku /etc/sudoers
które dotyczą twojego użytkownika. To daje ci dobry pomysł na to, co będziesz lub nie będziesz mógł zrobić z sudo
jako dowolny użytkownik.
Jest wiele razy, kiedy wykonasz polecenie i nie powiedzie się ono, ponieważ zapomniałeś poprzedzić je sudo
. Aby uniknąć konieczności ponownego wpisywania polecenia, możesz skorzystać z funkcji basha, która oznacza „powtórz ostatnie polecenie”:
- sudo !!
Podwójny wykrzyknik powtórzy ostatnie polecenie. Poprzedziliśmy go sudo
aby szybko zmienić komendę nieuprzywilejowaną na uprzywilejowaną.
Dla zabawy, możesz dodać następującą linię do swojego pliku /etc/sudoers
za pomocą visudo
:
- sudo visudo
. . .Defaults insults. . .
Spowoduje to, że sudo
zwróci głupią obelgę, gdy użytkownik wpisze nieprawidłowe hasło do sudo
. Możemy użyć sudo -k
do wyczyszczenia poprzedniego sudo
buforowanego hasła, aby go wypróbować:
- sudo -k
- sudo ls
Output password for demo: # enter an incorrect password here to see the resultsYour mind just hasn't been the same since the electro-shock, has it? password for demo: My mind is going. I can feel it.
Podsumowanie
Powinieneś teraz mieć podstawowe zrozumienie, jak czytać i modyfikować plik sudoers
, oraz pojęcie o różnych metodach, których możesz użyć, aby uzyskać uprawnienia roota.
Pamiętaj, że przywileje superużytkownika nie są nadawane zwykłym użytkownikom z jakiegoś powodu. Istotne jest, abyś rozumiał, co robi każde polecenie, które wykonujesz z uprawnieniami roota. Nie traktuj tej odpowiedzialności lekceważąco. Dowiedz się, w jaki sposób najlepiej używać tych narzędzi w danym przypadku i zablokuj wszystkie funkcje, które nie są potrzebne.