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 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.
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.
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.
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.
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.
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.
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.
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.
Settings > Apple IDPassword & SecurityAutomatic Verification
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.
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.
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.
Safari istenen bu token için apple ile API üzerinden iletişime geçer ve cihazın onaylanmasını ister.
Apple çeşitli cihaz bileşenlerini kontrol edecek, geçerli olduklarını onaylayacak ve ardından Cloudflare’ye bir API çağrısı yapar.
Cloudflare, bir tokken oluşturur, onu tekrar tarayıcıya gönderir, o da kendisine iletilen bu tokeni origin’e gönderir.
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.
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ı
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.
Cloudflare: CDN, güvenlik duvarı, Anycast DNS, Universal SSL ve çok daha fazlasını sağlar üstelik bunu ücretsiz yapar.
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.
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.
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.
İş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.
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
İ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 requestsfrom requests.adapters import HTTPAdapterfrom urllib3.util.retry import Retryfrom random_useragent import random_useragentclassRequestsHelper(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 = sessiondef_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 ==503and server.startswith("cloudflare")andb"jschl_vc"in r.contentandb"jschl_answer"in r.content)defresolve_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.urldefget(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,)exceptExceptionas e:raise eifself._is_cloudflare_protected(r):import cfscrape scrapper = cfscrape.create_scraper() r = scrapper.get(r.url,timeout=5)ifb"indows-1254"in r.content: r.encoding ="Windows-1254"else: r.encoding ="utf-8"return rdefpost(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,)exceptExceptionas e:raise eifself._is_cloudflare_protected(r):import cfscrape # pip install cfscrape scrapper = cfscrape.create_scraper() r = scrapper.post(r.url,data=data,timeout=5)ifb"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.
defget(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,)exceptExceptionas e:raise eifself._is_cloudflare_protected(r):import cloudscraper scrapper = cloudscraper.CloudScraper() r = scrapper.get(r.url,timeout=5)ifb"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.
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 GeckoMozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like GeckoMozilla/5.0 (Windows NT 6.2; Trident/7.0; rv:11.0) like GeckoMozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like GeckoMozilla/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.
Hemen ardından aşağıdaki gibi ayarlamanızı yapın.
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.
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")
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.
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.
Ş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ı?
URL
Normalleştirilmiş URL
www.example.com/hello/
www.example.com/hello/
www.example.com/%68ello
www.example.com/hello
www.example.com\hello
www.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.
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.
İ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.
Kuralın son hali panel üzerinde şu şekilde gözükecek
Aynı kuralı ayrıca “Page Rule” sekmesinden aşağıdaki gibi hazırlayabiliriz.
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.
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.
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.
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.
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ı.
Devam ettiğinizde web sitenize eklemek için bir kod verecek, verdiği bu kodu direk olarak </body> etiketinden önce ekliyoruz
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 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.
Hemen “Create Worker” diyoruz.
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.
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.
“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.
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.
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: UnwantedUser-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.
Wordpress sitenizin admin alanı için yani wp-admin için aşağıdaki gibi ayarlamayı ihmal etmeyin.
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.
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.
Kaynak Sunucu İçin Ek Güvenlik Önlemleri
Ayrıca kaynak sunucunuzu güvenli hale getirmek için aşağıdaki makalelerden faydalanabilirsiniz.