PHP web sunucularını güvenli hale getirme


31

PHP uygulamaları ortalama güvenlik sorunlarından daha yüksek bir üne sahiptir. Uygulamanın olabildiğince güvenli olduğundan emin olmak için hangi yapılandırma tekniklerini kullanıyorsunuz?

Gibi fikirler arıyorum:

Normalde Linux kullanıyorum, ancak Windows çözümleri önermekte de özgürüm.

Yanıtlar:


15
  1. PHP betiklerinizi kendi giriş dizinleri ve nihai uygulama dizinleri ile sınırlandırmak için open_basedir yönergesini kullanın. Bu kendi başına çok verimli.

  2. Sertleştirilmiş php kullanın çünkü bu hiçbir ücrete tabi değildir ve yardımcı olabilir.

  3. PHP komut dosyalarının dosyanın sahibi olarak çalıştırılmasını sağlamak için suPHP kullanın (web sitesi başına bir kullanıcı) ve 777 gibi kötü izinlere sahip dosyaları kullanmaktan kaçının ... suPHP ayrıca web sitesinin başına php.ini almanıza izin verebilir gereksinim her şeyi mahvetme.

  4. Mod_security büyük bir artıdır ancak iyi kullanılması ve yapılandırılması gerekir.


Bazı kötü siteler aslında register_globals ve fopen'e ihtiyaç duyuyor, bu yüzden suPHP olan her site için bir php.ini kullanıyorsunuz. Bir site sadece kamikaze'ye gidebilir, diğerleri ise (neredeyse) tamamen güvenli olabilirler.
Antoine Benkemoun

4
Register_globals ve fopen kullanıyorlarsa, kaliteyi o kadar kötü
bulduğunu gösterir.

150 € / ay ödüyorlarsa, yeniden düşünmezsiniz.
Antoine Benkemoun

3

Deneyimlerime göre, PHP tabanlı bir web sitesindeki güvenlik açıklarının çoğu, PHP'nin kendisindeki kusurlardan ziyade zayıf (site) tasarımların sonucudur.

Bazı hızlı ipuçları:

  • Evrensel olarak filtre girişi, kaçış çıkışı. Clarificaiton: filtre kaçış anlamına gelmiyor, "bu kullanıcı girdisinde balıklı bir şey bulursam, gönderimin başarısız olmasına neden olur ve kullanıcıya yeniden biçimlendirmesini söyler" anlamına gelir.
  • Escapeshellcmd () kullanmak yerine , kabukta herhangi bir kullanıcı girişinin yürütülmesine izin vermeyin . Bu tehlikeli ve muhtemelen hiç gerekli değil.
  • Etmeyin üretim sitesinde phpinfo gibi işlevleri () çağrısı (bunu yaparsanız veya, * aşağıya bakınız).
  • Bir web uygulaması tasarlarken her zaman "Bu olası bir saldırı vektörü mü?" Diyelim ki, SQL enjeksiyonu. Cevap "evet" ise, hemen takın - "tamam, bunu daha sonra bir özellik olarak geliştireceğim" deme. Güvenlik asla bir özellik değildir.
  • Asla ham hataları kullanıcıya vermeyin ; Bu, php.ini 'nin display_errors = Off, log_errors = On ayarlarının yapılması demektir. Çalışma zamanı hatalarını yakalayın ve güzel bir şey çıktı alın. Twitter'ın balinasını örnek olarak alın: kullanıcıya hata ayıklama düzeyinde bilgi vermez, sadece "sersemler, kırılan bir şey, lütfen yenileyin" diyor.

* "Phpinfo'yu () güvenli hale getirme" şeklinde yazdığım kısa bir yazıya bir göz atabilir ve http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ Bir üretim sitesinde kaldırmayı unutmuş olsaydım, phpinfo () 'yu korumak zorunda kalmam çok hızlı bir fikirdi.

Daha genel bir şekilde, bazı geliştiriciler, "üretim alanı" bayrağının ayarlanıp ayarlanmadığını kontrol eden ve üretimdeki hassas işlevi devre dışı bırakan hassas işlevler için sarmalayıcılar yazar.


Benim sorum, sunucunuzu kötü yazılmış PHP'lere karşı nasıl koruyacağınız hakkındaydı. :) PHP'nin kendisinin güvensiz olması, daha az deneyimli geliştiricilerin ilgisini çekmesi ve standart kütüphanenin, tüm kullanıcıları koruyan kütüphaneden ziyade her çağrıyı korumasını hatırlamalarını gerektirdiği anlamına gelmiyordu. +1 çok yararlı bir cevap.
David Pashley

Bu izlenim var ve buna göre cevap :) :) Yorumunuz için teşekkürler! Bunların hepsine burada giremem, belli ki, ama bunlar büyük çukurlar. Daha spesifik sorularınız varsa, bunları kesinlikle Stack Overflow'a yönlendirebilirsiniz; ben ve başkaları katkıda bulunacağız. (Ve buna değer, ben bir ZCE).
msanford

3

PHP'yi sertleştirmek için değiştirilmesi gereken diğer parametreler:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

Tüm PHP hatalarını /var/log/phperror.log dosyasında saklayın :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log

1

Dotdeb veri havuzlarını /etc/apt/sources.lst adresime ekledim

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Yamaları php / apache / mysql'i Debian'dan daha sık yamalar.


1

open_basedir"Site başına" olarak ayarlamayı düşünün . open_basedirkomut dosyalarınızın tanımlanmış bir beyaz listenin dışındaki dosyalara erişmesini engelleyen bir php.ini ayarıdır. Sunucunuz birkaç site barındırıyorsa, bir sitenin başka bir siteden veritabanı ayarlarını okumasını önleyecektir. Ayrıca bir php betiğinin çekirdek sistem dosyalarına erişmesini / değiştirmesini önler. Açık basedir kurulumu kolaydır, php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/listher Apache vhost'a " " satırı ekleyin .

Ayrıca, PHP betiği içermemesi gereken tüm siteler / klasörler için PHP betiği motorunu kapatmayı düşünün (örn. Yüklenen bir görüntüler klasörü). Yine, bu basittir, php gerektirmeyen Apache VirtualHosts'a "php_admin_value engine off" komutunu ekleyin. PHP'yi bir dizinde devre dışı bırakmak için aynı şeyi bir Directory etiketine yerleştirin.

Dosya izinlerini olabildiğince sıkı çalıştırın, Apache kullanıcısı için PHP komut dosyalarına yazma erişiminden kaçının; bu, çalışan bir komut dosyasının kendisini veya aynı site / sunucudaki diğer komut dosyalarını değiştirmesini önler. Mümkünse, 777 izinlerinden kaçının, uygulamayı çalıştırmak ve kullanmak için gereken minimum izinleri belirleyin.

Her biri kendi veritabanına sahip birden fazla site barındırıyorsanız, her biri için ayrı bir MySQL / Postgres kullanıcısı kullanın ve her bir kullanıcı için yalnızca ilgili veritabanlarına erişebilecekleri izinleri ayarlayın. Yine, bu haydut bir komut dosyasının başka bir uygulamanın veritabanına müdahale etmesini önler.

Suosin, HardenedPHP, mod_security ve benzerlerinin hepsi de değerlidir, ancak bunları yerine değil, sıkıca kilitlenmiş bir yapılandırmaya ek olarak kullanın.


0

Suhosin oldukça önemli bir performans maliyetine sahip, bu yüzden "hiçbir şey maliyeti" yorumu biraz kapalı.


2
Hızlı, saldırıya uğramış bir web sitesi ne işe yarar? :) hardened-php.net/suhosin/benchmark.html bir kıyaslamada% 8.85 daha yavaş olduğunu gösteriyor. Bu sağladığı güvenlik yararları için kabul edilebilir olabilir. Bu muhtemelen bir cevaptan çok bir yorum olmalıydı.
David Pashley

Suhosin öncelikle yerel saldırılara karşı koruyor. Bu nedenle, sunucunuzu güvenmediğiniz kişilerle paylaşırsanız, yavaşlamaya değer olabilir. Kendi sunucunuz veya kendi vm diliminiz varsa, bu noktayı göremiyorum.

0

Bazı temel güvenlik duvarı / topoloji önerileri mi arıyorsunuz? Yıkanmamış internetler üzerinden doğrudan PHP web sunucusuna erişimi önlemek için pound gibi şeyler kullanma fikrini seviyorum . Bu şekilde, web sunucusunu ağınızın diğer bölümlerinden de ayırabilirsiniz.


Hayır, PHP çalışma zamanının güvenliğini arttırmanın yollarını arıyorum.
David Pashley

0

Suhosin / mod_security / SuPHP kullanmak kesinlikle PHP sunucunuzu güvenli hale getirecektir. Exec, paststhru, system ve escapeshellcmd gibi bazı işlevleri devre dışı bırakmak da size çok yardımcı olacaktır.


1
Escapeshellcmd () yalnızca dizeden kaçmak için kullanılmıyor mu? Bir işlem yürütmenin hiçbir yolu yoktur. Birisi bir soruna neden olmak için nasıl kullanabilir?
David Pashley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.