Udzielanie dostępu do zestawu poleceń użytkownikowi innemu niż root bez sudo

13

Chcę przyznać dostęp inny niż sudo użytkownikowi innemu niż root na moim komputerze, istnieje użytkownik dns-manager, jego jedyną rolą jest uruchamianie wszystkich poleceń BIND (rndc, dnssec-keygen) itp.

Teraz za każdym razem, gdy musi wykonać polecenie, pisze:

sudo rndc reload

Czy istnieje sposób na pozbycie się tego sudo, ale tylko na określonym zestawie poleceń (i tylko dla dns-manager)?

Odpowiedzi
źródło
5
Taka dyskrecjonalna kontrola dostępu jest właściwie po to sudo. Jakie są twoje obiekcje biznesowe wobec jego użycia sudow tym celu?
MadHatter
1
@peterh Powtarzam moje pytanie: rolą jest uznaniowa kontrola dostępu (tj. częściowa delegacja sysadm) sudo. Jakie są zastrzeżenia?
MadHatter
3
Co powiesz na hasło bez hasła sudo? Lub sudo z hasłem, aby uruchomić narzędzie do zarządzania DNS , które może następnie działać z nameduprawnieniami grupy lub użytkownika lub uprawnieniami administratora, w razie potrzeby.
MadHatter
4
@peterh „dobrym powodem, aby zrobić to w ten sposób” byłby brakujący bit. Zwykle takie pytania okazują się ukrytymi problemami XY i uważam, że zrozumienie leżącego u ich podstaw problemu jest kluczowe, aby odpowiedzieć na nie w pełni i profesjonalnie.
MadHatter
2
@peterh Myślę, że się ze sobą zgadzamy. Ja również chcę, aby PO poprawił swoje pytanie; wgłębianie się w to działa dla mnie dobrze, ponieważ pomaga autorowi myśleć poza tym, co zbudował wokół siebie. Może mieć dobry powód, by tego unikać sudo. Próbując nam to wyrazić, może albo wyjaśnić nasze zamieszanie, albo swoje własne - albo jedno i drugie!
MadHatter

Odpowiedzi:

31

Jeśli dobrze rozumiem twoje komentarze, problem polega na tym, że polecenie zostanie wydane przez połączenie, które nie ma możliwości wprowadzenia hasła, którego domyślnie wymaga sudo. Ponadto w wielu dystrybucjach systemu operacyjnego sudo będzie domyślnie wymagało TTY - czego ten program może nie mieć.

Jednak sudo może mieć bardzo szczegółową strukturę uprawnień, dzięki czemu jeden lub więcej użytkowników może wydać jedno polecenie bez hasła i TTY. Poniżej przedstawię trzy sposoby skonfigurowania tego do własnych potrzeb. Niezależnie od tego, który wybierzesz, użytkownik będzie mógł wydać polecenie sudo rndc reloadbez konieczności wprowadzania hasła.

(Również, może to być konieczne, ale ... proszę pamiętać, aby zrobić kopię zapasową pliku sudoers przed jego edycję, aby utrzymać skorupę gdzie jesteś otwarty główny w przypadku trzeba przywrócić do kopii zapasowej, a do edycji używając go visudozamiast sudo vi /etc/sudoers. Mam nadzieję, że te środki ostrożności będą niepotrzebne, ale ... lepiej je mieć i nie potrzebować ich niż na odwrót!)

1. Jeśli nie chcesz wymagać TTY dla jakichkolwiek żądań

Najłatwiejszym sposobem na pozbycie się wymagań TTY (jeśli taki istnieje) jest upewnienie się, że wiersz zaczynający się na Defaultsin /etc/sudoersnie zawiera słowa requiretty- zamiast tego powinien zawierać !requiretty. Jednak jeśli to zrobisz, oznacza to, że żadne polecenie sudo nie będzie wymagać tty!

Będziesz także musiał dodać linię

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Jeśli chcesz wymagać TTY dla wszystkich użytkowników oprócz tego

Można to zrobić, ustawiając wartość domyślną dla tego jednego użytkownika, na przykład:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Jeśli chcesz zażądać TTY dla wszystkich poleceń oprócz tego jednego polecenia tego jednego użytkownika

Jest to nieco bardziej złożone, ze względu na składnię pliku sudoers. Musisz utworzyć alias polecenia dla polecenia, a następnie ustawić domyślny alias polecenia, na przykład:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD
Jenny D.
źródło
Oczywiście można to połączyć ze skryptem otoki, który wywołuje polecenie za pomocą sudo, jeśli z jakiegoś powodu nie możesz używać sudo bezpośrednio, nawet jeśli jest ono bez hasła.
Jenny D.
4

Tak. sudo można skonfigurować bardzo elastycznie. Mimo to muszę wspomnieć: tego typu rozwiązań nie należy uważać za bardzo bezpieczne i należy ich używać wyłącznie w środowisku współpracy, w którym obowiązują inne mechanizmy kontrolne (w ten sposób możesz dać te rozszerzone przywileje swojemu lojalnemu podwładnemu, ale nie należy tego robić dla klienta, którego znasz tylko z sieci).

Konfiguracja sudo jest dostępna /etc/sudoersw większości systemów. Możesz dowiedzieć się o jego składni przez Googling lub przez man sudopolecenie.

Nie powinieneś edytować tego pliku bezpośrednio; może to prowadzić do warunków bezpieczeństwa wyścigu. Zamiast tego użyj visudopolecenia (które jest opakowaniem wokół $EDITORzmiennej środowiskowej).


Po skonfigurowaniu sudo możesz łatwo owinąć to wokół widocznych poleceń. To bardzo proste:

  1. Utwórz katalog z listą skryptów opakowujących sudo (fe /usr/local/dnsadmin/bin)
  2. Utwórz skrypt opakowania dla poleceń, które mają być użyteczne bez sudo. Będzie to bardzo proste polecenie, na przykład /usr/local/dnsadmin/bin/rndcbędzie:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Pobierz ten katalog do ich PATHzmiennej środowiskowej (np. Przez system lub lokalnie .profile).

peterh - Przywróć Monikę
źródło
Z ciekawości - dlaczego miałbyś używać execskryptu powłoki zamiast bezpośrednio wywoływać polecenie? (Nie twierdzę, że to źle, po prostu chcę wiedzieć, dlaczego to robisz, więc mogę się czegoś nauczyć)
Jenny D.
2
Skończyłem z bitem sudo bez hasła, pomysł na opakowanie skryptów jest świetny.
Odpowiada
2
@JennyD :-) Ze względu na stabilność i wydajność. W przypadku execwywołanego polecenia zostanie zastąpione w miejscu powłoki. Skorupa zniknie. Bez exec powłoka uruchomi to polecenie, a następnie czeka na zakończenie, a następnie kończy działanie. Ten drugi, bezobsługowy, oznacza wiele współpracujących procesów, które są niepotrzebne. Ale nie ma dużej różnicy, bez exec nie działałoby tak dobrze, jak z tym.
peterh - Przywróć Monikę
@JennyD Moja prośba :-)
Peter - Przywróć Monikę
@Snowbody Dziękuję bardzo za lectoring! To bardzo duży zaszczyt.
Peter - Przywróć Monikę
2

Chociaż nie jest to ogólne rozwiązanie w konkretnym przypadku, w rndcogóle nie potrzebujesz sudo.

rndcmoże komunikować się z dowolnym namedprocesem za pośrednictwem lokalnego gniazda lub zdalnego portu, używając tajnego klucza do uwierzytelnienia. Domyślnie (lub przynajmniej dla Debiana, którego używam w dystrybucji) ten plik można znaleźć /etc/bind/rndc.keyi jest on zwykle czytelny tylko dla użytkownika bindi grupy bind.

Każdy, kto ma dostęp do odczytu tego pliku klucza (lub jego identycznej kopii), może użyć rndcdo sterowania serwerem BIND, więc najłatwiejszym rozwiązaniem w tym konkretnym przypadku byłoby dodanie użytkownika do bindgrupy.

Zaskakująca liczba typowych demonów ma coś podobnego (osobiście wciąż zastanawiam się nad możliwościami powerdns w tym zakresie, ale na razie wygląda to obiecująco). Jeśli nie chcesz tego robić sudo, musisz sprawdzić, czy to, co chcesz osiągnąć, jest możliwe indywidualnie dla każdego przypadku.

Shadur
źródło
-1

Nie chcesz używać sudo do przyznawania uprawnień roota dla niektórych poleceń. Zamiast tego możesz chmod 4750 konkretnego programu [który może zawinąć polecenie], aby podnieść prawa zwykłego użytkownika do wykonywania go jako root.

bbaassssiiee
źródło