Jak możemy pozwolić użytkownikom innym niż root na kontrolowanie usługi system.d?

60

Przy sysvinittakim sudoerswpisie wystarczy:

%webteam cms051=/sbin/service httpd *

Pozwoliłoby to na takie polecenia jak:

  • sudo service httpd status
  • sudo service httpd restart

Teraz systemdnazwa usługi jest ostatnim argumentem. Tzn. Ponowne uruchomienie usługi można wykonać za pomocą:

systemctl restart httpd.service

Oczywiście myślałem, że zdefiniowanie polecenia systemctl * httpd.servicebędzie działało, ale pozwoli to na coś, systemctl restart puppet.service httpd.serviceco nie jest pożądanym efektem.

Biorąc to pod uwagę, jaki byłby najlepszy sposób, aby umożliwić użytkownikom innym niż root kontrolowanie system.dusługi? To nie musi być sudoers; może zmiana uprawnień do pliku może być wystarczająca?

Belmin Fernandez
źródło
Od jakiegoś czasu nie zmieniałem sudokonfiguracji, ale czy nie możesz po prostu zrobić czegoś takiego cms051=systemctl * httpd.service?
John WH Smith,
1
Umożliwi to ponowne uruchomienie dowolnej usługi. Powinienem był uwzględnić tę ciekawostkę w pytaniu. Przepraszam.
Belmin Fernandez

Odpowiedzi:

43

Po prostu dodaj wszystkie potrzebne polecenia sudoersosobno:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
Jofel
źródło
Miałem nadzieję uchwycić wszystkie polecenia jednostek, ale jeśli będę musiał je wyszczególnić, to chyba będę musiał to zrobić.
Belmin Fernandez
9
status nie jest przydatny, ponieważ każdy użytkownik może to zrobić
Dereckson
5
Co to jest cms051?
kevin
1
Co się stanie, jeśli wywołam restart systemctl http.service mariadb.service ;-)? Prawdopodobnie zrestartuje się także mariadb
Marek Wajdzik
1
@MarekWajdzik sudo nie zezwala na dodatkowe argumenty, jeśli nie jest to wyraźnie dozwolone z *podobnymi wzorcami.
jofel
31

Odpowiedź @ jofel była dokładnie tym, czego potrzebowałem, aby uzyskać działającą konfigurację. Daj to każdemu, kto natknie się na to pytanie. Potrzebowałem sposobu na capistranoponowne uruchomienie aplikacji Ruby po wdrożeniu z mojego komputera lokalnego. Oznacza to, że potrzebowałem dostępu bez hasła do ponownego uruchamiania systemdusług. To jest to, co mam i działa cudownie!

Uwaga : mój użytkownik i grupa nazywa się deployer
Umieść kod w pliku niestandardowym tutaj: /etc/sudoers.d/deployer
Kod:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
BoomShadow
źródło
Muszę dodać, że po zalogowaniu się jako użytkownik deployerw sprawie powinieneś uruchomić systemctlpolecenie za pomocą sudo.
Muyiwa Olu
8

Utwórz alias polecenia za pomocą poleceń, do których mają mieć dostęp. Następnie przypisz grupę do tego aliasu polecenia:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

Dobrą praktyką jest również umieszczanie wszelkich zmian w /etc/sudoers.d/filename zamiast bezpośredniej edycji pliku sudoers. Pamiętaj, aby w sudoers wskazać nazwę pliku .d /, co i tak robi większość nowych dystrybucji. Umieszczenie tych 2 linii w sudoers powinno załatwić sprawę:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Uwaga: Ten # przed argumentem includedir nie jest komentarzem. To musi pozostać.

Bogaty
źródło
Jak dodać szansę na uruchomienie stop / start / restart bez podania hasła?
Nikolay Baranenko
Najlepsza odpowiedź IMO. Każdy powinien dodać alias polecenia i pracować z tym.
DASKAjA
6

Najbezpieczniej jest je wyszczególnić, jak sugeruje Jofel .

Gdybym chciał pozwolić komuś na użycie ograniczonego podzbioru zdolności polecenia, nie ufałbym tym symbolom wieloznacznym w linii sudoers. Nawet jeśli język był bardziej wyrazisty niż globus powłoki, jest po prostu zbyt wiele przypadków narożnych, aby je śledzić.

service httpd *Wiersz „ ” jest względnie bezpieczny, ponieważ (sprawdź to :) servicema tylko jedną przydatną flagę ( --status-all), która nie robi nic szczególnie wrażliwego, i (sprawdź to również :) /etc/init.d/httpdzaakceptuje tylko wiersze poleceń, na które chcesz zezwolić.

Jeśli istnieje tak wiele kombinacji, że umieszczenie ich na liście staje się niezręczne, prawdopodobnie powinieneś zapytać, co robisz. Ale możesz dać im dostęp do starannie napisanego skryptu pomocnika, który uruchamia dla nich polecenie (podobnie jak /etc/init.d/http). Nawet w tym przypadku powinieneś być tak precyzyjny i wyraźny, jak to możliwe, aby dokładnie określić, jakie polecenia i opcje są dozwolone, i nie przekazywać żadnych danych wejściowych użytkownika bezpośrednio do polecenia docelowego.

Jander
źródło