Skrypt PHP nie może uruchomić skryptu bash. sh: Odmowa zezwolenia

14

Próbuję wykonać skrypt .sh z PHP, jednak nie działa.

Sprawdziłem dzienniki błędów i pojawia się błąd „sh: Odmowa dostępu”. Sprawdziłem, który użytkownik php jest uruchamiany, i zrobiłem to pod użytkownikiem apache.

Próbowałem zmienić własność .sh na użytkownika apache, ale nie ma rezultatu.

Na początku myślałem, że dzieje się tak, ponieważ skrypt znajduje się poza www / dir, jednak nawet gdy umieszczę skrypt w tym samym katalogu, błąd nadal występuje.

Czy są na to inne rozwiązania niż dodanie użytkownika apache do listy SUDOers?

Skrypt sh działa poprawnie, jeśli uruchomię go za pomocą komendy „php filename.php”.

Robin Presto
źródło
3
Czy to skrypt powłoki czy plik PHP? W ostatnim akapicie nie ma jasności na ten temat. Czy ustawiłeś uprawnienia do wykonywania ( x) dla pliku? Czy podałeś interpreter skryptów w linii shebang?
Daniel Beck
Jest to skrypt bash uruchamiany z PHP. Tak, zrobiłem z niego plik wykonywalny i określiłem interpretera skryptów. Działa poprawnie, gdy wykonuję skrypt PHP z putty, a skrypt bash zostaje wywołany i działa poprawnie. Ale jeśli uruchomię skrypt php z przeglądarki internetowej, to nie uruchomi on skryptu bash i zrobi ten błąd, ponieważ działa jako użytkownik apache, a nie użytkownik, którego używam w putty.
Robin Presto
1
Spróbować chmod 775 yourscript.sh. To da r-x(odczyt i wykonanie) uprawnienia „innym” użytkownikom tego pliku.
Rhyuk
Próbowałem tego. Nie mam szczęścia ... Nie znam dokładnego powodu do jutra. Nie mam dostępu do dzienników z mojej lokalizacji. Wrócę do was. Dziękuję za pomoc :)
Robin Presto

Odpowiedzi:

10

Wypróbuj następujące sugestie:

  • Spróbuj uruchomić poniżej polecenia testowego i sprawdź, czy zadziałało:
    • php -r "echo exec('whoami');"
  • Upewnij się, że wszystkie katalogi nadrzędne i pliki mają co najmniej r-xuprawnienia do oznaczania:
    • chmod 755 dir; chmod 755 file
  • Upewnij się, że właścicielem pliku jest użytkownik Apache .
    • Spróbuj także dodać +sflagę (sudo) do pliku (niezalecane):
      • chmod u+s file,
  • Upewnij się, że Twój PHP nie działa w safe_mode.
  • Upewnij się, że skrypt znajduje się w katalogu głównym Apache:
    • W przeciwnym razie przenieś skrypt do niego,
    • lub dodaj ten katalog do konfiguracji Apache,
    • lub dodaj ten katalog do include_path, np .:
      • php.ini plik: include_path ".:/usr/local/lib/php:/your/dir"
      • lub .htaccessplik:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Sprawdź, czy twoja powłoka jest ustawiona na prawidłową (np. /bin/sh) Dla użytkownika Apache (np. Sprawdź za pomocą finger:).
  • Upewnij się, że twój php.ininie używa: disable_functionsdo execfunkcji
  • Jeśli używasz SELinuksa lub selinux-utilszainstalowałeś (system Linux z ulepszonymi zabezpieczeniami), sprawdź getenforce/ setenforceskonfiguruj zgodnie z opisem w odpowiedzi @Tonin .

Rozwiązywanie problemów:

  • Jeśli zmieniłeś plik php.inilub httpd.confplik, nie zapomnij zrestartować serwera WWW,
  • Sprawdź dziennik błędów Apache, aby uzyskać dodatkowe informacje.
  • Włączyć w php.iniwszelkiego rodzaju błędów ( display_error, error_reportingetc.).
kenorb
źródło
1
To był mój problem .. katalog nadrzędny nie miał uprawnień do wykonywania ... teraz działa! Dziękuję Ci! :)
Robin Presto
Nadal nie mam szczęścia :( Wszelkie sugestie? `` [Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ ścieżka_włączenia = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 root root 4096 3 września 12:31 / drwxrwxrwt. 4 root root 4096 3 września 15:45 / tmp -rwxr-xr-x. 1 root root 24 września 3 15:39 / tmp / sleep safe_mode = Wył. Include_path = "/ tmp: / home / kiwi_build" ``
pihentagy
1
Argh, setenforce rozwiązał to. OMG
pihentagy,
13

Taki problem może zależeć od używanego systemu operacyjnego i jego konfiguracji. Niektóre dystrybucje linuksowe (głównie oparte na RHEL, takie jak CentOS lub Fedora) są domyślnie włączone z SELinux. Można to sprawdzić i tymczasowo zmienić za pomocą następujących poleceń:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Możesz także uzyskać pełniejszy widok bieżącej konfiguracji dzięki:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Zmianę można wprowadzić na stałe, edytując /etc/selinux/configplik i ustawiając SELINUXzmienną na permissivelub disabled.

Ale poprawnym sposobem rozwiązania tego rodzaju problemu , jeśli rzeczywiście jesteś w takiej sytuacji, jest sprawdzenie /var/log/audit/audit.logpliku dziennika. Będzie zawierał wszystkie zdarzenia związane z regułami SELinux. Prawdopodobnie wtedy powinieneś nadać skryptowi właściwy kontekst, tzn. Mieć uprawnienia do uruchamiania przez użytkownika apache / php. Sprawdzanie kontekstu bezpieczeństwa SELinux odbywa się za pomocą ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Lista zawiera użytkownika, rolę i typ każdego pliku / katalogu. Tutaj httpd_sys_script_exec_ttyp daje plikom w katalogu cgi pozwolenie na wykonanie przez httpd. Twój skrypt powłoki powinien prawdopodobnie mieć ten sam typ.

Możesz także wprowadzić audit.loglinie do audit2allowpolecenia. Zaowocuje to zmianami potrzebnymi do uszczęśliwienia SELinux. Ale zwykle sugerowane zmiany należy wprowadzić w samej polityce SELinuksa, co nie jest tym, co powinieneś zrobić w twoim przypadku (nadal, ten wynik może dać pewną wskazówkę, co się dzieje).

Poniższa strona opisuje podobny problem i różne sposoby jego rozwiązania: http://sheltren.com/stop-disablowanie-selinux

Tonin
źródło
Dziękuję za szczegółową odpowiedź! Niestety, jak wspomniałem, nie mogę mieć dostępu do roota do jutra. Wrócę też do ciebie! :) I tak, używam CentOS.
Robin Presto
Bardzo podobała mi się twoja odpowiedź, bardzo pouczająca! Niestety nie wybrałem twojego, ponieważ egzekwowanie zostało wyłączone i nie stanowiło problemu. Chociaż nauczyłem się wiele z twojej odpowiedzi, więc dziękuję. Głosuję za tobą, gdy zdobędę wystarczającą reputację :)
Robin Presto
Bez obaw, cieszę się, że dowiedziałeś się z mojego postu!
Tonin,
Jeśli problemem jest getenforced, to tak naprawdę nie jest oczywiste, co się do cholery dzieje. Uratowało mi to dzień!
pihentagy
1

Dotarłem tutaj po poszukiwaniu podobnego problemu w Google. Pomyślałem, że porzucę komentarz na temat SELinuksa, który skierował mnie w dobrym kierunku.

W moim przypadku korzystałem z niestandardowego skryptu wdrażania Git, który używa polecenia powłoki. Polecenie działa dobrze w BASH, ale ma wtedy „odmowę dostępu” i „nie repozytorium” w Git. To było naprawdę dziwne i przeszedłem wiele poprawek, dopóki nie natknąłem się na tę odpowiedź.

root@ls:~# /usr/sbin/setenforce Permissive rozwiązał problem dla mnie.

Bade Adesemowo
źródło
0

Moja sytuacja jest nieco inna, ale Google mnie tu przywiodło, więc pomyślałem, że podzielę się ...

Mój serwer ma stabilną wersję Debiana i próbuję uruchomić skrypt powłoki, zadziałał raz, uprawnienia automatycznie zmieniły się na 644 i otrzymano kolejną próbę uruchomienia skryptu Permission denied. Okazało się to dla mnie problemem z serwerem samby i do tej pory nie zauważyłem tego wzoru.

Poprawką było dziwne zmiany uprawnień QA podczas zapisywania pliku na partycji Samba z edytora Windows . Nie wiedziałem o tej map archive = noopcji nawet po dziesięciu latach korzystania z akcji samby.

Coś w używaniu Notepad ++ na pulpicie systemu Windows zmieniłoby uprawnienia plików docelowych na 675 zamiast 775, gdy skonfigurowano umask.

Chris K.
źródło
-7

Uruchamianie poleceń roota w PHP przez Apache

Mam aplikację internetową, która musi wykonywać polecenia powłoki jako root w funkcji PHP, i można by pomyśleć, że byłoby to całkiem proste… ale zajęło mi kilka googli, aby uzyskać wszystkie szczegóły, więc oto moje przydatne notatki na temat to. To działa na systemie Linux z Apache i będziemy używać „sudo” w „shell_exec” do uruchamiania poleceń.

Najważniejsze jest edytowanie pliku / etc / sudoers i zazwyczaj możesz (jako root) użyć do tego polecenia „visudo”.

Upewnij się, że apache może uruchamiać polecenia ORAZ nie wymaga hasła:

apache  ALL=(ALL)       NOPASSWD: ALL

Następnie musisz skomentować ten wiersz:

#Defaults    requiretty

Jeśli tego nie zrobisz, zobaczysz te błędy w / var / log / secure: „przepraszam, musisz mieć tty, aby uruchomić sudo”. Teraz jesteś gotowy do pracy, a kod PHP jest prosty:

$ results = shell_exec („data sudo”);

متعب المغيري
źródło
5
To okropny pomysł. Jeśli twoja instalacja apache zostanie naruszona lub uruchomiona aplikacja nie zrobi tego ... Twój haker uzyska zbyt łatwy dostęp do systemu. Właściwą rzeczą jest zmiana uprawnień do skryptu, a nie pozostawianie rzeczy szeroko otwartych
Journeyman Geek
2
Czuję się zobowiązany do wydania negatywnej opinii na temat tej odpowiedzi ze względu na oczywiste obawy dotyczące bezpieczeństwa związane z udzieleniem użytkownikowi / roli apache wszystkich uprawnień.
Ramhound
@JourneymanGeek To nie jest „jeśli”, ale wtedy , gdy instalacja zostaje naruszona.
Michael Hampton