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"
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
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
Özet
SSL/TLS modu Full (Strict) veya Automatic SSL/TLS
Origin'de geçerli sertifika kurulu
Nginx 443'ü dinliyor,
nginx -t temizPHP'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
