2012-07-24 20 views
6

Mam "proste" pytanie: Jak mogę bezpiecznie zmienić hasło użytkownika z poziomu skryptu PHP, bez przyznawania uprawnień administratora Apache lub innych szalonych luk w zabezpieczeniach?Zmiana hasła użytkownika Linuksa ze skryptu PHP

Tło: CentOS 6, Apache 2.2.13, PHP 5.3.3

Jestem świadomy polecenia pam_chpasswd(), która jest częścią biblioteki PECL PAM. Jednak ta funkcja nie działa, chyba że proces hosta (httpd) odczytał dostęp do pliku/etc/shadow. (NIEPOPRAWNA POMYSŁ! Nie wiem, jak ta biblioteka pomaga, jeśli wymaga tak wysokich uprawnień ...)

Idealną sytuacją, o ile widzę, jest wywołanie skryptu powłoki za pomocą "sudo -u [nazwa użytkownika użytkownika zmieniającego jego hasło] ' Spowoduje to uruchomienie skryptu "AS" użytkownika, więc powinien mieć pozwolenie na zmianę własnego hasła. A sudo wymagałoby, aby użytkownik wysłał swoje dotychczasowe hasło w celu uwierzytelnienia, co uniemożliwiłoby jednemu użytkownikowi zmianę hasła innego użytkownika.

Ale to nie działa z jakiegoś powodu ... podczas otwierania procesu z popenem proces ten nigdy nie jest wykonywany. Mam ustawiony skrypt powłoki, aby zrzucić jakiś tekst do publicznie zapisywalnego pliku w/tmp. Ale nigdy nie dociera do tego punktu.

$cmd = "/usr/bin/sudo -S -u$username /file_to_execute.sh"; 
$handle = popen ($cmd, "w"); // Open the process for writing 
fwrite ($handle, "$current_password\n"); // Send the user's current password to sudo (-S option) 
fwrite .... (write the username, current password, and new password, so the script can change it) 
$result = pclose($handle); 

Gdybym dostęp Ten skrypt PHP (http: //server/script.php), funkcja natychmiast kończy się niepowodzeniem i $ wynik = 1

Gdybym zmodyfikować plik sudoers (visudo) i dodać linia:
$ domyślne: requiretty apache

skrypt zamarza na około 10 sekund, po czym nie powiedzie się ($ wynik = 1)

Wszelkie sugestie dotyczące robi to są bardzo mile widziane!

+0

Każda z tych prac? http://stackoverflow.com/questions/127459/using-shell-execpasswd-to-change-a-users-password?rq=1 – Aknosis

Odpowiedz

0

Bardziej bezpieczny sposób to zrobić, aby zapisać nazwę użytkownika i hasło w pliku w specjalnym katalogu i pozwól cron wykonać zadanie (raz na minutę)

+0

Dziękuję za odpowiedź. Jednakże powoduje to 2 problemy: 1) Użytkownik nie może uzyskać natychmiastowej odpowiedzi na pytanie, czy jego hasło zostało zmienione. 2) Istniejące hasło użytkownika nie jest zweryfikowane. Wygląda na to, że może nie być zbyt bezpieczne.Chcę, aby użytkownik musiał podać swoje dotychczasowe hasło w celu zmiany hasła. Zapobiega to wszelkiemu włamywaniu się przez jednego użytkownika, aby zmienić hasło innego użytkownika. –

2

Aby osiągnąć powyższe z myślą o bezpieczeństwie, chciałbym zasugeruj użycie expect lub dodanie użytkownika Apche do grupy, która ma prawa zapisu do wspomnianego pliku i tylko do wspomnianego pliku.

Zgodnie z oczekiwaniem, musisz podać swoje hasło sudo, ponieważ będzie ono nasłuchiwało odpowiedzi z systemu operacyjnego Password:, a gdy jest widoczne, automatycznie odpowiada za pomocą hasła sudo. Umożliwi to połączenie shell_exec() i rodziny z expect, aby osiągnąć swoje wyniki.

Poszedłem drugą drogą bezpieczeństwa, która wykorzystałaby uprawnienia grupy do zapisu w pliku dla grupy, która ma tylko prawo zapisu do tego pliku.

przykład:

groupadd secure_apache 
usermod -G secure_apache apache_user 
chown owner:secure_apache /tmp/file_to_change 
chmod 740 /tmp/file_to_change 
+0

Czy numer 2 będzie działać w środowisku wielu użytkowników? np. kilku użytkowników próbuje jednocześnie zmienić swoje hasła? Zakładam, że każda prośba o zmianę hasła musiałaby utworzyć plik o losowej nazwie, aby zapobiec przechodzeniu na siebie nawzajem podczas procesu ...? –

+0

Myślę, że opcja "oczekiwać" może być moim najlepszym wyborem ... –

+1

Jeśli wybierzesz drugą opcję, możesz zaimplementować 'flock()', aby zablokować plik, gdy pierwszy użytkownik spróbuje. Jeśli są one zakończone, usuń 'flock()', a pozostali użytkownicy mogą przejść. Przynajmniej inni użytkownicy otrzymają komunikat o błędzie z informacją, że nie można tego zrobić. –

Powiązane problemy