2012-07-24 69 views
6

我有一個「簡單」問題:如何在不授予Apache root特權或引入其他瘋狂安全漏洞的情況下如何從PHP腳本中安全更改用戶密碼?從PHP腳本更改Linux用戶密碼

背景: CentOS 6的,阿帕奇2.2.13,PHP 5.3.3

我知道的pam_chpasswd()命令,該命令是PECL PAM庫的一部分的。但是,除非主機進程(httpd)具有對/ etc/shadow文件的讀取權限,否則此功能將失敗。 (不好意思!不知道這個庫如果需要這麼高的權限,它如何提供幫助......)

據我所見,理想情況是讓PHP調用一個shell腳本,其中包含'sudo -u [username用戶更改密碼]' 這將運行腳本「AS」用戶,所以他應該有權限更改自己的密碼。並且sudo會要求用戶發送他的現有密碼以進行身份​​驗證,從而防止一個用戶更改另一個用戶的密碼。

但由於某些原因,這不起作用......當用popen打開進程時,進程從不執行。我將shell腳本設置爲將一些文本轉儲到/ tmp中的可公開寫入的文件中。但它從來沒有達到這一點。

$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); 

如果我訪問此PHP腳本(HTTP://server/script.php),該函數立即失敗,和$結果= 1

如果我修改sudoers文件(visudo命令),並添加行:
$默認值:阿帕奇requiretty

腳本凍結約10秒鐘,然後失敗($結果= 1)

這樣做的任何建議都非常感謝!

+0

任何這些工作? http://stackoverflow.com/questions/127459/using-shell-execpasswd-to-change-a-users-password?rq=1 – Aknosis 2012-07-24 16:34:38

回答

0

做到這一點更安全的方法是在文件中存儲的用戶名和密碼,在一個特殊的目錄,讓cron的做(每分鐘一次)

+0

感謝您的回答。但是,這會引入兩個問題: 1)用戶無法立即獲得有關他的密碼是否已更改的反饋。 2)用戶的現有密碼未驗證。 看起來像這樣可能不太安全。我希望用戶被要求提供他現有的密碼以更改密碼。這可以防止一個用戶的任何類型的劫持更改另一個用戶的密碼。 – 2012-07-24 16:33:35

2

工作要考慮到安全問題實現上述目標,我會建議使用expect或將Apche用戶添加到對所述文件和只有所述文件具有寫入權限的組。

有了希望,你將需要包括你的sudo密碼,因爲它會偵聽從Password:操作系統的響應,並可見時,自動與sudo密碼回覆。這將允許你與和家人expect合作,以實現你的結果。

我會去安全的第二條路線,這將使用組權限寫入文件的只有該文件的寫入權限的組。

例子:

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

#2會在多用戶環境中工作嗎?即多個用戶嘗試同時更改密碼?我假設每個密碼更改請求都必須創建一個隨機命名的文件,以防止用戶在此過程中彼此踩踏...? – 2012-07-24 17:59:48

+0

我在想「預期」選項可能是我最好的選擇...... – 2012-07-24 18:00:14

+1

如果你選擇第二個選項,你可以在第一個用戶嘗試時實現一個'flock()'來鎖定文件。當它們完成時,移除'flock()',其他用戶可以去。至少其他用戶在此時會收到錯誤,表示無法使用。 – 2012-07-24 18:02:10