Bir Sayfa Seçin

Yakın zaman içinde eşimin işi için yeni kurmaya çalıştığım WordPress tabanlı web sitesi “hack”lendi. Siteye gayet bozuk bir İngilizce ile “Filistin bizim, Amerika yakında bizim bir kolonimiz olacak” şeklinde yazı bırakan şahıslar bir de arkafon müziği olarak bir Kur’an resitali yüklemişler.

Sitenin tüm içeriği tamamen diş hekimliği ile ilgili idi. O yüzden neden bu şahısların saldırısına uğradığını anlamak zor. Tahminim şu ki; yeni “hacker”lık öğrenen biri biraz antreman yapmak istemiş.

Ama bu tabi ki bir ders oldu. Site’nin ne kadarını kurtarabileceğime bile bakmadan, diğer sitelerim için ne önlem alabileceğimi araştırmaya başladım. Araştırdıkça fark ettim ki; alınabilecek çok kolay önlemleri bile es geçmişim.

Özellikle WordPress tabanlı siteler, WordPress’in popülerliğinin ve yaygınlığının bir dezavantajı olarak, daha sık saldırı hedefi olabiliyorlar. Eğer sizin de bir WordPress siteniz varsa güvenlik için aşağıdaki önlemleri almanızda fayda var.

Sık Yedek Alın

Eskilerin “Hırsıza kilit dayanmaz” diye bir lafı vardır. Özellikle de internet gibi bir ortamda hangi önlemi alırsanız alın, bir risk taşıdığınızı unutmamanız lazım. O yüzden alınacak ilk önlem sık sık yedek almak olmalı. WordPress’te bu işi otomatik olarak yapmaya yarayan eklentiler mevcut. (ör: WP-DB-Backup)

Güncellemeleri Sıkı Takip Edin

WordPress, kendi sürümü ve ilgili eklentilerin güncellemelerini kolaylıkla takip edebilmeniz için pek çok imkan sunuyor. Yayınlanan güncellemeleri kurma işini aksatmayın. Çünkü her güncelleme genelde bazı güvenlik açıkları için yamalar sunuyor.

 

Kuvvetli Bir Şifre Kullanın

Maalesef çoğumuz çok da kuvvetli olmayan, internetten hakkımızda toplanabilecek basit verilerle tahmin etmesi nispeten kolay şifreler kullanıyoruz. Hatta bu şifreleri genelde sitelere göre de farklılaştırmayıp pek çok yerde aynı şifreyi kullanıyoruz. Öncelikle, yönetim hesabı şifrenizin karakter zenginliğini ve uzunluğunu arttırıp şifrenizi daha kuvvetli yapın. Siteniz için kullandığınız şifreyi başka yerlerde kullanmayın. Veritabanı için ayrı bir kullanıcı adı tanımlayın ve farklı bir şifre kullanın.

Klasör ve Dosyalarınızın Erişim Yetkilerini Biraz Daha Kısıtlayın

WordPress sitenizin kalbi olan “wp-config.php” dosyasının erişim ayarlarını kontrol edin. İlk kurulumda bütün dosyalar için “everyone read” yetkisi veren chmod 644 veya 755 tanımlanır. “wp-config.php” için “everyone read”i kaldırın. Chmod 640 ya da 750 olmalı. Bunun dışında dosyanın bulunduğu klasördeki “.htaccess” dosyasına aşağıdaki satırları ekleyerek korumayı daha da arttırabilirsiniz.

<Files wp-config.php>
order allow,deny
deny from all
</Files>

Eğer WordPress siteniz web kök dizinine kurulu ise, yukarıdakilere alternatif önlem olarak “wp-config.php” dosyasını web kök dizininin altına taşıyabilirsiniz. Web kök dizini çoğu zaman “wwwroot” ya da “public_html” gibi adlarla adlandırılır. WordPress “wp-config.php” dosyasını kendi dizininde bulamadığında bir üst dizine bakar. Sunucuların web kök dizinlerinin altı web erişimine kapalı olduğu için, wp-config.php korunmuş olur.

Bunun dışında bütün klasörleriniz için chmod 755, dosyalarınız için de chmod 644 olmalı.

“wp-admin” klasörünüz için (mümkünse) sunucu tarafında şifre tanımlayın. Bunun için bir “.htaccess” dosyası yaratmanız gerekecek. (Bunu nasıl yapacağınızı öğrenmek için WordPress sitesine bakabilirsiniz. Ya da sunucunuzun kontrol paneline erişebiliyorsanız, oradan da bu işlemini yapabilirsiniz.)

Bu önlemin yaratacağı bazı sıkıntılar olabilir. Örneğin ajax kullanan eklentiler wp-admin içindeki “ajax.php” dosyasına erişemez. Eğer “wp-admin” kalsörü içindeki “.htaccess” dosyasının en altına aşağıdaki satırları eklerseniz bu sorunu da bertaraf etmiş olursunuz.

<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>

Eğer bbpress gibi WordPress fonksiyonlarını yoğun bir şekilde kullanan eklentileriniz varsa “.htaccess” dosyasına aşağıdaki ilaveleri de yaparak olası ufak tefek sorunları da giderebilirsiniz.

<FilesMatch async-upload.php>
Order Allow,Deny
Allow from all
Satisfy any
</FilesMatch>

<FilesMatch user.php>
Order Allow,Deny
Allow from all
Satisfy any
</FilesMatch>

<FilesMatch “\.(css|js|jpg|png|gif)$”>
Order Allow,Deny
Allow from all
Satisfy any
</FilesMatch>

Robot.txt Dosyasını Dikkatli Düzenleyin

Arama motorlarının sitenin alt klasörlerini de listelemesini engellemek için “robot.txt” dosyasına aşağıdaki satırları ekleyin:

User-agent: *
Disallow: /cgi-bin/
Disallow: /site-content/
Disallow: /wp-admin/
Disallow: /wp-includes/

Siteye Girişlerde SSL’i Etkinleştirin

WordPress uzunca bir süredir SSL ile kullanıcı/yönetici girişini destekliyor. Bu sayede giriş yaparken kullanıcı bilgileri internet üzerinden şifrelenerek gönderiliyor olacak. Eğer SSL’i destekleyen bir sunucunuz ve bir SSL sertifikanız varsa, WordPress’i de SSL’li yapmak için tek yapmanız gereken “wp-config.php” dosyasına aşağıdaki satırı eklemek:

# Sadece kullanıcı girişlerini SSL’li yapmak için:
define(‘FORCE_SSL_LOGIN’, true);

# Hem kullanıcı hem yönetici girişlerini SSL’li yapmak için:
define(‘FORCE_SSL_ADMIN’, true);

Güvenlik Eklentileri Kurun

WordPress eklenti havuzundan bulabileceğiniz bazı eklentiler şüpheli erişimleri tespit edip engelleme özelliğine sahip.

Ard arda gerçekleşen başarısız login girişimlerini bloke etmek için Login LockDown gibi bir eklenti kullanın. Bu eklenti aynı IP adresi üzerinden gerçekleştirilen başarısız girişimleri tanıyıp tüm erişimin belirli bir süre askıya alınmasını sağlıyor. WordPress Antivirus gibi eklentiler de belli başlı saldırı tiplerinin algılanıp önlenmesini sağlıyor.

Açıkçası, en çok tavsiye edeceğim eklenti yukarıdakilerden farklı. MuteScreamer eklentisi PHPIDS adlı PHP tabanlı saldırı tespit sistemini bazı ek özelliklerle WordPress’e entegre ediyor. L

Veritabanınızdaki Tablo Önadını Değiştirin

Pek çok “SQL Injection” saldırısının başarılı olmasının altında WordPress veritabanı mimarsinin biliniyor olması yatıyor. O yüzden kurulum esnasında ya da sonrasında veritabanı tablo adlarını değiştirin. Bunu yapan eklentiler mevcut ama açıkçası ben MySQL’den ve PHP’den anlayanlara elle (ne yaptığını bilerek) bu değişikliği yapmalarını tavsiye ederim.

Bu işlemi kabaca şöyle özetleyeyim:

  • Öncelikle veritabanınızın yedeğini alın ve tüm eklentileri etkisizleştirin.
  • “wp-config.php” dosyasındaki “$table_prefix” parameterisini değiştirin. “wp_” dışında gelişigüzel bir önad belirleyin. Yani:
    • $table_prefix=”yeni_onad_”
  • Daha sonra phpmyadmin üzerinden “RENAME TABLE … TO …” komutunu kullanarak bütün tabloların önadını değiştirin. Yani:
    • RENAME TABLE wp_commentmeta TO yeni_onad_commentmeta;
  • Son olarak birkaç tablodaki 1-2 parametreyi daha değiştirmeniz gerekecek.
    • “yeni_onad_options” tablosunu bulup içindeki “wp_user_roles” ifadesini “yeni_onad_user_roles” olarak değiştirin.
    • “yeni_onad_usermeta” tablosunu bulup içindeki “wp_user_level”, “wp_capabilities”, “wp_autosave_draft_ids” ifadelerini sırasıyla “yeni_onad_user_level”, “yeni_onad_capabilities”, “yeni_onad_autosave_draft_ids” olarak değiştirin.

Veritabanı Kullanıcısının Haklarını Kısıtlayın

Veritabanına ulaşan kullanıcının sadece “select, insert, delete, update, create, drop, alter” yetkilerinin olması yeterli. Diğer yetkileri budayın.

WordPress Kurulumunuzun Yapısını Değiştirin

“site-content” klasörünüzün yerini ve ismini de değiştirmeniz mümkün. Her ne kadar bu değişiklik bazı eklentilerde (kötü tasarımdan ötürü) sorun yaratsa da faydası çok olduğu için denemeye değer. Bir miktar PHP bilginiz varsa, bunun yaratabileceği sorunları kendinizin gidermesi de mümkün.

“wp-config.php” dosyasını açıp “site-content” dizininin yerinde ve isminde yaptığınız değişikliği yansıtacak şekilde aşağıdaki satırları ekleyin.

define(‘WP_CONTENT_FOLDERNAME’, ‘yeni-site-content-dizini’);
define(‘WP_CONTENT_DIR’, ABSPATH . WP_CONTENT_FOLDERNAME );
define(‘WP_CONTENT_URL’, ‘http://alan-adi/’.WP_CONTENT_FOLDERNAME);
define(‘WP_PLUGIN_DIR’, WP_CONTENT_DIR .’/plugins’ );
define(‘WP_PLUGIN_URL’, WP_CONTENT_URL.’/plugins’);

Proxy Bağlantılarını Kısıtlayın

WordPress web siteniz pek çok farklı site ile iletişim içindedir. Bazen bunu kısıtlamak gerekli / faydalı olabilir. O zaman tek yapmanız gereken, “wp-config.php” dosyasına aşağıdaki satırları eklemek olacaktır.

define(‘WP_HTTP_BLOCK_EXTERNAL’, true); // dış sitelerden erişimi engelle
define(‘WP_ACCESSIBLE_HOSTS’, ‘api.wordpress.org’); // WordPress api sayfası hariç

.htaccess Güvenlik Duvarı Kurun

Eğer basit bir wordpress kurulumunuz var ise Perishable Press’in .htaccess güvenlik duvarını da deneyebilirsiniz. Biraz komplike ihtiyaçlar söz konusu olduğunda sorun çıkarabiliyor. Bir deneyin, eğer sorun yaşamazsanız güvenliğinizi önemli ölçüde iyileştirdiği için kullanmaya devam etmeniz şiddetle tavsiye edilir.