2012-07-24 23 views
6

"Basit" bir sorum var: Apache root ayrıcalıkları vermeden ya da diğer çılgın güvenlik açıklarını vermeden bir PHP betiğinden bir kullanıcının parolasını güvenli bir şekilde nasıl değiştirebilirim?Linux'u değiştirin PHP betiğinden kullanıcı parolası

Geçmiş: CentOS 6, Apache 2.2.13 PHP 5.3.3

Ben PECL PAM kitaplığının parçası olan pam_chpasswd() komutu, farkındayım. Ancak, ana makine işlemi (httpd)/etc/shadow dosyasına erişimi okumadığı sürece bu işlev başarısız olur. (KÖTÜ IDEA! Bu kütüphanenin bu kadar yüksek ayrıcalık gerektiriyorsa nasıl yardımcı olabileceğinden emin değil misiniz ...)

Görebildiğim kadarıyla, 'sudo -u [username ile PHP'nin kabuk betiğini çağırması ideal bir durumdur. kullanıcının parolasını değiştirmesi] ' Bu kullanıcı "AS" betiğini çalıştıracak, böylece kendi parolasını değiştirme iznine sahip olmalıdır. Ve sudo, kullanıcının kimlik doğrulaması için mevcut şifresini göndermesini ve böylece bir kullanıcının başka bir kullanıcının şifresini değiştirmesini engellemesini gerektirecektir.

Ama bu bir sebepten ötürü işe yaramaz ... işlemi, popen ile açarken, işlem asla yürütülmez. Bazı metinleri/tmp içindeki herkese açık yazılabilir bir dosyaya dökmek için kurulmuş kabuk komut dosyası var. Ama asla bu noktaya ulaşmaz.

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

bu php komut dosyası erişmek (http: //server/script.php), işlev hemen başarısız olur ve $ sonuç = 1

Ben Sudoers dosyası (visudo) değiştirmek ve varsa eklemek bir satır:
$ Varsayılan:

komut yaklaşık 10 saniye boyunca donar apache requiretty sonra başarısız ($ sonuç = 1) bu iş için

Herhangi bir öneri büyük takdir!

+0

bu işin Herhangi? http://stackoverflow.com/questions/127459/using-shell-execpasswd-to-change-a-users-password?rq=1 – Aknosis

cevap

0

Bunu yapmanın daha güvenli bir yolu Yapardım güvenlik göz önünde bulundurularak yukarıda ulaşmak için yapmak

+0

Cevabınız için teşekkür ederiz. Bununla birlikte, bu 2 problemi ortaya çıkarır: 1) Kullanıcı şifresinin değişip değişmediğine dair anında geri bildirim alamaz. 2) Kullanıcının mevcut şifresi doğrulanmadı. Bu, çok güvenli olmayabilir gibi görünüyor.Parolayı değiştirmek için kullanıcının mevcut parolasını vermesini istiyorum. Bu, bir kullanıcının başka bir kullanıcının şifresini değiştirmesi için herhangi bir tür kaçırmayı önler. –

2

(kez dakikası) iş cron'u özel dizinde bir dosyada adı ve şifrenizi saklamak ve izin vermektir expect kullanımını veya Apche kullanıcısını söz konusu dosyaya ve sadece söz konusu dosyaya yazma erişimine sahip bir gruba eklemeyi önerir. Ile

o Password: ait OS yanıt için dinlemeye sunduğundan sudo şifresini eklenmesi gerekmektedir, bekliyoruz ve görülen zaman, otomatik olarak sudo şifre ile cevap verir. Bu, sonuçlarınızı elde etmek için shell_exec()'u ve expect numaralı aileyi oluşturmanıza olanak tanır.

Güvenlik için ikinci rotaya gidersem, bu gruba yalnızca bu dosyaya yazma erişimi olan bir gruba yazmak için grup izni kullanırdım.

Örnek:

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 çok kullanıcılı bir ortamda çalışacak mı? Yani birkaç kullanıcı şifrelerini aynı anda değiştirmeyi dener mi? Her şifre değiştirme isteğinin, kullanıcıların işlem sırasında birbirlerine adım atmasını önlemek için rastgele adlandırılmış bir dosya oluşturmak zorunda kalacağını varsayıyorum ...? –

+0

"Beklenti" seçeneği en iyi bahis olabilirim diye düşünüyorum ... –

+1

İkinci seçenekle devam ederseniz, ilk kullanıcı çalıştığında dosyayı kilitlemek için 'flock()' uygulayabilirsiniz. Tamamlandığında, 'flock()' öğesini kaldırın ve diğer kullanıcılar gidebilir. Atleast diğer kullanıcılar şu anda yapamayan bir hata alacak. –

İlgili konular