Muszę zezwolić użytkownikom w dba
grupie na kontrolowanie database@
usług. Odpowiedzią na to pokrewne pytanie jest po prostu wypisanie wszystkich systemctl
„czasowników”, które chcę dopuścić w sudoers
pliku, jednak nie dotyczy to mojej sprawy, ponieważ nie wiem z góry, jakie bazy danych mogą istnieć w systemie. Na przykład, jeśli wymienię
%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity
nie obejmuje to instancji, które mogą istnieć w przyszłości, a dba nie będzie w stanie tego zrobić
$ sudo systemctl start database@omgwowyetanotherawsesomeapp
W każdym razie myślę bardziej o pakowaniu niż o majstrowaniu przy konkretnym systemie.
Zauważ, że jak pokazano w tej niesamowitej odpowiedzi na inne powiązane pytanie , użycie globów sudo do tego celu jest ostatecznie niepewne:
%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!
pozwala
$ sudo systemctl start database@awsesomeapp unrelatedservice
Podejrzewam, że używanie sudo
nie rozwiąże mojego problemu (chociaż mam nadzieję, że się mylę). Czy istnieje inny sposób, aby umożliwić użytkownikom innym niż root kontrolowanie systemd
usług?
Aby to było warte, muszę to zrobić w systemie CentOS 7 i systemach RHEL7 w przyszłości. Byłbym także zainteresowany rozwiązaniami, które działają na Arch Linux.
źródło
Proponowane rozwiązanie oparte na
SUID
Możesz utworzyć wspomniany skrypt, który wywołuje systemctl z sudo. Utwórz skrypt należący do roota. Zezwól
SUID
na rootowanie, odczytywanie i wykonywanie uprawnień grupie administratorów baz danych (dba).Uważaj tylko, aby nie udzielić pozwolenia na zapis grupie ani innym osobom, ponieważ w ten sposób mogą zmienić skrypt i spowodować, że wykona wszystko poprzedzone sudo! Upewnij się również, że skrypt jest kuloodporny pod względem wejściowym.
Skrypt ten można ulepszyć, sprawdzając, czy argument rzeczywiście został dostarczony, i wypisuje komunikat Użycie: komunikat, jeśli nie ..., ponieważ jest to skrypt, w
SUID
przypadku którego należy sprawdzić; aby uniknąć wstrzyknięcia innych poleceń po argumencie. Lub jeszcze lepiej upewnij się, że zezwalasz na wprowadzanie tylko jednego z ciągów związanych z aplikacją, o których wspomniałeś!Następnie upewnij się, że uprawnienia do skryptu są następujące:
Następnie, aby zweryfikować poprawne uprawnienia:
Tak więc, aby podsumować:
1.
owner of the script is root
2. Plik
can be read and executed by the dba group members
3.
no-one else will be able to even read
to.4.
SUID
pozwoli użytkownikowi, który wykonuje skrypt, stać się rootem, dopóki skrypt jest wykonywany.5. Więc sudo nie zatrzyma się po hasło.
W każdym przypadku, w systemie z wieloma użytkownikami, być bardzo ostrożnym z
SUID
ponieważ może pozostawić miejsce na nadużycia uprawnień.źródło
SUID
domyślnie nie będzie działał dla skryptów.