Pozwól użytkownikowi uruchomić polecenie z argumentami (które zawiera spacje)

17

Chcę zezwolić jednemu użytkownikowi na uruchomienie grep (poprzez sudo) i grep dla jednego określonego ciągu w jednym określonym pliku. Nie chcę zezwalać temu użytkownikowi na uruchomienie grep na wszystkich plikach. Użytkownik nie ma dostępu do odczytu pliku, stąd wymóg korzystania z sudo. Próbuję napisać sprawdzenie nagios, które greps plik dziennika innej usługi na komputerze.

Jednak to nie działa, sudo wciąż pyta o hasło.

Moje polecenie brzmi: sudo grep "string I want (" /var/log/thefilename.log(tak, (w łańcuchu jest surowe i niektóre spacje, które chcę grepować)

/etc/sudoers.d/user-can-grep ma tę treść:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Ten plik sudoers jest własnością root:rooti ma uprawnienia-r--r-----

Serwer to zaufany Ubuntu 14.04.3 LTS.

Jak mogę to zrobić?

Rory
źródło
Czy kontrole nagios jawnie wywołują / bin / grep, / / ​​usr / bin / grep?
Jeff Schaller
Napisz skrypt powłoki, który to zrobi, a następnie uruchom skrypt sudo.
user253751,
@ JeffSchaller FYI skrypt po prostu wywołuje grepi which grepmówi mi, że używa /bin/grep. AFAIK w pliku sudo musisz podać pełną ścieżkę pliku binarnego, nawet jeśli wywołujesz go bez pełnej ścieżki.
Rory

Odpowiedzi:

13

Najwyraźniej sudo spłaszcza polecenie do łańcucha przed porównaniem go ze specyfikacją w pliku sudoers. Tak więc w twoim przypadku nie musisz używać cudzysłowów ani żadnej innej formy ucieczki:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Edycja : Jak wskazuje @ user23013 w komentarzach, można to wykorzystać do grep dla „string I Want” w dowolnym pliku (a przez rozszerzenie również dla „string I” i „string”.) Proszę dokładnie rozważyć to wcześniej używając sprawdzania argumentów sudo!


Należy również pamiętać, że następujące wywołania są równoważne, tzn. Nie będzie można ograniczyć użytkowników do jednej konkretnej reprezentacji:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Wynika to z faktu, że cytaty i znaki ucieczki są obsługiwane przez powłokę i nigdy nie docierają sudo.

Alexander Batischev
źródło
Co ciekawe, zastanawiam się, czy można to wykorzystać, tj. Przekonać, sudoże wpisałeś jedną rzecz (która pasuje do specyfikacji), ale jeśli chodzi o wykonanie, jest to coś zupełnie innego.
EightBitTony 26.04.16
4
@EightBitTony Oczywiście, że tak! W sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(z zamiarem umożliwienia użytkownikom edycji „Edycji pliku sudoers”) można wykorzystać cd, wchodząc /etc/i uruchamiając sudo vim Editing sudoers file. Powiedziałbym, że dla każdego polecenia o rozsądnej złożoności należy stosować podejście sugerowane w twoim komentarzu - shell zapewnia $@zmienną, w której możesz sprawdzić, czy argumenty są pogrupowane w sposób, w jaki oczekujesz, że zostaną zgrupowane.
Alexander Batischev
8
Utwórz ścieżkę w ( /var/logdowolnym miejscu i dowiązanie symboliczne thefilename.logdo dowolnego pliku, użytkownik może wtedy grepować string I wantz dowolnego pliku.
user23013
2
@ Odpowiedź EightBitTony (napisz skrypt opakowujący, zezwól sudo na dostęp do tego skryptu) jest znacznie lepsza i bezpieczniejsza.
cas
Wow, to bardzo słaba praktyka dla narzędzia skoncentrowanego na bezpieczeństwie.
Sam Watkins,
32
  1. Napisz skrypt (zapis tylko przez roota)
  2. W tym skrypcie uruchom greppotrzebne narzędzie
  3. W konfiguracji sudoers zezwól tylko na dostęp do tego skryptu
  4. Skonfiguruj dowolne narzędzie lub doradzaj dowolnemu użytkownikowi, aby po prostu uruchomił skrypt za pośrednictwem sudo

O wiele łatwiejsze do debugowania, łatwiejsze do zablokowania określonego dostępu do określonego pliku i znacznie trudniejsze do wykorzystania.

EightBitTony
źródło
2

Ponieważ trzeba tylko root za dostęp do plików, należy rozważyć użycie cat, teelub coś podobnego i rurociągi, które do greplub cokolwiek programu trzeba uruchomić. Np. W sudo cat /file/path | grep …ten sposób ograniczasz rootowanie do tego, gdzie jest to absolutnie potrzebne.

użytkownik167676
źródło
0

sudojest świetne, ale czasami nie jest to najlepsze dopasowanie. Do tego lubię używać super. superumożliwia także podwyższone uprawnienia, ale zakłada aliasy poleceń, co jest wygodne, gdy pozwala się na skomplikowane wiersze poleceń, ponieważ są one używane jako proste wiersze poleceń.

twoja super.tab wyglądałaby następująco:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

i będzie wywoływany jako super grepcmd.

Hildred
źródło
sudohas Cmnd_Alias(który może zawierać jedno lub więcej poleceń, z ograniczeniami arg lub bez nich).
cas
Zupełnie nie to samo. Cmnd_Alias ​​to narzędzie upraszczające plik konfiguracyjny, nie ujawnia aliasu użytkownikowi, który jest podstawowym trybem działania super (dlatego używam sudo, gdy nie korzystam z aliasingu poleceń ani nie uruchamiam skryptów suid (przez większość czasu) i super dla tych dwóch przypadków użycia).
hildred
po to są skrypty otoki… i nie są ograniczone do jedno-liniowych lub mają irytujące problemy z cytowaniem.
cas