Kategori arşivi: Cloudflare

Cloudflare’nin sunduğu hizmetlerin kullanımı ile ilgili makaleler, cloudflare güvenlik yapılandırmaları ve performans optimizasyonları, workers kullanımı ve rehberler

Cloudflare Workers ile IP Geolocation API Nasıl Yapılır?

Cloudflare workers kullanarak bir ziyaretçinin IP bilgisi üzerinden konum bilgisini alabiliriz zaman zaman bu bilgiye ihtiyacımız olur. Bu işi yapan pek çok servis var ancak fiyatları oldukça yüksek. Gelin Cloudflare ile ücretsiz bir şekilde kendi servisimizi oluşturalım, 100k isteği geçiyorsanız aylık 5$ ödeyerek kullandığınız paketi de yükseltebilirsiniz diğer servislerin ücretlendirmesine baktığımız zaman oldukça uyguna gelecek.

Cloudflare Workers’da Servis Nasıl Oluşturulur?

Cloudflare hesabınıza giriş yapıktan hemen sonra sol menüde yer alan “Workers” > “Overview” > “Create a Service” diyoruz.

cloudflare workers create services, cloudflare create api

Oluşturacağımız servisin adını giriyoruz daha sonra tipini seçiyoruz, bu örnekte “HTTP handler” seçin ve “Create service” tuşuna basın.

cloudflare worker servis oluşturma

Worker Nasıl Düzenlenir?

Başarılı bir şekilde servisimizi oluşturduk, şimdi direk olarak sağda yer alan “Quick Edit” tıklayın.

cloudflare workers quick edit, cloudflare worker services edit, cloudflare services

Solda kod düzenleme, ortada istek atabileceğiniz bir alan ve sağda ön izleme alanı sizi karşılayacak. Sol taraftaki alana kodumuzu ekliyoruz. “Save and deploy” dediğimiz andan itibaren web sitemiz erişilebilir hale geliyor.

cloudflare workers edit code, cloudflare http handler example

Kullanacağımız javascript kodumuz çok basit bir şekilde IP adresinin geolocation bilgilerini verecek ve şu şekilde olacak daha fazla sonuç almak isterseniz resmi cloudflare worker belgelendirmesine göz atabilirsiniz, kullanabileceğiniz oldukça fazla değer bulunuyor.

{
  "asn": 47524,
  "as_organization": "Turksat",
  "city": "Ankara",
  "country": "TR",
  "timezone": "Europe/Istanbul",
  "ip_address": "94.46.141.209"
}

Kullanacağımız kodumuz ise şu şekilde

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request));
})

async function handleRequest(request) {
    const data = JSON.stringify({
        asn: request.cf.asn,
        as_organization: request.cf.asOrganization,
        city: request.cf.city,
        country: request.cf.country,
        timezone: request.cf.timezone,
        ip_address: request.headers.get("CF-Connecting-IP")
    }, null, 2);

    return new Response(data, {
        headers: {
            "Access-Control-Allow-Origin": "*",
            "Content-Type": "application/json;charset=UTF-8"
        }
    })
}

Sonuç olarak belirli bir isteğe kadar kullanabileceğimiz Geolocation servisimiz hazır hale geliyor. Servisimizden bir örnek https://geolocation.mertcan.workers.dev/ adresini ziyaret edebilirsiniz.

Ayrıca servis işlemlerinde cronjob çalıştırabilirsiniz CloudFlare Workers Kullanarak Harici Cronjob İşlerinin Yapılması ile detaylarını öğrenebilirsiniz.

iOS 16’da Private Access Token(PAT) Nasıl Etkinleştirilir? Mobilde Captcha Görmeye Son

Cloudflare tarafından duyurulan Private Access Token ile artık CAPTCHA görmeyeceğiz. Bir web sitesine veya servise gidiyorsunuz, ancak size erişim verilmeden önce sizi bir dizi görüntüde bisiklet, otobüs veya trafik ışığı seçmeye zorlayan sistemler var.

Bu can sıkıcı bir deneyim hepimiz bunun farkındayız kimi zaman geçemiyoruz, hayatımızdan direk olarak her captcha çözümünde 30 saniye kadar bir süre çalınıyor. Haliyle küresel oyun kuran firmalarda bunun farkında ve çözüm üretmeye çalışıyorlar ve kısmende bulmaya çok yakınlar.

Cloudflare Private Access Token Nedir?

Temelde Privacy Pass protokolünü kullanır, ziyaretçilerin geçmişte bıraktığı izler anonim bir şekilde şifreli olarak takip edilir. Şifreli dediysem öyle veriyi alıp şifrelemez direk olarak cihazın anahtarı. Bir açık anahtar ve bir özel anahtar yer alır, cihazda yer alan özel erişim tokeni sayesinde geçerli bir kullanıcı olup olmadığı doğrulanabilir.

Cihazlarda bu özelliği kullanabilmek amacıyla doğrulanmış uygulama ve akredite gerektiğini hatırlatmamda fayda olduğunu düşünüyorum. Kafanıza göre entegre olamıyorsunuz uygulama geliştiriciyseniz öncelikli olarak başvurularınızı yapmalısınız.

iPhone’unuzda iOS 16 veya bilgisayarınızda macOS 13 varsa, o kötü günler geride kaldı. Konu ile ilgili olarak Apple’nin WWDC22’de yayınladığı aşağıdaki kısa videoya göz atabilirsiniz.

https://developer.apple.com/videos/play/wwdc2022/10077/

12 Eylül’de iOS 16 genel kullanıma sunuldu, böylelikle bu CAPTCHA’lara olan ihtiyacı ortadan kaldıracak Private Access Token (PAT) özelliği cihazlara gelmiş oldu. Beta’da test ettik gayet güzel çalışıyor gerçekten söylendiği gibi CAPTCHA görmüyoruz.

Private Access Token (PAT) Nasıl Etkinleştirilir?

Zaten telefonunuza iOS 16 kuruluysa, seçeneğin “açık” olduğunu doğrulamak için yapmanız gerekenler şu şekilde “Settings > Apple ID > Password & Security > Automatic Verification” böylelikle ilk aşamada Cloudflare kullanan web sitelerinde CAPTCHA karşınıza hiç bir zaman çıkmayacak.

Kendinizi doğrulamanız için bu sistem size hiç bir şey sormaz ve göstermez, böylelikle hem kullanıcı deneyimi iyileşmiş olur hem de vaktimizden kimse çalmamış olur. IPadOS ve macOS‘un gelecek sürümleri de dahil olmak üzere bu tokenleri destekleyen işletim sistemlerini kullanan ziyaretçiler, artık bir CAPTCHA ile uğraşmadan veya kişisel verilerini sırf CAPTCHA çözmek için vermeden insan olduklarını çok rahat kanıtlayabilirler.

Apple cihazlar harici şuan bu protokolü hiç bir şekilde kullanamazsınız aklınızda olsun.

Private Access Token (PAT) Nasıl Çalışır?

Genel olarak çalışma mantığını Cloudflare görsel olarak şu şekilde belirtmiş. Ama kısaca bahsetmemiz gerekirse, Siz web sitesine istek yaptınız tarayıcı sizin yerinize web sitesinde bir doğrulama süreci başlatır bunu yapılan entegrasyonlar ile cihaz üreticisine yaptırır.

cloudflare private token, cloudflare captcha resolv, private access token
Private Access Token (PAT)

Halihazırda bir cihazın doğrulanmasında yardımcı olacak verilere sahip olan cihaz üreticileri üçüncü taraflarla partnerlik anlaşmaları yaparak, doğrulama sürecinin bölümlerini gerektiği gibi soyutlayabilir ve bu verileri toplamadan, dokunmadan ve/veya saklamadan ziyaretçiyi doğrulayabilir. Bir cihazı doğrudan sorgulamak yerine, cihaz satıcısından(şimdilik apple) bunu yapmasını ister.

Bu sistemle yapılan entegrasyon sayesinde işlemlerin bir bot tarafından yapılmasını engellemek kolaydır, bir isteğin gerçek kullanıcıdan mı yoksa bot gibi bir araçtan mı geldiği basit bir şekilde tespit edilebilir. Böylelikle sahtecilikle mücadele etmekte kolaylaşır.

cloudflare private access token nasıl çalışır, private access token nedir
  1. Ziyaretçi “mertcangokgoz.com” adresini ziyaret etmek için tarayıcısını açar ve bir istekte bulunur. Web sitesi Cloudflare kullandığından sistem ziyaretçinin tarayıcısından token ister.
  2. Safari istenen bu token için apple ile API üzerinden iletişime geçer ve cihazın onaylanmasını ister.
  3. Apple çeşitli cihaz bileşenlerini kontrol edecek, geçerli olduklarını onaylayacak ve ardından Cloudflare’ye bir API çağrısı yapar.
  4. Cloudflare, bir tokken oluşturur, onu tekrar tarayıcıya gönderir, o da kendisine iletilen bu tokeni origin’e gönderir.
  5. Cloudflare daha sonra bu özel tokeni alır ve bu kullanıcıya bir CAPTCHA gösterilmesine gerek olup olmadığını belirlemek için kullanır.

Süreç biraz karışık gibi duruyor evet farkındayım ancak bu süreci tamamen Cloudflare ve cihaz üreticisi yönetir, web sitesi hiç bir şekilde bu sürece dahil olmaz. Kurduğunuz web sitelerinde CAPTCHA entegrasyonu yapmak zorunda kalmazsınız.


References

  1. https://blog.cloudflare.com/end-cloudflare-captcha/
  2. https://blog.cloudflare.com/introducing-cryptographic-attestation-of-personhood/
  3. https://developer.apple.com/videos/play/wwdc2022/10077/
  4. https://www.ietf.org/archive/id/draft-ietf-privacypass-auth-scheme-01.html
  5. https://blog.cloudflare.com/eliminating-captchas-on-iphones-and-macs-using-new-standard/

CloudFlare ile Ücretsiz SSL/TLS Sertifikası Nasıl Alınır?

Yıllık SSL/TLS ücretleri aldı başını gitti, ücretsiz sertifikaları da 90 günde bir olmak üzere yenilemeniz gerekiyor kimi zaman insanlar unutuyor ve siteleri SSL/TLS hatası vermeye başlıyor. Bazı barındırma hizmeti sağlayıcılarını zaten gidip ziyaret etmiş olabilirsiniz ve fiyatları görünce hemen sayfayı kapattığınızı tahmin ediyorum. Alan adınız için ihtiyacınız olan tüm önemli güvenlik özelliklerine sahip ücretsiz SSL/TLS alabilirsiniz, bunu yapmak için birkaç yolunuz var

Ücretsiz SSL Sağlayıcıları

  1. Let’s Encrypt: Kâr amacı gütmeyen bir sertifika otoritesidir. Birçok hosting firması entegrasyon desteği sağlar ve ücretsiz SSL’yi sitenize entegre edebilirsiniz. Ancak tüm sağlayıcılar bu hizmeti sunmaz. Yine de bunu elle yapabilirsiniz. Yeni başlayan kullanıcılar için pek efektif olmaz.
  2. Cloudflare: CDN, güvenlik duvarı, Anycast DNS, Universal SSL ve çok daha fazlasını sağlar üstelik bunu ücretsiz yapar.
  3. ZeroSSL: kullanıcılarına ücretsiz SSL sertifikasını hızlı ve basit bir kullanıcı ara yüzü kullanarak, ACME entegrasyonlarını destekler, REST API desteği vardır. 90 günlük ve 1 yıllık sertifika geçerliliği arasında seçim yapma imkânı ile tek etki alanı, çok etki alanı veya wildcard sertifikaları destekler. Yeni başlayan kullanıcılar için pek efektif değildir.

Cloudflare ile Ücretsiz SSL Nasıl Alınır?

Ben bugün size bu rehberi hazırlarken Ücretsiz SSL için CloudFlare’yi kullanacağım. 15 yıllık ücretsiz SSL sertifikanızı sisteminize dahil edebileceksiniz.

CloudFlare birden fazla SSL şifreleme türünü destekler, bunları aşağıdaki görselden de görebilirsiniz. Merak etmeyin hepsini açıklayacağım istediğinizi seçebilirsiniz “Off (not secure)” olanı seçmeyin yeter.

  • Flexible: Tarayıcıdan Cloudflare’a giden tüm trafik 443 portu üzerinden SSL ile olacaktır, ancak CloudFlare kaynak sunucusuna HTTPS değil, yalnızca HTTP üzerinden bağlantı sağlayacak. Web siteniz hassas verilerle ilgilenmiyor ve kullanılmıyorsa bu yöntem sizin için yeterli, bu yöntemi etkinleştirmek için herhangi bir ekstra çabaya girmenize gerek yok.
  • Full: Uçtan uca şifreleme, tarayıcıdan ana sunucuya giden tüm trafik 443 portu üzerinden yapılır, geçerli veya geçersiz herhangi bir SSL sertifikası ile çalışabilir. Bu yöntemi kullanabilmek için kaynak sunucunuzun 443 portunun açık olması ve yapılandırılmış olması gerekmektedir.
  • Full (strict): Full ile aynıdır, ancak tek fark, CloudFlare ile kaynak sunucusu arasındaki bağlantının güvenilir bir “CA” veya “Cloudflare Origin CA” ile güvenli hale getirilmesi gerekliliğidir bu aşamayı ücretsiz ssl’ler ile de gerçekleştirebilirsiniz.

Bu anlatımda son yöntem olan Full (strict) kullanacağım, bağlantıların tamamını güvenli bir şekilde sağlayacağız. Cloudflare’ye giriş yapıyoruz, bunun sonucunda sol menüde yer alan “SSL/TLS” menüsünden “Origin Server” seçiyoruz ve “Create Certificate” diyoruz.

Ayarları aşağıdaki gibi yapabilirsiniz.

Şimdi sertifika oluşturuldu, bunu kaynak sunucunuza yüklemeniz gerekiyor. Özel Anahtarınızın bir kopyasını güvenli bir yerde saklayın. Çünkü “Ok” tuşuna bastığınız anda bir daha anahtarlarınıza erişemeyeceksiniz.

Ücretsiz SSL ile NGINX Nasıl Yapılandırılır?

Cloudflare’nin size vermiş olduğu Private ve Origin sertifikaları PEM formatında alın, aşağıdaki örnekte görebileceğiniz gibi anahtarlarınızı hazır edecek.

Aşağıdaki gibi nginx ile okuyabileceğiniz bir dizine yukarıda size verilen sertifikaları dahil edin.

sudo nano /etc/nginx/certs/cloudflare-cert.pem
sudo nano /etc/nginx/certs/cloudflare-private.key
ShellScript

Bu sertifikaların içlerinde aşağıdakiler bulunacak, ters yaparsanız hata alırsınız. Bu sebeple dikkatli davranarak ayarlamaları yapın.

  • cloudflare-cert.pem -> Origin Certificate
  • cloudflare-private.key -> Private Key

Dipnot: Bazen dosya içerisine yapıştırırken fazladan bir satır eklenir. (Dosyanın altına ve/veya üstüne) Herhangi bir boşluk kalmadığından emin olun. Nginx yapılandırma testi (nginx -t) aksi takdirde başarısız olur.

Nginx yapılandırmamızda aşağıdaki gibi değişiklik yapıyoruz.

server {
    listen 443;
    listen [::]:443;
    ssl_certificate         /etc/nginx/certs/cloudflare-cert.pem;
    ssl_certificate_key     /etc/nginx/certs/cloudflare-private.key;
    server_name example.com www.example.com;
    location / {
        include proxy_params;
        proxy_pass http://localhost:3000/;
    }
}
Nginx

Şimdi her şey istediğimiz gibi lakin burada bir sorun çıkacak, yukarıda size söylemiştim “Full (strict)” ayarlayacağız diye. Bu yapılandırma ile başarılı bir şekilde kullanmaya başlayabilirsiniz.

sudo nginx -t
ShellScript

Çıktımız aşağıdaki gibi olmalı

root@debian:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ShellScript

Authenticated Origin Pull Nasıl Yapılandırılır?

Kaynak sunucunuza gelen isteklerin bir TLS istemci sertifikası kullanarak Cloudflare’den geldiğini kriptografik olarak doğrulamanıza olanak tanır, bu özellik genellikle yanlış yapılandırılıyor.

Daha detaylı bilgi almak için https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/ adresini ziyaret edin.

Cloudflare TLS istemci sertifikasını Nginx sunucumuza eklememiz gerekiyor aşağıdaki işlemleri yapın.

-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----
Plaintext

Bu sertifikayı indirmek için bağlantıdan faydalanabilirsiniz.

sudo nano /etc/nginx/certs/cloudflare-auth-ca.crt
ShellScript

Yukarıdaki yapılandırmamıza iki satır daha ekleyeceğiz ve bu “Authenticated origin pull” özelliğini doğru bir şekilde ayarlamış olacağız.

server {
    listen 443;
    listen [::]:443;
    ssl_certificate         /etc/nginx/certs/cloudflare-cert.pem;
    ssl_certificate_key     /etc/nginx/certs/cloudflare-private.key;
    ssl_verify_client on;
    ssl_client_certificate /etc/nginx/certs/cloudflare-auth-ca.crt;
    server_name example.com www.example.com;
    location / {
        include proxy_params;
        proxy_pass http://localhost:3000/;
    }
}
Nginx

İşlemlerimiz sonunda tamamlandı sudo systemctl restart nginx ile NGINX’imizi yeniden başlatıyoruz. Ardından alan adınızı ziyaret edebilirsiniz. Haa unutmadan Cloudflare üzerinde “SSL/TLS” menüsü altında yer alan “Origin Server” içerisinde yer alan aşağıdaki özelliği aktif etmeyi unutmayın.

CloudFlare ile ilgili işinize yarayabilecek diğer makalelere ulaşmak için tıklayınız.

Cloudflare Ücretsiz SSL Hataları Nasıl Giderilir?

Ücretsiz SSL kurulumunu tamamladıktan sonra, web sitenizde SSL kaynaklı hata mesajları görebilirsiniz bunun pek çok sebebi olabilir.

Yeniden Yönlendirme Hataları

SSL aktif edilen web sitesinde yönlendirmelerde sorun çıkarsa tarayıcı üzerinden siteye erişilmeye çalışıldığında aşağıdaki hatalar gözükmeye başlar.

  • The page isn’t redirecting properly
  • ERR_TOO_MANY_REDIRECTS

Bu hataların bir kaç sebebi vardır, ilki web sunucusunda kaynaklanan HTTP trafiklerinin HTTPS üzerine birden fazla kez yönlendirilmesi ile oluşmaktadır. Apache ve NGINX üzerinde rewrite kurallarınızı kontrol edin.

İkincisi ise eskiden kullandığınız bir Page Rule mevcut yapılandırma ile çakışıyordur. Bunu kontrol etmek için sol menüden “Page Rule” alanına gidin ve kurallarınızı kontrol edin.

Eğer SSL şifreleme kurallarında değişiklik yaparsanız web sunucunuzda bununla ilgili değişiklikleri de yapmanız gerekir. Mod olarak Flexible kullanılan bir yapıda Full geçilirse yönlendirme sorunları oluşabilir.

Firewalld Kullanarak CloudFlare Trafiğinin Kabul Edilmesi

Neredeyse her firewall yönetim aracıyla ilgili CloudFlare ip aralıklarını beyaz listeye alma konusunda aksiyon aldık. Şimdi sıra geldi firewalld için bunu yapmaya.

Çoğu işletim sisteminde ön tanımlı olarak kullanılması önerildiği için isteyenler aşağıdaki betiği kullanabilir.

Betik bana ait değil sadece düzenlemesini gerçekleştirdiğimi hatırlatayım.

#!/usr/bin/env bash

# Instructions:
#
# 1) Place this script in the /root/ directory, give it proper permissions.
#    $ sudo chmod +x /root/open-cloudflare.sh
#
# 2) Open the cron job editor
#    $ sudo crontab -e
#
# 3) Add the following to the last line
#    12 0 * * * root /root/open-cloudflare.sh
#
# https://gist.github.com/rraallvv/602ea1ed32f40074c1c509b5161da77d
# Actual script:

# remove all public rules first
IFS=
\n'
for i in $(sudo firewall-cmd --list-rich-rules --zone=public); do
        echo "removing '$i'"
        sudo firewall-cmd --permanent --zone=public --remove-rich-rule "$i"
done

# IPv4 HTTPS
echo "adding IPv4 HTTPS"
for i in $(curl "https://www.cloudflare.com/ips-v4"); do
        echo "adding '$i'"
        sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="'$i'" port port=443 protocol=tcp accept';
done

# IPv6 HTTPS
echo "adding IPv6 HTTPS"
for i in $(curl "https://www.cloudflare.com/ips-v6"); do
        echo "adding '$i'"
        sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv6" source address="'$i'" port port=443 protocol=tcp accept';
done

# SSH
#firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="myip" port port=22 protocol=tcp accept'
#firewall-cmd --permanent --change-zone=eth0 --zone=public

echo "reloading..."
sudo firewall-cmd --reload

CloudFlare Kullanan Sayfalarda Web Scraping İşlemi Nasıl Yapılır?

İnternet üzerinde hatırı sayılır bir şekilde CloudFlare ve servisleri kullanılmaktadır, yapılan araştırmaya göre ise durum şu şekilde

Cloudflare is used by 81.5% of all the websites whose reverse proxy service we know. This is 16.8% of all websites.

Yani dünyadaki web sitelerin yüzde 16.8 kadarı CloudFlare servisi kullanıyor ve web sitesini koruyor.

Bu web sitelerinde yer alan verileri otomatik bir şekilde almak istediğinizde haliyle CloudFlare direk olarak bot trafiği algılıyor ve engelliyor. Yazacağımız ufak bir kod bu engellemeyi geçmek kısmen mümkün.

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from random_useragent import random_useragent


class RequestsHelper(object):
    """HTTP Request helper"""

    def __init__(self):
        super(RequestsHelper, self).__init__()

        """ Create session for long TTL pages"""

        session = requests.Session()

        retries = 5
        backoff_factor = 0.3
        status_forcelist = (500, 502, 504)

        retry = Retry(
            total=retries,
            read=retries,
            connect=retries,
            backoff_factor=backoff_factor,
            status_forcelist=status_forcelist,
        )

        adapter = HTTPAdapter(max_retries=retry)
        session.mount("http://", adapter)
        session.mount("https://", adapter)

        self.session = session

    def _generate_random_useragent(self):
        """
        Generate random user-agent string

        :return: User-agent string
        """
        randomizer = random_useragent.Randomize()
        return randomizer.random_agent("desktop", "windows")

    def _is_cloudflare_protected(self, r):
        """
        Check if page has protected with Cloudflare

        :param object r:
        :return: Cloudflare anti-ddos challenge status
        :rtype: bool
        """
        server = r.headers.get("Server", "")
        return (
            r.status_code == 503
            and server.startswith("cloudflare")
            and b"jschl_vc" in r.content
            and b"jschl_answer" in r.content
        )

    def resolve_redirection(self, url):
        """
        Resolve redirection and return final url without download page

        :param str url:
        :return: Return final url
        """
        r = self.session.head(url, allow_redirects=True)
        return r.url

    def get(self, url):
        """
        Fetch page content or make HTTP GET request

        :param str url: Endpoint or page URL
        :return: Requests object
        :raises Exception when error happened
        """
        try:
            r = self.session.get(
                url,
                headers={"User-Agent": self._generate_random_useragent()},
                timeout=5,
            )
        except Exception as e:
            raise e

        if self._is_cloudflare_protected(r):
            import cfscrape

            scrapper = cfscrape.create_scraper()
            r = scrapper.get(r.url, timeout=5)

        if b"indows-1254" in r.content:
            r.encoding = "Windows-1254"
        else:
            r.encoding = "utf-8"

        return r

    def post(self, url, data):
        """
        Fetch page content or make HTTP GET request

        :param str url: Endpoint or page URL
        :param dict data: Post data dictionary
        :return: Requests object
        :raises Exception when error happened
        """
        try:
            r = self.session.post(
                url,
                data=data,
                headers={"User-Agent": self._generate_random_useragent()},
                timeout=5,
            )
        except Exception as e:
            raise e

        if self._is_cloudflare_protected(r):
            import cfscrape # pip install cfscrape

            scrapper = cfscrape.create_scraper()
            r = scrapper.post(r.url, data=data, timeout=5)

        if b"indows-1254" in r.content:
            r.encoding = "Windows-1254"
        else:
            r.encoding = "utf-8"

        return r
Python

Peki bütün CloudFlare kullanan sayfalarda bu kod işe yarar mı? Tabii ki de hayır, özellikle hCaptcha aktif edilmiş ve aktif olarak kullanılan sitelerde yukarıda vermiş olduğum kod çalışmayacaktır.

Peki bunun yerine ne gibi bir işlem yapabiliriz, son geliştirmelerle birlikte biraz daha doğru çalışan cloudscraper kütüphanesini kullanabilirsiniz. Nihai kodumuz şu şekilde olacak.

    def get(self, url):
        """
        Fetch page content or make HTTP GET request

        :param str url: Endpoint or page URL
        :return: Requests object
        :raises Exception when error happened
        """
        try:
            r = self.session.get(
                url,
                headers={"User-Agent": self._generate_random_useragent()},
                timeout=5,
            )
        except Exception as e:
            raise e

        if self._is_cloudflare_protected(r):
            import cloudscraper

            scrapper = cloudscraper.CloudScraper()
            r = scrapper.get(r.url, timeout=5)

        if b"indows-1254" in r.content:
            r.encoding = "Windows-1254"
        else:
            r.encoding = "utf-8"

        return r
Python

Bundan sonra web sitesindeki değişiklikleri alabilirsiniz ancak burada şöyle bir durum daha karşınıza çıkacak. Koruma sayfası içindeki parametreler sık sık cloudflare tarafından değiştiriliyor.

Gün sonunda yüksek ücretler istenen residential proxy hizmetlerine geçiş yapmanız gerekebilir.

CloudFlare İle Internet Explorer Tarayıcısının Engellenmesi

Artık internet explorer tarihin bir köşesinde yerini aldı, ama inatla kullanmaya devam edenler olduğunu görüyoruz. Modern tarayıcı desteği ile bütün ürünler ve yazılımlar geliştiriliyor. Internet explorer kullanan bireyleri de sistemden bir şekilde uzak tutmalıyız ki kendilerine yeni bir tarayıcı seçsinler. Üstelik artık Internet Explorer kullanımdan kalktı kullanılmasının bir hükmüde yok.

Internet Explorer Nasıl Engellenir?

CloudFlare ile işlem çok basit. tek yapmanız gereken aşağıdaki adımlardan birini uygulamak, sonrasında kişinin karşısına “Access Denied” sayfası yapıştırılacak.

Engellenecek User-Agent bilgileri sırasıyla aşağıda yer almaktadır.

Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.2; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Plaintext

Firewall -> Tools -> User Agent Blocking ile bu işlemi yapmak isterseniz. “Create Blocking Rule” demeniz yeterli.

user agent blocking, cloudflare user-agent management

Hemen ardından aşağıdaki gibi ayarlamanızı yapın.

create user-agent rule cloudflare, user-agent yasaklama

Yaptığınız nihai değişiklik dört farklı işletim sistemi için aşağıdaki gibi gözükmeli, bu sayede artık internet explorer kullananlar sisteme giriş yapamayacak.

user-agent blocking rule, cloudflare tarayıcı engelleme, internet explorer nasıl engellenir.

CloudFlare Firewall Kullanarak Internet Explorer Nasıl Engellenir?

Firewall Kuralları ile engelleme yapmak isterseniz, aşağıdaki parametreler işinize oldukça yarayacaktır. Bu noktada işletim sistemine göre yapmış olduğumuz ayrımları da ayrıca ekliyoruz.

(http.user_agent eq "Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko") or
(http.user_agent eq "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko") or
(http.user_agent eq "Mozilla/5.0 (Windows NT 6.2; Trident/7.0; rv:11.0) like Gecko") or
(http.user_agent eq "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko") or
(http.user_agent eq "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko") or
(http.user_agent contains "MSIE") 
Plaintext

CloudFlare Page Rules İle Karmaşık URL Yönlendirmeleri Nasıl Yapılır?

Bir URL’i ezberlemesi insanlar için çok zordur. Bu sebeple gidip ya favorileri yada direk alan adını ezberleriz bu URL’ler başından beri kullanıcıların kullanması için değildi, genellikle sunucunun yararına otomatik olarak oluşturuldu ve kullanıldı. “Ne diyor bu adam yaaa” dediğinizi duyar gibiyim, evet sizin anlamanız için oluşturulmuyor ama gün sonunda biz SEO diyerek okunabilir bir hale sokuyoruz, normalde her yerinde query string geçer.

Tamam tamam bunu bir görsel ile anlatalım.

moz url nedir, url yapisi tanım, url yapısını anlatan kopya kağıdı

Tamda ben bu yazıyı kaleme aldığım sıralarda CloudFlare yeni bir özelliğini duyurdu. Dynamic URL Rewriting at the edge with Cloudflare Dinamik bir şekilde istediğiniz her yere yeniden yönlendirme komutları oluşturabilirsiniz. Bunu yaparken size o kadar esneklik sağlar ki kimi zaman web sunucularda yapması çile olan kuralları burada bir çırpıda oluşturabilirsiniz.

İşlemlere başlamadan hemen önce CloudFlare hesabınıza giriş yapın ve aşağıdaki ayarları açın. “Rules > Settings” rotasında görebilirsiniz.

cloudflare dinamik url yapılandırma, cloudflare url normalization, url normalizasyonu

Şimdi bu özelliğimizi açtık artık dönüştürülmüş olan bütün URL’ler bizim okuyabileceğimiz şekilde olacak nasıl mı?

URLNormalleştirilmiş URL
www.example.com/hello/www.example.com/hello/
www.example.com/%68ellowww.example.com/hello
www.example.com\hellowww.example.com/hello
www.example.com/./lang//en/hello./www.example.com/lang/en/hello./

Yani günün sonunda düzgün bir biçimde okunabilir ve anlaşılır bir URL elimize geçecek. Oha lan süper bir olay dimi URL yeniden yazma, istek web sunucusu tarafından alındığında gerçekleşir. Bağlantıda oluşacak bir yavaşlık veya web sunucusunun bu isteği düzgün algılamaması sonucunda pek çok hatalar meydana gelir. Web sunucusu doğru verileri oluşturulan parametrelere göre alır ve ardından tarayıcının adres çubuğundaki URL’de değişiklik yaparak tarayıcıya gönderir.

Aslında her şey tarayıcıya gönderilen bir Location başlığından ibarettir.

yönlendirme yapısı, location parametresi, http location headers

CloudFlare Statik URL Yönlendirme

Kullanıcıların HTTP isteklerinin doğru bir şekilde eşleşmesine statik veya dinamik rewrite kuralları kullanarak URI Path ve/veya Query Stringlerde değişiklik yapmasına olanak tanır. İstek web sitenize uğramadan cloudflare tarafından gerçekleştirilir ve kişi gerekli rotalara yönlendirilebilir. Statik bir rewrite, belirtilen bir URI Path/Query String diğerine değiştirir.

cloudflare statik yönlendirme örneği, statik yönlendirme nedir

İsterseniz bu yönlendirme işlemlerini belirli bir IP adresinden tutunda belirli bir ülkeye de yapabilirsiniz.

CloudFlare Dinamik URL Yönlendirme

Ne demiştik aklınızın kestiği ve mantıklı olan bütün yönlendirmeleri yapabilirdik. Bunu yapmak için biraz regex biraz CloudFlare functions kullanıcaz.

Öncelikli olarak diyeceğiz ki sonu .html olan içerikler ile eşleşirse yeni rotaya gitsin. Söylemesi kadar yazması da aslında kolay.

ends_with(http.request.uri.path, ".html")

Bu işlemin sonucu “True” olarak geldiğinde ise dinamik yönlendirmeye sokarak yeni rotasını belirleyebiliriz.

regex_replace(http.request.uri.path,"^/*.html","/${0}")

Kuralın son hali panel üzerinde şu şekilde gözükecek

cloudflare dinamik yönlendirme, dinamik rewrite,dynamic rewrite rules

Aynı kuralı ayrıca “Page Rule” sekmesinden aşağıdaki gibi hazırlayabiliriz.

cloudflare page rules, cloudflare sayfa yönlendirme, cloudflare üzerinden sayfaların yönlendirilmesi

Yukarda az buçuk bahsettiğimiz normalizasyon işlemi olası bir saldırı vektörünü kapatan yeni bir özelliktir. Bu özellik, kötü niyetli kişilerin, HTTP isteklerinde URL kodlaması kullanarak Cloudflare ürünlerindeki güvenlik kurallarını(WAF vb) atlatılmasını önler.

Bu gelişmiş koruma yöntemi, URL kodlamasının güvenlik özelliklerini atlamak için kullanılamamasını sağlar. Ek olarak, tüm gelen trafiği standart bir formatta normalleştirerek kullanıcı deneyimini iyileştirir.

UFW Kullanarak CloudFlare Trafiğinin Kabul Edilmesi

Vakti zamanın’da CloudFlare kullanan bir web sitesinin yanlış yönlendirmeden doğan sızıntıyı, CloudFlare arkasında Sunucu IP’lerini açığa çıkarmak adlı makalemde açıklamış.

Genel olarak sızıntıyı nasıl çözebileceğinizden kısaca bahsetmiştim. Şimdi sıra geldi iptables ile sadece cloudflare üzerinden gelen trafiğin kabul edilmesini göstermeye.

#!/bin/sh
curl -s https://www.cloudflare.com/ips-v4 -o /tmp/cf_ips
curl -s https://www.cloudflare.com/ips-v6 >> /tmp/cf_ips
ufw allow from 94.55.146.204/32 comment 'Mertcan Home'
for cfip in `cat /tmp/cf_ips`; do ufw allow proto tcp from $cfip to any port 80,443 comment 'Cloudflare IP'; done
# Reload
ufw reload > /dev/null

Bu işlemleri yaptığınız andan itibaren makina sadece SSH bağlantısıyla size yanıt verecek onun dışında dışarıya sadece CloudFlare ile çıkış sağlanacak böylelikle IP aralıklarını tarayan botlara vb uygulamalara yanıt verilmeyeceği içinde leak imkanı kalmayacak. OSINT teknikleri ile bulunması zorlaşmış olacak.

Bunun dışında geçmişte kullanılan IP adreslerini tutan oldukça fazla yer olduğu için bu işlemlerden sonra IP değişikliği yapmanızı şiddetle öneriyorum.

CloudFlare Web Analytics Nedir? Nasıl Kullanılır?

Eylül ayında, tüm web için yeni ve ücretsiz bir Web Analytics ürününü Cloudflare yetkilileri duyurmuştu ve sadece pro hesaplar kullanabiliyordu. Bugün ise, DNS ayarlarınızı değiştirmeden herkesin kullanabileceği Web Analytics uygulamasını duyurdular.

cloudflare web analitik görseli, cloudflare web analitik nasıl kullanılır.
https://blog.cloudflare.com/privacy-first-web-analytics/

Popüler analitik araçları reklama dayalı bir iş modeli ile çalıştığını biliyoruz, bu araçları kullandığımızda kullanıcıların verilerinin reklam modellerine göre kullanılmasına göz yummuş oluyoruz, yani aslında ürün biziz. İşte bu çekincelerin olduğu günümüz şartlarında alternatif birilerinin ortaya çıkıyor olması çok güzel.

Bu noktada CloudFlare‘in geliştirdiği ücretsiz web analitik aracını kullanmaya başlayacağız. Hem ücretsiz hemde kullanıcı verilerini satmayan bir araç, yani en azından geliştiren ekip ve CEO bu şekilde söylüyor.

Nasıl Kurulur ve Kullanılır?

DNS sunucu adreslerinizi CloudFlare üzerine taşımanıza ve direk olarak DNS alt yapınızı değiştirmenize gerek yok sadece size verilen basit bir js dosyasını sitenize ekleyin yeter.

CloudFlare hesabınıza giriş yaptığınızda ana ekranda bulunan sağ menüde değişiklik olduğunu göreceksiniz, bu listenin en altında bulunan Web Analytics tıklıyorsunuz. Veya direk olarak bu linke tıklayarak kayıt oluyorsunuz.

cloudflare Web Analytics, cloudflare web analiz aracı, cloudflare analiz

Bu aşamada sizden web verilerinin izleneceği site adını soracak alan adınızı veya alt alan adınızı doğru bir şekilde girin. Burada önemli olan nokta URL şeklinde alan adınızın girilmeyecek olması.

cloudflare Web Analytics, cloudflare web analiz aracı, cloudflare analiz

Devam ettiğinizde web sitenize eklemek için bir kod verecek, verdiği bu kodu direk olarak </body> etiketinden önce ekliyoruz

cloudflare web analitik görsel, cloudflare analiz

Ardından istatistikler panelimizde 2-3 dakika geçtikten sonra gözükmeye başlayacak, detaylı bir şekilde analitik verilerinizi görebilirsiniz. Verileriniz anlık olarak güncellenecek ve istediğiniz gibi arama yapabileceksiniz.

cloudflare web analiz örnek data, web data

  1. https://blog.cloudflare.com/privacy-first-web-analytics/
  2. https://blog.cloudflare.com/free-privacy-first-analytics-for-a-better-web/

CloudFlare Workers Kullanarak Harici Cronjob İşlerinin Yapılması

CloudFlare geçtiğimiz günlerde workers üzerinden zamanlanmış işleri yapmaya imkan tanıyan özelliğini Introducing Cron Triggers for Cloudflare Workers adıyla duyurdu. Bu özellik sayesinde yapılması gereken zamanlanmış işleri CloudFlare üzerinden gerçekleştirebiliyoruz.

Wordpress’te özellikle insanların başını ağrıtan dahili cronjob ile anlatacağım nasıl kullanılacağını bu özelliğin, normal şartlar altında wordpress’de sayfaya birisi girdiği anda varsa cronjob işlemleri tetiklenir, yönetici sayfası veya yazılar fark etmeksizin bu özellik çalışır.

Peki bu servis ücretli mi? Tabii ki de hayır

Ana sayfada sağda “Workers” alanına giriş yaparak bu süreci çok basit bir şekilde başlatabilirsiniz.

cloudflare workers giris, cloudflare cronjob trigger

Hemen “Create Worker” diyoruz.

cloudflare create worker, cloudflare worker oluşturma

Size kocaman bir alanda solda javascript kod yazabileceğiniz bir alan sağda ise bunun ön izlemesi olacak, soldaki alana aşağıdaki kodumuzu giriyoruz, zamanlanmış görevi oluşturuyoruz. Kendinize göre bunu düzenlemeyi unutmayın.

addEventListener("scheduled", event =>; { event.waitUntil(handleScheduled(event)) }) async function handleScheduled(event) { await fetch("https://mertcangokgoz.com/wp-cron.php?doing_wp_cron") }

Şu şekilde gözükecek

cloudflare worker deploy, worker deployment

Ardından “Save and Deploy” tuşuna basıyorsunuz ve güzelce workerınız kullanıma hazır oluyor. Ardından workerımızın alanına geri geliyoruz. Sıra zamanlanmış triggerimizi ayarlamaya geldi. Workerın altında yer alan “Triggers” alanına geçiş yapıyoruz.

cloudflare cron trigger, zamanlanmış workerlar, cloudflare trigger

“Add Cron Trigger” diyoruz ve artık normal cronjob ayarlar gibi ne kadar zaman aralıkla çalışacağını seçiyoruz, ben wordpress’te bu örneği anlattığım için 5 dakikalık aralar ile çalışmasını istiyorum.

trigger ayarlama, cronjob zamanlama, cloudflare cronjob settings

Kaydettiğimiz andan itibaren worker belirlenen sürelerde ayağa kalkacak ve işini yapıp kapanacak. Başınıza iş olacak bütün cronjob işlerini bu şekilde yapabilirsiniz.

Wordpress WP Cron Nasıl Kapatılır?

Tüm bu işlemlerden sonra mümkünse Wordpress’in kendi özelliklerinden bir tanesi olan WP Cron kapatmanızdır. Bu sayede artık Cronjob işleri kullanıcıların sayfa gezintilerinde değil yukarıda belirlediğimiz aralıklarla çalışacak. Cron ile ilgili sorunlarınızın pek çoğunuda bu şekilde çözüme kavuşturabilirsiniz.

define('DISABLE_WP_CRON', true); 

CloudFlare Arkasındaki Sitelerde “cert-url” Hatasının Çözümü

CloudFlare kullanan bir web sitesinde AMP aktif ettiniz ve karşınıza Google Webmaster aracında aşağıdaki gibi bir hata geldi

İmzalı değişim "cert-url" tarafından başvuruda bulunulan sertifika zinciri ayrıştırılamıyor.

Hatanın görünümü şu şekilde consolda bulunuyor.

cloudflare cert-url hatası, google webmaster tools cert-url error

Erken fark etmek ve çözmek önemli, yoksa AMP sayfalarına erişim kesiliyor. Bunun çözümü CloudFlare üzerinde aşağıdaki ayarın kapatılması oluyor.

cloudflare amp real url kapatma, cloudflare amp sorunu, amp cert-url çözümü

Bu Real URL kapatıldıktan hemen sonra google webmaster araçlarına gidip doğrulama işleminizi başlayabilirsiniz. Hata kalıcı olarak çözülmüş olacak.

CloudFlare Firewall Ayarları Nasıl Yapılır? CloudFlare Firewall ile Wordpress Güvenliği Nasıl Sağlanır?

CloudFlare Firewall kısa süre önce, ücretsiz hesaplar da dahil olmak üzere tüm hesaplar için detaylı kural oluşturmayı aktif etti ve komplex güvenlik duvarı kuralları ekleme imkânı sağladı. Bu kurallar ile WordPress kurulumunuzu hem bilinen hem de açıklanmayan ve bilinmeyen güvenlik açıkları için korumaya alabilirsiniz.

Genel Cloudflare Firewall Kuralları

Burada yer alan bazı kurallar öncelikli olarak Wordpress kullanan web sitelerinin güvenliği için geliştirilmiştir, kuralların bazılarını cloudflare firewall üzerinde değiştirerek başka sistemler içinde istediğiniz gibi kullanabilirsiniz.

Genel olarak botlar ve otomatize saldırı yapanları engelleyecek ve sitenize gelen kötü trafiği filtreleyeceği için google analitik gibi araçlar üzerinde trafik düşüşleri görebilirsiniz lütfen panik yapmayınız.

Security Menüsü altında yer alan WAF sekmesine tıklayın “Create a Firewall rule” deyip aşağıdaki eklemeleri teker teker yapınız. Kural isimlerini ben kendime göre düzenledim.

  • Rule Name: General Content Protection
  • Rule Action: Block
(cf.threat_score gt 14) or 
(not http.request.version in {"HTTP/1.0" "HTTP/1.1" "HTTP/1.2" "HTTP/2" "HTTP/3" "SPDY/3.1"}) or
(http.host eq "mertcangokgoz.com" and not cf.edge.server_port in {80 443}) or
(http.request.uri.path contains "/phpunit") or 
(http.request.uri contains "<?php") or 
(http.cookie contains "<?php") or 
(http.request.full_uri contains "passwd") or 
(http.request.uri contains "/dfs/") or 
(http.request.uri contains "/autodiscover/") or 
(http.request.uri contains "/wpad.") or 
(http.request.uri contains "wallet.dat") or 
(http.request.uri contains "/.env") or
(http.request.uri contains "../") or
(http.request.full_uri contains "webconfig.txt") or 
(http.request.full_uri contains "vuln.") or 
(http.request.uri contains ".sql") or 
(http.request.uri contains ".bak") or 
(http.request.uri contains ".cfg") or 
(http.request.uri contains ".env") or 
(http.request.uri contains ".ini") or 
(http.request.uri contains ".log") or 
(http.request.uri.query contains "bin.com/") or 
(http.request.uri.query contains "bin.net/") or 
(raw.http.request.uri.query contains "?%00") or 
(http.request.uri.query contains "eval(") or 
(http.request.uri.query contains "base64") or 
(http.request.uri.query contains "var_dump") or 
(http.request.uri.query contains "<script") or 
(http.request.uri.query contains "%3Cscript") or 
(http.cookie contains "<script") or 
(http.referer contains "<script") or 
(upper(http.request.uri.query) contains " UNION ALL ") or 
(upper(http.request.uri.query)contains " SELECT ") or 
(raw.http.request.uri contains "../") or 
(raw.http.request.uri contains "..%2F") or
(http.request.uri.path contains ".js.map") or
(http.request.uri.query contains "$_GLOBALS[") or 
(http.request.uri.query contains "$_REQUEST[") or 
(http.request.uri.query contains "$_POST[")
Plaintext
  • Rule Name: Unwanted User-Agents
  • Rule Action: Block
(lower(http.user_agent) contains "?%00") or 
(lower(http.user_agent) contains "$[") or 
(lower(http.user_agent) contains "${") or 
(lower(http.user_agent) contains "absinthe") or 
(lower(http.user_agent) contains "appinsights") or
(lower(http.user_agent) contains "mj12bot") or
(lower(http.user_agent) contains "semrushbot") or 
(lower(http.user_agent) contains "dotbot") or 
(lower(http.user_agent) contains "whatcms") or 
(lower(http.user_agent) contains "rogerbot") or 
(lower(http.user_agent) contains "trendictionbot") or 
(lower(http.user_agent) contains "blexbot") or 
(lower(http.user_agent) contains "linkfluence") or 
(lower(http.user_agent) contains "magpie-crawler") or 
(lower(http.user_agent) contains "mediatoolkitbot") or 
(lower(http.user_agent) contains "aspiegelbot") or 
(lower(http.user_agent) contains "domainstatsbot") or 
(lower(http.user_agent) contains "coccocbot") or 
(lower(http.user_agent) contains "commix") or 
(lower(http.user_agent) contains "crimscanner") or 
(lower(http.user_agent) contains "davclnt") or 
(lower(http.user_agent) contains "datacha0s") or 
(lower(http.user_agent) contains "dirbuster") or 
(lower(http.user_agent) contains "cincraw") or 
(lower(http.user_agent) contains "nimbostratus") or 
(lower(http.user_agent) contains "httrack") or 
(lower(http.user_agent) contains "serpstatbot") or 
(lower(http.user_agent) contains "omgili") or 
(lower(http.user_agent) contains "grapeshotcrawler") or 
(lower(http.user_agent) contains "megaindex") or 
(lower(http.user_agent) contains "petalbot") or 
(lower(http.user_agent) contains "semanticbot") or 
(lower(http.user_agent) contains "cocolyzebot") or 
(lower(http.user_agent) contains "domcopbot") or 
(lower(http.user_agent) contains "traackr") or 
(lower(http.user_agent) contains "bomborabot") or 
(lower(http.user_agent) contains "linguee") or 
(lower(http.user_agent) contains "webtechbot") or 
(lower(http.user_agent) contains "domainstatsbot") or 
(lower(http.user_agent) contains "clickagy") or 
(lower(http.user_agent) contains "sqlmap") or 
(lower(http.user_agent) contains "internet-structure-research-project-bot") or 
(lower(http.user_agent) contains "seekport") or 
(lower(http.user_agent) contains "awariosmartbot") or 
(lower(http.user_agent) contains "onalyticabot") or 
(lower(http.user_agent) contains "buck") or 
(lower(http.user_agent) contains "riddler") or 
(lower(http.user_agent) contains "sbl-bot") or 
(lower(http.user_agent) contains "df bot 1.0") or 
(lower(http.user_agent) contains "pubmatic crawler bot") or 
(lower(http.user_agent) contains "restsharp") or 
(lower(http.user_agent) contains "bvbot") or 
(lower(http.user_agent) contains "sogou") or 
(lower(http.user_agent) contains "barkrowler") or 
(lower(http.user_agent) contains "admantx") or 
(lower(http.user_agent) contains "adbeat") or 
(lower(http.user_agent) contains "embed.ly") or 
(lower(http.user_agent) contains "semantic-visions") or 
(lower(http.user_agent) contains "voluumdsp") or 
(lower(http.user_agent) contains "wc-test-dev-bot") or 
(lower(http.user_agent) contains "gulperbot") or
(lower(http.user_agent) contains "360Spider") or
(lower(http.user_agent) contains "/bin/bash") or 
(lower(http.user_agent) contains "crawler.feedback@gmail.com") or 
(lower(http.user_agent) contains "eval(") or 
(lower(http.user_agent) contains "env:") or 
(lower(http.user_agent) contains "fhscan") or 
(lower(http.user_agent) contains "floodgate") or 
(lower(http.user_agent) contains "go-http-client/") or 
(lower(http.user_agent) contains "nikto") or  
(lower(http.user_agent) contains "python") or
(lower(http.user_agent) contains "masscan") or 
(lower(http.user_agent) contains "mail.ru") or 
(lower(http.user_agent) contains "scrapy") or 
(lower(http.user_agent) contains "webdav-miniredir") or 
(lower(http.user_agent) contains "winhttp.winhttprequest") or 
(lower(http.user_agent) contains "zmeu") or
(lower(http.user_agent) contains "fuzz") or 
(lower(http.user_agent) contains "wp_is_mobile") or 
(lower(http.user_agent) contains "sqlninja") or 
(lower(http.user_agent) contains "yaanibot")
Plaintext

Cloudflare Firewall üzerinde ASN engelleme işlemi istenmeyen sonuçlara sebebiyet verebilir bu sebeple kullanırken çok dikkat etmenizde fayda var.

  • Rule Name: Unwanted ASN
  • Rule Action: Block
(ip.geoip.asnum eq 16276) or 
(ip.geoip.asnum eq 14618) or 
(ip.geoip.asnum eq 16509) or 
(ip.geoip.asnum eq 24940) or 
(ip.geoip.asnum eq 37153) or 
(ip.geoip.asnum eq 32244) or 
(ip.geoip.asnum eq 22611) or 
(ip.geoip.asnum eq 54641) or 
(ip.geoip.asnum eq 47583) or 
(ip.geoip.asnum eq 55293)
Nginx

Daha geniş kapsamlı bir ASN engelleme listesi yapacaksanız bad-asn-list kullanmanızı şiddetle öneririm.

  • Rule Name: Block Scanners
  • Rule Action: Block
(http.user_agent contains "Acunetix") or
(lower(http.user_agent) contains "apache") or
(http.user_agent contains "BackDoorBot") or
(http.user_agent contains "cobion") or
(http.user_agent contains "masscan") or 
(http.user_agent contains "FHscan") or 
(http.user_agent contains "scanbot") or 
(http.user_agent contains "Gscan") or 
(http.user_agent contains "Researchscan") or 
(http.user_agent contains "WPScan") or 
(http.user_agent contains "ScanAlert") or 
(http.user_agent contains "Wprecon") or
(lower(http.user_agent) contains "virusdie") or
(http.user_agent contains "VoidEYE") or
(http.user_agent contains "WebShag") or
(http.user_agent contains "Zeus") or
(http.user_agent contains "zgrab") or
(lower(http.user_agent) contains "zmap") or 
(lower(http.user_agent) contains "nmap") or 
(lower(http.user_agent) contains "fimap") or
(http.user_agent contains "ZmEu") or
(http.user_agent contains "ZumBot") or
(http.user_agent contains "Zyborg")
Plaintext

Wordpress için CloudFlare Kuralları

Genel kuralları ekledikten hemen sonra web sitenizde wordpress kullanıyorsanız aşağıdaki kuralları cloudflare firewall üzerinde ekleyerek ek güvenlik atmanı oluşturabilirsiniz.

  • Rule Name: Wordpress Stufs
  • Rule Action: Block
(http.request.uri.query contains "author_name=") or 
(http.request.uri.query contains "author=" and not http.request.uri.path contains "/wp-admin/export.php") or 
(http.request.uri contains "wp-config.") or 
(http.request.uri contains "setup-config.") or
(http.request.uri.path eq "/wp-comments-post.php" and http.request.method eq "POST" and not http.referer contains "mertcangokgoz.com") or
(http.request.uri.path contains "/xmlrpc.php")
Plaintext
  • Rule Name: Wordpress İmportant Areas
  • Rule Action: Block
((http.request.uri.path contains "/wp-admin/" and not http.request.uri.path contains "/wp-admin/admin-ajax.php" and not http.request.uri.path contains "/wp-admin/theme-editor.php"))
Plaintext
  • Rule Name: Login Protection
  • Rule Action: Captcha
(not ip.src in {1.1.1.1/32} and http.request.uri.path contains "/wp-login.php")
Plaintext
  • Rule Name: Hotlink Protection
  • Rule Action: Block

Bu kuralı kullanırken dikkatli olun bütün site içeriğini yanlışlıkla engelleyebilirsiniz.

not (http.referer contains "mertcangokgoz.com" or http.referer eq "cdn.mertcangokgoz.com" or http.referer eq "www.cloudflare.com")
Plaintext
  • Rule Name: Port Block
  • Rule Action: Block
(http.host eq "mertcangokgoz.com") and not cf.edge.server_port in {80 443}
Plaintext
  • Rule Name: Wordpress Admin IP Whitelist
  • Rule Action: Block
(not ip.src in {1.1.1.1/32} and lower(http.request.uri.path) contains "/wp-admin" and lower(http.request.uri.path) contains "/wp-login.php")
Plaintext

Cloudflare’nin ayrıca ön tanımlı olarak yayınladığı kurallardan faydalanmak isterseniz Common use cases for firewall rules içeriğine göz atabilirsiniz.,

Cloudflare Firewall Üzerinde Page Rules Kullanımı

Bunların hemen ardından “CloudFlare Page rules” kısmını kullanıp birkaç değişiklik yapacağız. Bu yapacağımız değişikliğin ana amacı Layer 7 saldırılarına karşı web sitesine yük binmemesini sağlanmasıdır. Gelen saldırılar önbellek üzerinden yayınlanacak ve yükü dağıtmış olacağız.

cloudflare page rules, cloudflare sayfa kuralları, cloudflare ince ayarlar, cloudflare firewall

Wordpress sitenizin admin alanı için yani wp-admin için aşağıdaki gibi ayarlamayı ihmal etmeyin.

cloudflare wp admin örnek kural, cloudflare page rules wp-admin example rule

Layer 4 Saldırıları için Cloudflare Firewall Ayarları

Cloudflare’nin otomatik DDoS koruma sistemleri, trafiği sürekli olarak analiz eder, ağ ve uygulama katmanlarındaki saldırıları azaltmak için gerçek zamanlı imzalar oluşturur. Ücretsiz paket dahil tüm hesaplarda ön tanımlı olarak Layer 4 DDoS koruması aktiftir.

Ek ayarlar yapmak amacıyla sol menüde yer alan “Security> DDoS” sekmesinde yer alan “Network-layer DDoS attack protection” seçeneği ön tanımlı olarak aktiftir.

cloudflare ddos koruma, cloudflare firewall layer 4 atak koruma

Layer 7 Saldırıları için Cloudflare Firewall Ayarları

Site geneli Layer 7 yani HTTP GET ve türevi saldırılar için cloudflare üzerinde aşağıdaki ayarların yapılması ve site geneli cache ayarlanması yeterlidir, sunucu üzerinde CPU kullanımı yükselmediği sürece genel olarak HTTP saldırılarından etkilenmeyeceksiniz.

cloudflare cache settings, cloudflare önbellek ayarları, cloudflare güvenlik ayarları, cloudflare wordpress güvenliği

Kaynak Sunucu İçin Ek Güvenlik Önlemleri

Ayrıca kaynak sunucunuzu güvenli hale getirmek için aşağıdaki makalelerden faydalanabilirsiniz.