Zezwalaj na złożone polecenie sudo w systemie Debian Linux

13

Muszę zezwolić na określone polecenie w oknie Debian Linux dla jednego użytkownika. Próbowałem tego w /etc/sudoerspliku:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

To nie działa zgodnie z oczekiwaniami. Jeśli uruchomię polecenie jako użytkownik zabbix za pomocą sudo, poprosi o hasło (chociaż podałem NOPASSWDopcję).

Działa to jednak:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

Ale ma tę wadę, że wszystkie podkomendy apt-getsą dozwolone. Czy istnieje sposób, w jaki mogę to naprawić, aby zezwolić tylko na określone polecenie?

Daniel
źródło

Odpowiedzi:

10

Nie zgadzam się z Lainem. Chociaż to zadziała, nie musisz awkuruchamiać się jako root. Nie czułbym się z tym dobrze, ponieważ możesz być w stanie zaatakować awkw jakiś sposób. W końcu jest to pełny tłumacz języka programowania.

Kiedy się uruchamia sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}', faktycznie działa, sudo /usr/bin/apt-get --print-uris -qq -y upgradea następnie przesyła / przekierowuje jako użytkownik wywołujący.

Spróbuj tego: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

Nawiasem mówiąc, nie ma nic złego w umieszczeniu tego w skrypcie, tak jak robi to Lain, i nadal możesz to zrobić. Po prostu unikałbym uruchamiania awk jako root, jeśli to możliwe.

użytkownik606723
źródło
1
Masz rację, ale jeśli skrypt jest niepewny, nie ma znaczenia, co w nim jest, można go zastąpić, a świat jest Twoją ostrygą. Jeśli skrypt jest bezpieczny, to co jest w nim bezpieczne.
user9517
25

Prawdopodobnie nie zgadzasz się ze sposobem, w jaki przekierowanie współdziała z sudo. Przekierowanie jest wykonywane u użytkownika wywołującego, a nie użytkownika uprzywilejowanego. Prawdopodobnie łatwiej byłoby ci zawinąć polecenie w skrypt, a następnie pozwolić użytkownikowi zabbix na uruchomienie tego skryptu, np

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

set sudoers as

zabbix  ALL=NOPASSWD: /path/to/script

Teraz cały skrypt będzie uruchamiany jako uprzywilejowany użytkownik, a nie tylko konkretne polecenie apt-get. Upewnij się jednak, że użytkownik zabbix nie może pisać do skryptu.

użytkownik9517
źródło
1
Ktoś prawdopodobnie może mnie poprawić, jeśli sudo już się tym zajmuje (wydaje mi się, że mam problemy z nieprzekazywaniem zmiennych env), ale sugerowałbym, aby awk i wc miały swoje pełne ścieżki jako ogólną najlepszą praktykę dla skryptów, aby użytkownik mógł wyeksportuj ŚCIEŻKĘ ~ ~ użytkownik / bin: $ ŚCIEŻKA i umieść dowolne polecenia w skrypcie o nazwie awk (lub wc) w ~ użytkownik / bin
Foon
@Foon: Myślę, że mylisz sudo z cronem.
user9517
1
Nie jest to mylące, ale superuser.com/questions/232231/... wskazuje, że sudo zapobiega manipulowaniu PATH (i domyślnie LD_LIBARRAY_PATH)
Foon
Zrobiłem coś podobnego, tylko pomyślałem o skrypcie wywołującym i zapisałem go tylko jako root. Sprawdź, czy działa dla użytkownika z uprawnieniami 711, a następnie nie może nawet zobaczyć, co robi, aby go obejść.
Chris K