Konfiguruję maszynę Ubuntu (10.10), z której będzie korzystać kilka osób. Jest to wspólna maszyna w małym biurze. Jego główne role to hosting maszyn wirtualnych za pomocą VirtualBox i serwowanie plików za pomocą Samby.
W przypadku Samby należy skonfigurować kilka kont użytkowników, aby różne osoby mogły łączyć się z udziałami Samby z własnych stacji roboczych. Istnieje jednak konto przeznaczone wyłącznie do uruchamiania maszyn wirtualnych, z których będzie korzystać wiele osób. Czasami ludzie próbują robić rzeczy z tym kontem, które wymagają podwyższonych uprawnień - powoduje to wyświetlenie okna dialogowego Gnome „wprowadź hasło użytkownika administracyjnego”. Jednak to okno dialogowe wymaga podania mojego hasła - kiedy konfigurowałem maszynę, moje konto było pierwszym utworzonym kontem, więc wydaje się, że zakładam, że jestem jedynym użytkownikiem, któremu przyznano uprawnienia sudo.
Chcę wyznaczyć innego użytkownika jako „administratora pierwszej instancji”, że tak powiem, i nie może to być użytkownik wspólnego konta, ponieważ każdy musi znać hasło do tego konta, więc chcę, aby jego uprawnienia były ściśle ograniczone. To nie może być moje konto, ponieważ w żaden sposób nie mówię innym osobom mojego hasła i nie będę obecny na stronie wystarczająco często, aby sam je wprowadzić. Jest jednak ktoś, kto może to zrobić osobiście, więc dodałem ich do /etc/sudoers
. Jak mogę powiedzieć, że kiedy to Ubuntu wymaga podniesienia uprawnień do czegoś, powinna poprosić o ich uwagę w pierwszej kolejności?
Podsumowując:
- Konta na maszynie: Alice, Bob, Carol, Dave, Eliza.
- Po zainstalowaniu Ubuntu Alice była pierwszym użytkownikiem dodanym podczas procesu instalacji.
- „Dave” to w rzeczywistości konto, z którego korzysta wiele osób, które nie mogą być na nim,
/etc/sudoers
ponieważ jego hasło to wiedza publiczna. - Bob został ustawiony jako konto „administracyjne” w Gnome i jest odpowiednio wpisany
/etc/sudoers
- Bob jest szefem tego biura. - Gdy podejmowane są działania wymagające podwyższonych uprawnień podczas logowania jako Bob, Carol, Eliza lub Dave, system powinien poprosić Boba o poświadczenia.
- Gdy podejmowane są działania wymagające podwyższonych uprawnień podczas logowania jako Alice, system powinien zażądać poświadczeń Alicji (chociaż Alice jest swego rodzaju administratorem systemu buckaroo i ma zwyczaj używania
su -
rozszerzonych zadań administracyjnych).
Jakie zmiany konfiguracji muszę wprowadzić, aby uzyskać pożądany stan tutaj?
źródło
sudoers
pliku, możesz sprawdzić stronę podręcznika, aby uzyskać więcej informacji.sudoers
: nie jest to pierwszy sposób ze względów bezpieczeństwa. Zobacz także odpowiedź enzotib - częścią problemu było zamieszanie międzysudo
PolicyKit a.Odpowiedzi:
Przede wszystkim należy zauważyć, że uprzywilejowane działania są dozwolone dla użytkownika innego niż root za pośrednictwem dwóch różnych mechanizmów.
sudo
PolicyKit
Pierwszy z nich jest używany, gdy jawnie uruchomisz polecenie z
sudo
lub element menu, którego polecenie jest opakowanegksu
(jak Menedżer pakietów Synaptic ).W takim przypadku wymagane jest hasło wywołującego użytkownika, zwykle zalogowanego użytkownika.
Drugi jest używany, gdy aplikacja obsługująca PolicyKit próbuje wykonać uprzywilejowaną akcję. W takim przypadku aplikacja pyta władze lokalne PolicyKit (za pośrednictwem D-Bus), czy można wykonać akcję. Władze lokalne następnie za pośrednictwem agenta uwierzytelnienia prosi aktywnego użytkownika o potwierdzenie swojej tożsamości. Okna dialogowe wyglądają następująco (niestety z tekstem w języku włoskim :)
Możesz zidentyfikować PolicyKit na podstawie małego czarnego trójkąta i etykiety Szczegóły . Jak widać, jeśli więcej niż jeden użytkownik jest w
admin
grupie, możesz wybrać z listy, którego użytkownika użyć do uwierzytelnienia.Biorąc to wszystko pod uwagę, zarówno
sudo
PolicyKit , jak i konfiguracje są znacznie bardziej skomplikowane, jeśli chodzi o konfiguracje, które można osiągnąć: możesz skonfigurować akcję, która może być wykonana bez hasła, wykonywana tylko przez określonego użytkownika lub grupę itp.Jeśli chodzi o twoje pytanie, gdy mechanizmem używanym przez aplikację jest PolicyKit, niezależnie od aktualnie zalogowanego użytkownika, wymagane hasło to Bob lub Alice (jedyny administrator, jeśli dobrze rozumiem), i możesz to zmienić z listy, którego użytkownika chcesz użyć do uwierzytelnienia.
Gdy mechanizmem wykorzystywanym przez aplikację jest
sudo
(w przypadku zadań administracyjnych wykonywanych za pomocą GUI staje się to coraz rzadsze), nie masz natychmiastowego i prostego sposobu na wybranie użytkownika do uwierzytelnienia.źródło
Najwyraźniej
sudo
byłby to dla mnie pierwszy wybór w takim przypadku. Głównymi punkt pojawi się, że większość (rzeczywista) administratorzy rzeczywistości nie używać/etc/sudoers
do jego najszerszym zakresie (User_Alias
,Runas_Alias
,Host_Alias
,Cmnd_Alias
).Większość administratorów używa tylko niektórych istniejących reguł i dodaje użytkowników lub, co gorsza, po prostu dodaje użytkowników do
sudo
grupy, dla której reguła zwykle istnieje w konfiguracjach Ubuntu (%sudo
...). To oczywiście daje odpowiednim użytkownikom wolne panowanie i pełną moc konta superużytkownika.Biorąc pod uwagę twój komentarz:
Sądzę, że również nie wykorzystujesz tego w możliwym zakresie.
W scenariuszu takim jak twój dosłownie napisałbym kilka działań, do których Bob ma się ograniczyć. W rzeczywistości tak zrobiłem na serwerze, który utrzymuję, aby umożliwić dwóm określonym użytkownikom ponowne uruchomienie określonego gościa KVM na hoście. Skrypty zawierałyby hashbang z bezwzględną ścieżką do interpretera (np.
#!/bin/dash
Zamiast#!/usr/bin/env bash
) i prawdopodobnie działałyby z powłoką używaną gdzie indziej do zadań uprzywilejowanych (/bin/dash
lub/bin/sh
). To tylko środki ostrożności. Poza tym upewniłem się, że na stałe wpisałem wszystkie bezwzględne ścieżki do plików binarnych i użyłem ich jak najmniej. Np. Przy użyciubash
/dash
Wolębuiltin
s niżcommand
s (patrzman bash
). Można to utrzymać, przypisując zmiennej ścieżkę bezwzględną i odnosząc się do programu na podstawie tej zmiennej ($VIRSH
zamiast/usr/bin/virsh
). Jeśli możesz, sprawdź kod wszystkich zewnętrznych skryptów przed ich wywołaniem. Zwłaszcza jeśli chcesz do nich zadzwonić w uprzywilejowanym kontekście. W moim przypadku ograniczam również użytkowników do określonego katalogu głównego i określonego podsystemu SSH, ponieważ łączą się oni tylko z maszyną za pomocąsshd
uwierzytelniania za pomocą klucza publicznego. Oczywiście nie potrzebujesz tego.Upewnij się, że
chown root: <the-script>; chmod u=rw,a=,a+rx <the-script>
nikt nieroot
jest w stanie majstrować przy nim. Ponadto należy zachować ostrożność zesetuid
isetgid
bity włączone binariów docelowych (find
może być użyty do ich wykrycia). Załóżmy na moment, w którym znajduje się skrypt/usr/sbin/priv-action
.Teraz edytuj swój
/etc/sudoers
.noexec
może być użyty, aby zapobiec również innym plikom binarnym, niż te wyraźnie dozwolone. W rzeczywistości istnieje wiele dodatkowych ustawień, nie tylko te, które tu opisuję. Więc koniecznie skonsultuj sięman sudoers
.Teraz wolę nazywać użytkowników (
User_Alias
) w moimsudoers
pliku, ale równie dobrze możesz użyćGroup_Alias
(man sudoers
) lub rzeczywistej grupy systemowej (np.%sudo
):a następnie dodaj alias polecenia, aby umożliwić wykonanie tego konkretnego skryptu:
Na koniec pojawia się magiczna linia pozwalająca
bob
(a raczej użytkownikom wymienionym poniżejLIMITED_ADMINS
) na wykonywanie uprzywilejowanych poleceń za pomocą skryptu:W przeciwieństwie do poprzednich definicji aliasów ten wiersz wymaga wyjaśnienia. Najpierw zagłębmy się w części w wierszu „Specyfikacja użytkownika”. Tutaj
man sudoers
pomaga:Przykładowa linia (znaleziona w większości konfiguracji Ubuntu):
Oznacza to, że użytkownik o nazwie
root
(użyj,#0
aby powiązać go z UID0
) może na wszystkich hostach działać w dowolnym kontekście użytkownika, ale zostanie poproszony o podanie hasła (przy założeniu domyślnego zachowania). DodanieNOPASSWD
tagu przed ostatnimALL
pozwoliłoby równieżroot
zrobić to samo bez pytania o hasło (tak:)root ALL=(ALL) NOPASSWD:ALL
.ALL
jest nieodłącznym aliasem wieloznacznym dla różnych typów aliasów.Ale wracając do Boba:
pozwoli
bob
i innym wymienionym członkomUser_Alias LIMITED_ADMINS
na uruchomienie (na wszystkich hostach, po toALL
jest) dla użytkownikaroot
(implikowana grupa, ale można podać, zobaczman sudoers
) polecenia podane wCmnd_Alias PRIV_ACTION
. To staje się lepsze. Nadal zakładając, że piszesz ten skrypt, możesz zezwolić na różne parametry, unikając w ten sposób pisania wielu skryptów./etc/sudoers
chętnie przyjmuje podobne do powłoki symbole wieloznaczne, aby ograniczyć możliwości przekazywania argumentów.Konsekwentnie stwierdzam, że administratorzy nie używają
sudoers
sposobu, w jaki powinien być używany, dlatego doceniłem odpowiedni „hack” z dwóch książek „Linux Server Hacks” i „Linux Server Hacks Tom drugi”, od których zacząłem bardziej wyrafinowane wykorzystanie tego wspaniałego obiektu.Możesz wymyślić wszelkiego rodzaju skomplikowane - co może nie do końca pomóc w aspekcie bezpieczeństwa - rozwiązania dla twojego konkretnego przypadku, ale kiedy mówisz podstawowe słownictwo
/etc/sudoers
, możesz wykonywać całkiem magiczne wyczyny :)Uwaga: pamiętaj, że możesz również utworzyć nowy plik,
/etc/sudoers.d/
jeśli masz na to ochotę. Zakłada się, że/etc/sudoers
zawiera on linię:źródło
W Uniksie / Linuksie jest tylko jeden superużytkownik, jego nazwa to root, ale sudoers to użytkownicy, którzy mogą zostać rootem. Powinieneś używać grup:
a następnie przypisz użytkowników do tej grupy:
następnie dodaj grupę adminów do pliku konfiguracyjnego sudoers, tak jakby grupa była użytkownikiem.
Aktualizacja
Lub możesz dodać dowolnego użytkownika do grupy administracyjnej:
źródło
adduser <user>
,addgroup <group>
iadduser <user> <group>
są najlepszym sposobem na Debian / Ubuntu.