Dlaczego cron po cichu nie uruchamia sudo w moim skrypcie?

29

Mam skrypt uruchamiany z crontab użytkownika nieuprzywilejowanego, który wywołuje niektóre polecenia za pomocą sudo. Tyle że nie. Skrypt działa dobrze, ale polecenia sudo'ed po cichu zawodzą.

  • Skrypt działa idealnie z powłoki jako dany użytkownik.

  • Sudo nie wymaga hasła. Użytkownik, o którym mowa, ma (root) NOPASSWD: ALLdostęp przyznany w /etc/sudoers.

  • Cron jest uruchomiony i wykonuje skrypt. Dodanie prostego date > /tmp/loggeneruje dane wyjściowe we właściwym czasie.

  • To nie jest problem z uprawnieniami. Ponownie skrypt jest wykonywany, tylko nie sudo'ed polecenia.

  • To nie jest problem ze ścieżką. Uruchomienie envz poziomu uruchamianego skryptu pokazuje poprawną $PATHzmienną, która zawiera ścieżkę do sudo. Uruchamianie go przy użyciu pełnej ścieżki nie pomaga. Wykonywane polecenie otrzymuje pełną nazwę ścieżki.

  • Próba przechwycenia danych wyjściowych polecenia sudo, w tym STDERR, nie pokazuje niczego przydatnego. Dodanie sudo echo test 2>&1 > /tmp/logdo skryptu powoduje utworzenie pustego dziennika.

  • Sam plik binarny sudo działa poprawnie i rozpoznaje, że ma uprawnienia, nawet gdy jest uruchamiany z crona wewnątrz skryptu. Dodanie sudo -l > /tmp/logdo skryptu tworzy wynik:

    Użytkownik ec2-user może uruchomić następujące polecenia na tym hoście:
    (root) NOPASSWD: ALL

Analiza kodu wyjścia polecenia za pomocą $?pokazuje, że zwraca błąd (kod wyjścia:) 1, ale wydaje się, że nie wystąpił żaden błąd. Polecenie tak proste, jak /usr/bin/sudo /bin/echo testzwraca ten sam kod błędu.

Co jeszcze może się dziać?

Jest to niedawno utworzona maszyna wirtualna z najnowszą wersją AMI Amazon Linux. Plik crontab należy do użytkownika, ec2-usera plik sudoers jest domyślną dystrybucją.

Caleb
źródło
1
Chciałem porozmawiać o rozwiązaniu, ale potem przeczytałem, The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoersa mój mózg zaczął krzyczeć zbyt głośno, by móc dalej czytać.
Shadur,
@Shadur: Porozmawiaj z ręką. To też nie jest mój sposób konfigurowania maszyny, ale te maszyny są tak gotowe. Nawet przez maszynę jest twoje, nie dostajesz hasła roota, twój klucz jako właściciel skrzynki przechodzi na konto użytkownika ec2, które ma (jak wspomniano) pełny dostęp do sudo. Nie dostajesz hasła dla użytkownika ec2, chyba że je ustawisz, to tylko login.
Caleb
1
Następnie pierwszą rzeczą, którą zalecam, jest skonfigurowanie osobnego użytkownika z ograniczonymi sudoprawami / tylko / dla poleceń potrzebnych w skrypcie i całkowite wyłączenie jego możliwości logowania.
Shadur
jeśli masz root i chcesz, aby zadanie cron działało jako root, to po co umieszczać je w crontab użytkownika ec2? czy crontab roota nie byłby bardziej odpowiedni? lub / etc / crontab?
cas
@CraigSanders: Nie chcę, aby zadanie cron było uruchamiane jako root, w rzeczywistości większość z nich powinna być uruchamiana jako użytkownik. Pytanie nie dotyczy uruchomienia zadania jako root, ale skryptu mającego specjalny dostęp do jednej funkcji przez sudo.
Caleb

Odpowiedzi:

39

Sudo ma kilka specjalnych opcji w swoim pliku uprawnień, z których jedna pozwala ograniczyć jego użycie do powłok działających w TTY, co nie jest cronem.

Niektóre dystrybucje, w tym Amazon Linux AMI, mają tę opcję domyślnie włączoną. /etc/sudoersPlik będzie wyglądać mniej więcej tak:

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

Gdybyś przechwycił dane wyjściowe do STDERR na poziomie skryptu powłoki, a nie samej komendy sudo, wyglądałbyś na taki komunikat:

przepraszam, musisz mieć tty, aby uruchomić sudo

Rozwiązaniem jest umożliwienie działania sudo w środowiskach innych niż TTY poprzez usunięcie lub skomentowanie tych opcji:

#Defaults    requiretty
#Defaults   !visiblepw
Caleb
źródło
Mogę potwierdzić, że CentOS ma te ograniczenia.
aeu