mavzermete 1
mavzermete
Bodyguardd 1
Bodyguardd
Vahsi Uzman 1
Vahsi Uzman
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle

Cloudflare'de SSL Modları: Flexible Neden Tehlikeli?


Cloudflare'de SSL Modları: Flexible Neden Tehlikeli?


Cloudflare kuran çoğu kişinin yaptığı ilk iş şu: SSL/TLS sekmesine girer, listeden "Flexible" seçer, siteyi açar, adres çubuğunda kilidi görür ve rahatlar. Sitem artık SSL'li der.

Halbuki öyle değil. Şimdi neden olmadığını anlatacağım.




Bağlantı Tek Parça Değil, İki Parça

Cloudflare devreye girdiği anda ziyaretçi ile senin sunucun arasındaki yol ikiye bölünür.

Birincisi ziyaretçinin tarayıcısı ile Cloudflare arasındaki bağlantı. İkincisi Cloudflare ile senin sunucun arasındaki bağlantı. Tarayıcıdaki o yeşil kilit sadece birincisini gösteriyor. İkinci kısımda ne döndüğünü ziyaretçi göremez, tarayıcı da göremez, hiçbir uyarı çıkmaz.

SSL modu dediğimiz ayar işte tam olarak ikinci kısmın nasıl kurulacağını belirliyor.

Flexible seçtiğinde ne oluyor peki? Ziyaretçiye "burası güvenli" diyen bir kilit gösteriyorsun ama arka tarafta veriyi düz metin taşıyorsun. Bu güvenlik sağlamıyor, güvenlik görüntüsü sağlıyor. Bir forumda bunun tehlikeli olmasının sebebi de bu: kullanıcı o kilide bakıp şifresini yazıyor.




Modları Tek Tek Görelim

Panelde SSL/TLS > Overview altında karşına çıkan seçenekler:

Off
Şifreleme yok. Her iki taraf da HTTP. Tarayıcı "Güvenli değil" yazar. Bugün kullanılacak bir yeri kalmadı.

Flexible
Ziyaretçi ile Cloudflare arası HTTPS, Cloudflare ile sunucun arası HTTP. Yani port 80, düz metin. Sunucunda hiç sertifika olmasa bile çalışır. Kolay olduğu için seçiliyor, asıl sıkıntı da orada.

Full
Cloudflare sunucuna 443'ten HTTPS ile bağlanır. Ama sertifikayı doğrulamaz. Self signed olsun, süresi dolmuş olsun, başka alan adına ait olsun, hepsini kabul eder.

Trafik şifreli, bu iyi. Ancak "karşımdaki gerçekten benim sunucum mu" diye sorulmadığı için araya giren biri kendi sertifikasıyla trafiği okuyabiliyor. Şifreleme var ama kimlik doğrulama yok. Yarım çözüm.

Full (Strict)
Bağlantı hem şifreli hem de sertifika doğrulanıyor. Geçerli bir CA imzası olacak (Let's Encrypt, ticari sertifika ya da Cloudflare'in kendi Origin CA'sı) ve alan adıyla eşleşecek.

Forum için hedeflemen gereken mod bu.

Automatic SSL/TLS
Cloudflare'in yeni varsayılanı. Sunucunu tarayıp destekleyebildiği en güvenli modu kendisi seçiyor, sunucun sonradan düzelirse modu yükseltiyor. Ne seçeceğinden emin değilsen bunu açık bırakmak Flexible'da kalmaktan kat kat iyi. Yine de bilinçli kurulumda Full (Strict) elle seçilir.

Strict (SSL-Only Origin Pull)
Kurumsal kurulumlarda görülen, Full (Strict) davranışının 443'e sabitlenmiş hali. Normal kullanımda ihtiyacın olmaz.




Flexible Tam Olarak Neyi Kırıyor?

Şifreler ve oturum çerezleri düz metin gidiyor

Kullanıcı giriş yaptığında kullanıcı adı, şifre, arkasından da xf_user ve xf_session çerezleri Cloudflare'den sunucuna okunabilir halde gidiyor.

"Kim dinleyecek ki" diye düşünme. O yolu dinleyebilecek taraf sandığından fazla: hosting sağlayıcın, veri merkezindeki komşu kiracılar, aradaki transit operatörler, yanlış yapılandırılmış bir switch, ele geçirilmiş bir router. Kimsenin dinlemediğini varsaymak bir güvenlik önlemi değil.

Yönetici oturumu çalınabiliyor

Bir forumda en değerli paket admin'in xf_session_admin çerezidir. O çerez düz metin taşınıyorsa, ele geçiren kişinin şifreye ihtiyacı olmaz. Doğrudan panele girer.

Burada 2FA da seni kurtarmıyor, çünkü adam giriş yapmıyor. Zaten açık olan oturumu devralıyor.

Sonsuz yönlendirme döngüsü

En sık karşılaşılan yan etki bu. Sunucunda "HTTP geleni HTTPS'e yönlendir" kuralı varsa şöyle bir kısır döngü oluşuyor:

Kod:
Ziyaretci  --HTTPS-->  Cloudflare  --HTTP(80)-->  Sunucu
Sunucu: "HTTP geldi, HTTPS'e yonlendireyim"  -->  301 https://...
Cloudflare  --HTTPS-->  ...ve bastan basliyor

Tarayıcıda ERR_TOO_MANY_REDIRECTS görürsün. İnsanların çoğu bu hatayla karşılaşınca sunucudaki HTTPS yönlendirmesini siliyor. Yani sorunu çözmek yerine güvenliği bir kat daha azaltıyor.

XenForo tarafında karışık içerik ve giriş sorunları

İstek sunucuna HTTP olarak ulaştığı için PHP tarafında $_SERVER['HTTPS'] boş kalıyor. Uygulama kendini HTTP sanıyor. Sonuç:

  • CSS, JS ve resim linkleri http:// olarak üretiliyor, tarayıcı mixed content uyarısı veriyor, stiller bozuluyor
  • Board URL uyuşmazlığı yüzünden giriş yapılamıyor, sürekli login sayfasına atıyor
  • Çerezlere Secure bayrağı düzgün basılamıyor
  • Ödeme ve eklenti callback'leri HTTP'ye düşüyor

HSTS ile çakışıyor

HSTS açtığında tarayıcıya "bu siteye asla HTTP ile gitme" diyorsun. Ama Flexible'da senin kendi altyapının içinde hâlâ HTTP var. Kullanıcıya verdiğin sözle arkada yaptığın iş uyuşmuyor.

Uyum tarafı

Kişisel veri işleyen bir sitede aktarım sırasında şifreleme beklenir. Flexible'da aktarımın bir bölümü şifresiz. Üyelerinin e-posta, IP ve mesaj verisini taşıyorsan bu ciddiye alınacak bir eksik.




Peki Nasıl Düzeltilir?

1. Sunucuna sertifika kur

İki yolun var.

Cloudflare Origin CA en pratiği. Ücretsiz, 15 yıla kadar geçerli. Panelde SSL/TLS > Origin Server > Create Certificate diyorsun, hostname kısmına siteadi.com ve *.siteadi.com yazıyorsun. Sana bir sertifika ve bir private key veriyor, ikisini de sunucuya kaydediyorsun.

Kod:
sudo mkdir -p /etc/ssl/cloudflare
sudo nano /etc/ssl/cloudflare/origin.pem      # Origin Certificate icerigi
sudo nano /etc/ssl/cloudflare/origin.key      # Private Key icerigi
sudo chmod 600 /etc/ssl/cloudflare/origin.key
sudo chown root:root /etc/ssl/cloudflare/origin.pem /etc/ssl/cloudflare/origin.key

Şunu bilerek yap: Origin CA sertifikası sadece Cloudflare tarafından güvenilir sayılır. Tarayıcıdan doğrudan sunucu IP'sine gidersen geçersiz görünecek. Bu hata değil, olması gereken davranış.

Let's Encrypt kullanacaksan, alan adın proxy'liyken HTTP-01 doğrulaması sorun çıkarabiliyor. DNS-01 ile git:

Kod:
sudo apt install certbot python3-certbot-dns-cloudflare -y
sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  -d siteadi.com -d www.siteadi.com

2. Nginx'i 443'e aç

Kod:
server {
    listen 80;
    server_name siteadi.com www.siteadi.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name siteadi.com www.siteadi.com;

    ssl_certificate     /etc/ssl/cloudflare/origin.pem;
    ssl_certificate_key /etc/ssl/cloudflare/origin.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    root /var/www/forum;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$uri&$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }
}

Kod:
sudo nginx -t && sudo systemctl reload nginx

3. PHP'ye isteğin HTTPS olduğunu söyle

Full (Strict)'e geçsen bile uygulaman proxy arkasında olduğunu bilmezse şema karışıklığı yaşarsın. Nginx tarafında şunu ekle:

Kod:
    set $forwarded_https off;
    if ($http_x_forwarded_proto = "https") {
        set $forwarded_https on;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param HTTPS $forwarded_https;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

Gerçek ziyaretçi IP'sinin düzgün gelmesi için set_real_ip_from ayarını da unutma. O konuyu serinin ilk başlığında ayrıntılı anlatmıştım.

4. Modu değiştir

SSL/TLS > Overview > Full (Strict). Değişiklik saniyeler içinde yayılıyor.

5. Yan ayarları da yap

SSL/TLS > Edge Certificates altında:

Always Use HTTPS açık olsun. HTTP isteklerini Cloudflare seviyesinde çeviriyor, sunucuya kadar getirmiyor.

Automatic HTTPS Rewrites açık olsun. Sayfa içindeki http:// bağlantılarını mümkün olduğunca https:// yapıyor, mixed content'i azaltıyor.

Minimum TLS Version en az 1.2 olacak.

HSTS konusunda acele etme. Full (Strict) çalıştığını doğruladıktan sonra aç. Önce max-age'i 300 saniye gibi küçük tut, her şey yolundaysa 6 aya ya da 1 yıla çıkar. Erken açıp altyapıyı bozarsan tarayıcılar seni bir süre HTTPS'e kilitler, geri dönüşü sancılı olur.

preload seçeneğine ne yaptığından tam emin değilsen hiç dokunma. O listeden çıkmak aylar sürebiliyor.




Bir Adım Öteye: Authenticated Origin Pulls

Full (Strict) şunu söylüyor: "Cloudflare, sunucumu doğrula."

Authenticated Origin Pulls ise tersini kuruyor: "Sunucum da karşısındakinin gerçekten Cloudflare olduğunu doğrulasın."

Böylece origin IP'ni bulan biri doğrudan bağlanmaya kalktığında daha TLS el sıkışmasında kapıdan dönüyor.

Cloudflare'in origin pull sertifikasını indir:

Kod:
sudo mkdir -p /etc/ssl/cloudflare
sudo curl -o /etc/ssl/cloudflare/origin-pull-ca.pem \
  https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem

Nginx'e ekle:

Kod:
    ssl_client_certificate /etc/ssl/cloudflare/origin-pull-ca.pem;
    ssl_verify_client on;

Sonra panelden SSL/TLS > Origin Server > Authenticated Origin Pulls seçeneğini aç.

Dikkat edeceğin nokta şu: bunu açtıktan sonra sunucuna Cloudflare dışından gelen hiçbir HTTPS isteği çalışmaz. Uptime izleme servisin veya ödeme sağlayıcının webhook'u doğrudan sunucuya vuruyorsa, onları Cloudflare üzerinden geçirecek şekilde ayarlaman gerekiyor.




Gerçekten Düzeldi mi? Test Et

Cloudflare üzerinden normal istek:
Kod:
curl -sI https://siteadi.com | head -20
HTTP/2 200 ve server: cloudflare görmen lazım.

Origin gerçekten 443'te konuşuyor mu:
Kod:
curl -svo /dev/null https://siteadi.com \
  --resolve siteadi.com:443:SUNUCU_IP_ADRESIN 2>&1 | grep -Ei "subject|issuer|SSL conn"
Origin CA kullanıyorsan issuer satırında Cloudflare Origin CA yazacak.

Sertifikanın detayları:
Kod:
openssl s_client -connect SUNUCU_IP_ADRESIN:443 -servername siteadi.com < /dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates

Port 80 hâlâ açıkta mı:
Kod:
curl -sI http://SUNUCU_IP_ADRESIN
Buradan siten cevap veriyorsa Cloudflare'i baypas eden bir yol var demektir. Firewall'da 80 ve 443'ü sadece Cloudflare IP bloklarına açman gerekiyor, o konuyu 7. başlıkta ele alacağız.

Son olarak tarayıcıda F12 açıp Console'da mixed content uyarısı var mı bak. Varsa kaynağını düzelt. Automatic HTTPS Rewrites yara bandı, kalıcı çözüm değil.




Karşılaşabileceğin Hata Kodları

Full (Strict)'e geçerken şunlarla karşılaşabilirsin:

520 Origin beklenmedik veya boş cevap döndü. Genelde sunucuda bir çökme ya da PHP hatası vardır.

521 Origin bağlantıyı reddetti. 443 kapalıdır, servis çalışmıyordur veya firewall engelliyordur.

522 Bağlantı zaman aşımına uğradı. Firewall paketi sessizce düşürüyor ya da sunucu aşırı yüklü.

523 Origin'e ulaşılamıyor. DNS'teki A kaydı yanlış IP'yi gösteriyor olabilir.

525 TLS el sıkışması başarısız. 443 açık ama SSL yapılandırması bozuk.

526 Geçersiz origin sertifikası. Full (Strict)'e geçince en çok görülen hata budur. Sertifika alan adıyla eşleşmiyordur, süresi dolmuştur veya ara sertifika eksiktir.




Dikkat Edilecekler

Site 526 verdi diye Flexible'a geri dönme. O hata sertifikanda bir sorun olduğunu söylüyor, geri dönmek sorunu çözmüyor sadece gizliyor.

"Sertifikayı zaten Cloudflare veriyor, sunucuya gerek yok" diye düşünme. Cloudflare'in verdiği Universal sertifika edge tarafı için. Origin bacağı ayrı bir sertifika istiyor.

Yönlendirmeyi hem Cloudflare'de hem nginx'te hem .htaccess'te kurma. Katman katman yönlendirme döngü üretiyor, tek yerde tut.

Alt alan adlarını unutma. forum.siteadi.com da proxy'liyse origin sertifikası onu da kapsamalı. Wildcard alırsan işin kolaylaşır.

Let's Encrypt kullanıyorsan yenileme otomasyonunu kontrol et:
Kod:
systemctl status certbot.timer
Zamanlayıcı çalışmıyorsa 90 gün sonra site 526 vermeye başlar ve sebebini ararsın.




Özet

SSL/TLS modu Full (Strict) veya Automatic SSL/TLS
Origin'de geçerli sertifika kurulu
Nginx 443'ü dinliyor, nginx -t temiz
PHP'ye HTTPS bilgisi aktarılıyor, mixed content yok
Always Use HTTPS ve Automatic HTTPS Rewrites açık
Minimum TLS 1.2
HSTS test edildikten sonra açıldı
Authenticated Origin Pulls açık
Firewall'da 80/443 sadece Cloudflare'e açık
Sertifika otomatik yenileniyor


 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst