SSL Sertifikası Oluşturma

Selamlar,

Paraya kıydım ve blogumu SSL ile siz sevgili kullanıcılarım için daha güvenli, daha nezih, hijyenik ve steril bir hale getirdim. Limenya artık SSL’li!

Peki bu ne demek? Bu şu demek, limenya.com üzerinde yaptığınız veya yapacak olduğunuz (bkz: yaptıklarım yapacaklarımn teminatıdır) tüm aktiviteler artık şifreli! Yani güvenle sitemde yorum yazabilir ve like butonuna basabilirsiniz. Hiçbir mecri sizin ile aramızdaki veri alışverini göremez.

Belki sizin de bir adet siteniz vardır ve siz de sitenizi SSL ile güçlendirmek istersiniz. O yüzden aşağıda adım adım SSL sertifikası oluşturma işlemlerini göstereceğim.

SSL Sertifikası Oluşturma

Öncelikle SSL sertifikanızı nereden almak istediğinize karar verin. Piyasada oldukça çok sayıda SSL sertifikası veren yetkili firma var. Bunlardan en popülerleri GoDaddy, NameCheap gibi firmalar. SSL sertifikasını bu yetkili abilerden alacaksanız biraz paraya kıymanız gerekiyor. Çünkü SSL sertifikaları ücretli. Fakat sertifikaya verecek param yok diyorsanız, üzülmeyin. Ücretsiz olarak “Let’s Encrypt!” adlı gönüllü, open source organizasyondan sertifikanızı ücretsiz edinebilirsiniz. Henüz beta aşamasında olduklarından “use your own risk” diyorum. Ben riske atmak istemediğimden gidip GoDaddy’den aldım. GoDaddy 1 yıllık sertifikayı 14TL’den veriyor. Fakat 1 yıl sonra yenilemek istediğinizde bu rakam 150TL civarı. Ben şimdilik 14TL vererek 1 yıllık sertifikamı aldım. 1 sene sonra bakarız.

SSL Sertifikası Oluşturma

Sertifikanızı satın aldıktan sonra kuruluma başlayabilirsiniz.

Limenya DigitalOcean üzerinde Ubuntu 14.04 kurulu WordPress yazılımı ile çalışıyor. Ben kurulumu Apache’ye ve GoDaddy’ye göre anlatacağım.

İlk yapmanız gereken sunucunuz üzerinde bir CSR ve private key üretmek. Aşağıdaki openssl komutu ile CSR ve key oluşturabilirsiniz.

openssl req -newkey rsa:2048 -nodes -keyout limenya.com.key -out limenya.com.csr

Bu noktada size bazı sorular sorulacak ve bunları doldurmanız gerekecek. Bunlardan en önemlisi Common Name. Diğerlerini öylesine doldursanız bile Common Name kısmını düzgün doldurmanız gerekiyor. Common Name sitenizin adresi olacak. Örneğin limenya.com gibi.

 Country Name (2 letter code) [AU]:TR
 State or Province Name (full name) [Some-State]:ISTANBUL
 Locality Name (eg, city) []:ISTANBUL
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:LIMENYA
 Organizational Unit Name (eg, section) []:
 Common Name (e.g. server FQDN or YOUR name) []:limenya.com
 Email Address []:info@limenya.com

Bu bilgileri girdikten sonra CSR ve private key’iniz root klasörünüzde oluşmuş olacak. Aşağıdaki komutu kullanarak CSR dökümanınızın içeriğini görüntüleyebilirsiniz.

cat example.com.csr

Şimdi yapmanız gereken GoDaddy SSL sertifikası yönetim paneline gidip yukarıda oluşturduğunuz CSR kodunu girmek. GoDaddy sizin sitenin gerçek sahibi olduğunuzu doğrulamak isteyecektir. Bunun için sizden ya bir html dosyasını sitenize yüklemenizi isteyecek ya da e-mail ile bir doğrulama linki gönderecektir. Doğrulama işlemini yaptıktan sonra sertifikanız indirilmeye hazır hale gelecektir. GoDaddy üzerinden sertifikanızı indirip, zip dosyasını açın. İçinden 2 tane crt dosyası çıkacak. Bunlardan rastgele isimde olanı site adresinizle aynı isimde yapın. Örneğin limenya.com.crt gibi. Diğer bundle’ı ise intermediate.crt diye adlandırın ve sitenizin user klasörüne yükleyin. Yükleyeceğiniz yer şöyle olmalı: /home/kullaniciadi/

Bu iki CRT dosyasını sunucunuza yükledikten sonra sıra sertifikaları tanıtmaya geldi.

Kuruluma geçmeden önce /home/kullaniciadi/ klasöründe aşağıdaki dosyaların olduğuna emin olun;

1- example.com.key adında bir private key
2- example.com.crt adında bir ssl sertifikası
3- intermediate.crt adında yetkili kurumun sertifikaları

Apache üzerinde konfigürasyon dosyalarında bazı güncellemeler yapacaksınız. Öncesinde orijinal ayarların bir kopyasını almanızda fayda var.

Aşağıdaki komutlarla yedeklemenizi yapabilirsiniz.

cd /etc/apache2/sites-available
cp 000-default.conf 000-default.conf.orig

Sonrasında aşağıdaki komutla konfigürasyon dosyasını açın.

sudo vi 000-default.conf

yazan kısmı bulup ile değiştirin. Çünkü artık 80 portunu değil, 443 portunu dinleyeceğiz. 80 portunu da dinleyeceğiz ama onu 443’e yönlendireceğiz.

Aşağıdaki kodu ekleyin. Example.com yazan yere kendi site adresinizi yazın.

ServerName example.com

Sonra aşağıdaki satırları ekleyin.


SSLEngine on
SSLCertificateFile /home/kullaniciadi/example.com.crt
SSLCertificateKeyFile /home/kullaniciadi/example.com.key

Apache 2.4.8 ve üzeri kullanıyorsanız aşağıdaki satırı ekleyin;

SSLCACertificateFile /home/kullaniciadi/intermediate.crt

80 portuna gelen istekleri karşılamak için aşağıdaki satırları en tepeye yapıştırın.


ServerName example.com
Redirect permanent / https://example.com/

Kaydedip çıkın.

Apache SSL modülünü aşağıdaki komutla etkin hale getirin.

sudo a2enmod ssl

Ve Apache’yi restart edin..

sudo service apache2 restart

Bu kadar!

Şimdi sitenizi ziyaret ettiğinizde https şeklinde açıldığını göreceksiniz. Hayırlı olsun!

Yalnız WordPress ayarlarınızda da ufak bir değişiklik yapmanız lazım.

Genel ayarlara girerek wordpress adresi ile site adresini https olarak güncellemeniz lazım.

SSL Sertifikası Oluşturma

Ve işte bitti!

Güle güle kullanın efendim. SSL Sertifikamız Hayırlı Olsun 🙂

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

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!