Veritabanı bağlantısı kurulurken hata oluştu

0
221

Veritabanı bağlantısı kurulurken hata oluştu. Geçmiş olsun!

Merhabalar,

Bu yazıda gözbebeğim, canımın içi sitem Limenya’dan ve ona bir süre musallat olan yukarıdaki hata mesajından bahsedeceğim.

Limenya’yı yaklaşık 7 ay önce kurdum. Amacım ilgimi çeken konuları paylaşmaktı. Aslında uzunca bir süre bu işi Vikipedi üzerinde yaptım. Fakat daha sonra “neden Vikipedi yerine kendi sitemde yazmıyorum?” diye düşündüm ve burayı açtım. Gün geçtikce de sitemin ziyaretçi sayısı arttı ve şu an iyi bir okuyucu kitlem var. Bundan çok mutluluk duyuyorum. Sitedeki paylaşımlarımdan başkalarının faydalanıyor olduğunu görmek mutluluk verici. İşten, güçten vakit bulduğum sürece de paylaşımlara devam edeceğim.

Bugünkü yazımın konusu biraz teknik. Uzun zamandır yaşadığım bir sorunu ve çözümünü sizlere de yardımcı olması açısından paylaşacağım. WordPress site sahibi olup da aşağıda bahsedeceğim dertten muzdarip olmayan insan sayısı azdır.

Veritabanı bağlantısı kurulurken hata oluştu

Evet meşhur sorunumuz bu: Veritabanı bağlantısı kurulurken hata oluştu (ingilizce WordPress kullanıyorsanız alacağınız hata: Error connecting to database).

Veritabanı bağlantısı kurulurken hata oluştu

Öncelikle Limenya’nın çalıştığı server ve platformdan bahsedeyim. DigitalOcean’dan satın aldığım 1 core işlemci, 1GB memory, 30GB SSD Disk ve 3TB aylık veri transferi olan bir sunucu üzerinde çalışıyor Limenya. İlk başlarda 512mb’lık paketten almıştım ve bir süre sonra ziyaretçi sayım artınca 1GB’lık pakede geçtim. Fakat ara ara Veritabanı bağlantısı kurulurken hata oluştu mesajları almaya başladım. Sitem hemen hemen hergün bu hata nedeniyle erişilemez hale geliyordu. Çok canım sıkılmıştı. DigitalOcean sürekli pakedinizi yükseltin memory’niz yetmiyor diyordu fakat sorun aşırı ziyaret değildi. Başka bir sıkıntı vardı. Siteye belirli aralıklarla saldırı oluyordu. Ve nihayet DigitalOcean 4 Şubat 2016’da bir çözüm önerisi sundu. Zira forumlarda herkes aynı hatadan şikayet ediyordu. Aşağıdaki yazıyı sitenin forum sayfasında yayınlanan çözüm önerisinden aktarıyorum. Ben bu adımları uyguladım ve başarılı bir sonuç aldım. Umarım sizin de işinize yarar.

WordPress popüler ve güçlü bir CMS (içerik yönetim sistemi) platformudur. Bu popülaritesi zararlı diyebileceğimiz trafik ve saldırılar getirebiliyor maalesef.

Korunmamış veya optimize edilmemiş bir sunucu kötü niyetli trafiğin/saldırıların küçük bir miktarını alsa bile çökebilir. Bu yüzden sunucunun koruma ve optimize işlemleri iyi yapılmalıdır. Bu ataklar neticesinde sunucu üzerindeki sistem kaynakları tükenir ve çalışmaz hale gelir. MySQL gibi servisler işlemez hale gelir. En bilinen hata mesajı Error connecting to database veya Türkçe karşılığı Veritabanı bağlantısı kurulurken hata oluştu. Aynı şekilde konsol üzerinden sunucuya bağlandığınızda Out of memory (Yetersiz hafıza) hataları görürsünüz.

Aşağıdaki rehber sitenizi ve sunucunuzu XML-RPC saldırılarından nasıl koruyacağınızı gösterecek.

Öncelikle aşağıda anlatılan işlemleri yapabilmek için şu koşulların sağlanması lazım;

  • Ubuntu 14.04 üzerinde çalışan bir WordPress
  • sudo yetkisi olan bir non-root kullanıcı

Ubuntu 14.04 üzerinde çalışan bir WordPress blogunuz olduğunu varsayıyoruz. Dolayısıyla bu adımı geçiyorum.

sudo yetkisi olan non-root bir kullanıcınız yoksa aşağıdaki şekilde oluşturabilirsiniz;

adduser test komutu ile test kullanıcısı oluşturabilirsiniz.

adduser

Şimdi test adında bir kullanıcımız var fakat bu kullanıcının standart yetkileri var. Admin yetkileri henüz yok. Bu kullanıcıyı sudo grubuna ekleyerek sudo komutu ile admin yetkisi gerektiren işlemleri yapmasına izin verebiliriz.

Aşağıdaki komutu kullanarak test kullanıcısını sudo grubuna ekliyoruz.

gpasswd -a test sudo

Artık test kullanıcımız sudo komutu ile admin yetkisi gerektiren komutları çalıştırabilir! Aşağıda anlatılan tüm komutların non-root bir kullanıcı ile çalıştırılması gerekiyor. Bu yüzden oluşturduğunuz bu yeni kullanıcı ile giriş yapıp bu komutları çalıştırmalısınız.

XML-PRC Nedir?

WordPress uzaktan çalıştırılan fonksiyonlar için XML RPC kullanır. Ekşi Sözlük’te tanımı şöyle verilmiş;

“Blogger gibi blog platformlarının ya da wbloggar gibi masaüstü blog yazılımlarının server’da duran blog api’si ile haberleşip içerik yayınlamasını sağlayan bir protokol aynı zamanda.”

WordPress’in popüler eklentisi JetPack ve WordPress mobil uygulaması XML-RPC kullanan iki büyük örnektir. Bu fonksiyon maalesef bazı kötü niyetli kişilerce Wordpress barındıran bir sunucuya binlerce ve onbinlerce request gönderip o sunucuyu etkisiz hale getirmede de kullanılır. Sunucuya kısa bir zaman dilimi içerisinde binlerce request gelir ve sunucu kaynakları yetersiz hale gelerek çalışamaz duruma gelir.

XML-PRC Saldırısı Nasıl Tespit Edilir?

XML-PRC saldırısını iki farklı yöntemle tespit edebilirsiniz;

  1. WordPress siteniz göçtüğünde ekranda kocaman “Error connecting to database” ya da “Veritabanı bağlantısı kurulurken hata oluştu mesajı görürsünüz.
  2. Sunucu loglarını kontrol ettiğinizde pek çok sayıda “POST /xmlrpc.php HTTP/1.0” kaydı görürsünüz.

Sunucu loglarınızın yeri kullandığınız Linux dağıtımına göre farklılık gösterebilir.

Ubuntu 14.04 üzerinde Apache loglarında XML-PRC kaydı olup olmadığını aşağıdaki komutla tespit edebilirsiniz;

sudo grep xmlrpc /var/log/apache2/access.log

Ubuntu 14.04 üzerinde Nginx loglarında XML-PRC kaydı olup olmadığını aşağıdaki komutla tespit edebilirsiniz;

sudo grep xmlrpc /var/log/nginx/access.log

Eğer yukarıdaki komutları çalıştırdığınızda aşağıdaki şekilde satırlar görüyorsanız WordPress siteniz çok sayıda XML-PRC saldırısına maruz kalıyor demektir.

111.222.333.444:80 555.666.777.888 - - [01/Jan/2016:16:33:50 -0500] "POST /xmlrpc.php HTTP/1.0" 200 674 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

Aşağıda bu saldırılardan sitenizi nasıl koruyabileceğiniz anlatılacak.

Yöntem 1: Jetpack eklentisini kurun

WordPress’in en popüler eklentilerinden biri Jetpack. Jetpack sayesinde sitenizi XML-RPC benzeri saldırılardan koruyabilirsiniz. Tek yapmanız gereken eklentiyi kurmak ve aşağıdaki gibi ayarlar ekranında Koruma özelliğini aktif hale getirmek. Bu özelliği aktif hale getirdikten sonra Jetpack sitenizi saldırılara karşı koruyacaktır. Fakat bu oran %100 değil de %90 oranında olabilir. Yani %10 bir ihtimal halen saldırılara karşı korunmasız olabilirsiniz.

jetpack_eklenti

Yöntem 2: XML-RPC trafiğini manuel engelleyin

Ben hem Jetpack kullanıyorum hem de manuel engelleme yapıyorum. Apache veya Nginx konfigürasyonuna ekleyeceğiniz bir kod ile bütün XML-RPC trafiğini engelleyebilirsiniz.

Apache kullanıyorsanız aşağıdaki komutu çalıştın;

sudo nano /etc/apache2/sites-available/000-default.conf

ve VirtualHost tag’i altına aşağıdaki satırları ekleyin.

<VirtualHost>
…    
    <files xmlrpc.php>
      order allow,deny
      deny from all
    </files>
</VirtualHost>

Kaydedip çıktıktan sonra Apache’yi restart etmeniz gerekir.

sudo service apache2 restart

Nginx kullanıyorsanız;

sudo nano /etc/nginx/sites-available/example.com (sitenizin tam adresini girmelisiniz buraya)

server bloğu altına aşağıdaki kodu eklemelisiniz;

server {
…
 location /xmlrpc.php {
      deny all;
    }
}

Kaydedip çıktıktan sonra web server’ı restart etmelisiniz;

sudo service nginx restart

Bu yöntemleri uyguladıktan sonra access.log’larınız kontrol ettiğinizde yine de XML-RPC içeren satırlar göreceksiniz fakat bu kez sonuç kodu olarak 200 yerine daha farklı bir sayı gelmeli. Eğer 200 yerine 500 veya farklı bir sayı geliyorsa işlemleri doğru yapmışsınız demektir. Tebrikler!

111.222.333.444:80 555.666.777.888 - - [01/Jan/2016:16:33:50 -0500] "POST /xmlrpc.php HTTP/1.0" 500 674 "-" "Mozilla/4.0 (compatible: MSIE 7.0; Windows NT 6.0)"

Sonuç

Yukarıda anlatılan yöntemleri kullanarak XML-RPC saldırılarından sitenizi koruyabilir ve kaynaklarınızın tüketilmesini engelleyebilirsiniz. Sistem kaynaklarının aşırı tüketimi sitenizi her zaman çalışmaz hale getirir. Sitenizi sürekli online tutmak için bu yöntemleri uygulamanızda fayda var. Umarım faydası olur!

Alternatif Yöntem

Diyelim ki yukarıdaki işlemlerin hiçbiri sorununuzu çözmedi. O zaman aşağıda anlatacağım yöntemi kullanın. En azından sunucunuzun erişilemez olmasını önlemiş olursunuz. Aşağıdaki yöntem şu; basit bir script yazacağız. Bu script her 1 dakikada çalışacak ve mysql’in çalışıp çalışmadığını kontrol edecek. Eğer servis çalışmıyorsa çalıştıracak ve size mail atacak.

  1. Öncelikle terminal ile sunucunuza bağlanın.
  2. nano mysqlfix.sh komutu ile scripti oluşturun.
  3. Aşağıdaki komutu bu scriptin içine yapıştırın.

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! “$(/usr/sbin/service mysql status)” =~ “start/running” ]]
then
echo “MySQL restarted” | mail -s “Mysql Servisi Restart Edildi” email@domain.com
sudo service mysql start
fi

4. Bu komutta belirtilen email@domain.com kısma kendi email adresinizi yazın. CTRL+X ile kaydedin ve çıkın.

5. chmod +x mysqlfix.sh komutu ile dosyaya erişim verin.

6. Şimdi cronjob oluşturalım. crontab e komutunu çalıştırın. Açılan dosyanın en sonuna */1 * * * * /root/mysqlfix.sh komutunu yapıştırın. CTRL+X ile kaydedip çıkın.

7. Çalışıp çalışmadığını test etmek için /usr/sbin/service mysql stop komutu ile mysql’i durdurun ve 1 dakika bekleyin. 1 dakika sonra script mysql’i restart edecek ve size bilgilendirme maili atacak.

Hepsi bu kadar!

PAYLAŞ

Sizin de söyleyecekleriniz varsa lütfen yazın