Kaynak kodu: github.com/Alex0176/odoo-web-rbl — AGPL-3, serbestçe kullanılabilir.
İnternette bir Odoo sunucusu işletenin ziyaretçisi eksik olmaz. Arada sırada değil, kesintisiz. On yedi gün boyunca beş web sitemizde 731.297 istek kaydedip değerlendirdik. Bunların 110.511'i ziyaretçi değildi, güvenlik açıklarının, erişim bilgilerinin ve yapılandırma dosyalarının otomatik olarak aranmasıydı.
Bu yazı, bu trafiği tespit eden, puanlayan, kaydeden ve reddeden ve engelleme listesini RBL listesi olarak yayımlayan – yani güvenlik duvarlarının ve ters vekil sunucuların doğrudan okuyabildiği biçimde – Odoo 19 Community için açık kaynaklı bir modül olan Web RBL'i anlatır. Tüm rakamlar gerçek işletmeden alınmıştır.
Modülün yapabilecekleri — işlevlere genel bakış
| İşlev | Ne yapar | Dağıtım |
|---|---|---|
| Desen tespiti | Yoklamaları yol ve uzantıdan tespit eder: .env, .git, yapılandırma dosyaları, bulut anahtarları, CI/CD derleme talimatları, WordPress, PHP, yol geçişi (path traversal), veritabanı yöneticisi, GraphQL, /api/fs/exec üzerinden komut çalıştırma ve benzer arayüzler | engelle |
| Desen başına üç kademe | engelle, say veya bildir — desen başına kodsuz değiştirilebilir | desen başına |
| Eşikler | Engellemeden önce aynı desenden kaç isabet gerektiği; oturum açma için on | oturum açmada 10 |
| Oturum açma savunması | Giriş formu ve XML-RPC/JSON-RPC üzerinden başarısız oturum açmalar, başarısız oturum kontrolleri, veritabanı yöneticisine erişimler — veritabanında, belleğte değil | açık |
| Oturum açmada bot tespiti | On başarısız denemeden sonra bekleme mesajını yok sayıp kapıyı çalmaya devam eden hemen engellenir | engelle |
| Davranış tespiti | Beş dakika içinde yirmi hatalı sayfa üreten ve neredeyse hiç isabetli sayfa üretmeyen adresler — yani okumak yerine tahmin yürütenler | bildir |
| Puanlama 0–100 | Adresin arkasında bir saldırganın olduğundan ne kadar emin olunabilir? Desenin ağırlığından, farklı desen sayısından, dikkat çekici günlerden, etkilenen alan adlarından ve isabet sayısından — açık metinle gerekçelendirilerek | açık |
| Puana göre oturum açma engeli | Ayarlanabilir bir puandan itibaren oturum açma yasaklanır, web sitesi okunabilir kalır | 40'tan itibaren |
| Çalınmış erişim bilgisi şüphesi | Şüpheli bir adresten yapılan başarılı bir oturum açma bildirilir ve isteğe bağlı olarak görev olarak atanır — adres ve gün başına bir kez | açık |
| Tehdit listeleri | Tor çıkış düğümleri, Spamhaus DROP, FireHOL Level 1, blocklist.de önceden yapılandırılmıştır; her ek RBL listesi adres girilerek eklenebilir, günlük karşılaştırma, her liste için ayrı kademe | bildir |
| Oturum açmaya erişim yok | Listeler ve ülkeler için dördüncü kademe: Web sitesi okunabilir, oturum açma formu ve arayüzler kapalıdır — Tor için uygun yanıt | Seçenek |
| Menşe ülke | GeoLite2 üzerinden her isabet ve adres için ülke; veri tabanını modül, ücretsiz bir lisans anahtarıyla kendisi güncel tutar | göster |
| Ülke kuralları | Engelle, oturum açmaya erişim yok, bildir veya açıkça serbest — ülke başına, bilerek varsayılan değer olmadan | yok |
| Yanlış yapılandırmalar | QNAP, Synology, Exchange Autodiscover, ActiveSync, WebDAV/CalDAV/CardDAV tespit edilir, asla engellenmez ve bulgu ile etkilenen alan adıyla birlikte bir iş listesine alınır | bildir |
| Adres başına destek talebi | Bir bulgudan isteğe bağlı olarak bir destek talebi oluşturulur — adres başına tam olarak bir tane; kapatılmış bir talep ikinci kez açılmak yerine yeniden açılır | kapalı |
| Zorunlu sayfalar ve toplayıcılar | Kanonik künye (impressum) yolu her zaman erişilebilir kalır; yabancı yazım biçimlerinin otomatik olarak denenmesi tespit edilir ve isteğe bağlı olarak engellenir | bildir |
| İzin listesi | Asla engellenmeyen adresler ve ağlar; her gün güvenlik duvarından (VPN karşı uçları) ve Googlebot ile Bingbot'un yayımlanmış adres aralıklarından dolar | açık |
| Müşteri eşleştirme | Bir müşterinin ağından gelen isabet ona atanır — izin listesinden, asla elle tahmin edilerek değil | açık |
| Her isabet için alan adı ve tanımlayıcı | Hangi web sitesine erişildi, hangi User-Agent ile — ikisi de erişim günlüğünde yoktur | açık |
| Değerlendirme | Tüm isabetler üzerinde diyagram ve pivot: desen, gün, alan adı, ülke, adres bazında | açık |
| Yem | Problara kanarya değeri içeren uydurma yanıtlar verilir; bu değeri sonradan çağıran, onları okumuş demektir | kapalı |
| RBL yayını | Engelleme listesi, belirteçle (token) korunan ayrı bir adres altında düz adres listesi veya JSON olarak sunulur — HAProxy, OPNsense ve URL listelerini okuyan her güvenlik duvarı için | açık |
bildir, kapalı veya seçenek ile teslim edilen her şey bilerek böyledir: Bir engeli devreye alan kişi bunu, birkaç gün izlediği için yapmalı, varsayılan değer öyle istediği için değil.
Değerlendirme: yedi gün boyunca desen başına isabetler. En yüksek çubuk, .env dosyalarının aranmasıdır.
RBL listeleri: Engelleri yayınlamanın standart bir yolu
RBL, Real-time Blackhole List anlamına gelir. Terim, e-posta dünyasından gelir; orada Spamhaus ve diğerleri doksanlı yıllardan beri kötü niyetli gönderen adreslerinin listelerini yayımlar. İlke son derece basit ve tam da bu yüzden bu kadar yaygındır: Satır başına bir adres, HTTP üzerinden alınabilir, düzenli olarak yeniden yüklenir. Önce ayrıştırılması gereken bir biçim yok, bir araç gerektiren bir arayüz yok.
Neredeyse her güvenlik duvarı ve her ters proxy böyle bir listeyi okuyabilir ve ondan kurallar oluşturabilir. Üreticiler buna farklı adlar verir, mekanizma her yerde aynıdır:
- OPNsense ve pfSense — URL Table Alias: Adres listesini HTTP ile yükle, güvenlik duvarı kurallarında takma ad olarak kullan, saatlik veya günlük aralıkla güncelle
- HAProxy — ACL dosyaları ve Map'ler: bir
http-request denykuralındasrc -f sperrliste.txt, çalışma zamanı API'si üzerinden yeniden başlatmadan yeniden yüklenebilir - nginx — adres dosyası eklenmiş geo modülü veya oluşturulmuş bir
includedosyasındandenyyönergeleri - Fortinet FortiGate — External Block List veya Threat Feed: güvenlik duvarının bir IP listesini aldığı ve politikalarda kullandığı bir URL
- Palo Alto Networks — External Dynamic List (EDL): aynı ilke, güvenlik politikalarında ayrı bir nesne türü olarak
- Check Point — bir URL üzerinden Custom Intelligence Feeds ve IP Block Lists
- Cisco Secure Firewall (Firepower) — kendi liste kaynaklarıyla Security Intelligence Feeds
- Sophos Firewall — Third-Party Threat Feeds: engelleme kuralları için kaynak olarak bir URL'den adres listeleri
- Juniper SRX — beslemelerden Dynamic Address Entries
- MikroTik RouterOS — Address Lists, betik ve
fetchile bir URL'den doldurulur - CrowdSec — desteklenen her sistemdeki bouncer'lar için kaynak olarak kendi listeleri
Web RBL, engelleme listesini tam olarak bu biçimde sunar. Güvenlik duvarı paketleri, web sunucusuna ulaşmadan önce atar — ve onlarla birlikte aynı adresin diğer her denemesini de, örneğin posta sunucusuna veya VPN ağ geçidine yönelik olanları.
Her iki yön, ama doğru yer
Yol tersine de işler: Web RBL'ye herhangi bir RBL listesi girilebilir — bir URL, bir kademe, hepsi bu. Tor çıkış düğümleri, Spamhaus DROP, FireHOL ve blocklist.de önceden yapılandırılmıştır, yenileri üç tıklamayla eklenir. Modül her listeyi adres aralıklarına ayırır ve her istemi bunlara karşı birkaç mikrosaniyede kontrol eder.
Yine de: Yabancı listeleri, öncesindeki güvenlik duvarında kullanmak daha anlamlıdır. Üç nedenle. Güvenlik duvarı tüm hizmetleri görür, yalnızca HTTP'yi değil — Spamhaus listesindeki bir adres posta sunucusunda ve VPN'de de başarısız olmalıdır. Güvenlik duvarı bir bağlantı henüz kurulmadan paket düzeyinde atar ve böylece uygulama sunucusuna hiçbir maliyet çıkarmaz. Ayrıca, bu tür listelerin zaten bakımının yapıldığı yer orasıdır; uygulamadaki ikinci bir kopya, eskiyebilecek ikinci bir yerdir.
O halde modüldeki listeler neye yarar: bir güvenlik duvarının yapamadığı şeye. Güvenlik duvarı oturum açma formunu bilmez. Web RBL, Tor listesinden gelen bir adrese oturum açmaya erişimi reddedip web sitesini yine de sunabilir — anonim olarak okumak isteyen bunu yapabilmeli; anonim olarak parolaları denemek isteyen yapamamalı. Ayrıca listedeki bir adresten gelen başarılı bir oturum açmayı şüpheli durum olarak bildirebilir. İkisi de listeye, oturum açmanın gerçekleştiği yerde ihtiyaç duyar.
Önsezi yerine değerlendirme
Bir kez /wp-login.php isteyen bir adres,
iki günde beş farklı desenle
üç alan adı üzerinde dolaşan bir adresten başka bir şeydir. Web RBL bunu
0 ile 100 arasında bir puana dönüştürür — kendi
gördüklerinden, harici bir hizmet olmadan ve dışarıya sorgu yapmadan.
Bir kayıt: 99 isabet, puan 84 ve düz metinle gerekçe — en ağır desen, beş farklı ciddi desen, iki dikkat çekici gün, yirmiden fazla isabet.
Puan iki şeye karar verir. Ayarlanabilir bir değerden itibaren oturum açma yasaklanır — web sitesi okunabilir kalır, ancak erişim bilgilerini zaten arayan kişi, bulduklarını denemek için fırsat bulamaz. Ve puanı olan bir adresten gelen başarılı oturum açma bildirilir: O zaman biri artık tahmin etmiyor, biliyordur. Ya yetkili kullanıcı seyahatteydi ya da erişim bilgileri elden çıktı — modül buna karar vermez, soru sorabilecek birine sunar. Parolaya bu sırada hiçbir yerde dokunulmaz.
Puanı 40 ve üzeri olanlara göre filtrelenmiş engelleme listesi: isabet sayısı, dikkat çekici günler, etkilenen alan adları ve adres başına son yol.
Web RBL neleri korur — koruma etkisinin ayrıntıları
1. Erişim bilgileri keşfedilmeden kalır
Ölçülen en büyük saldırı sınıfı, Odoo'daki açıkları değil, açıkta kalmış sırları arıyor. On yedi gün boyunca:
- 57.721
.envdosyası isteği — orada veri tabanı parolaları, API anahtarları ve oturum sırları bulunur - 5.535 yapılandırma dosyası isteği
- 4.388 bulut erişim bilgisi isteği:
credentials.json,service-account.json,firebase-adminsdk.json,rclone.conf,.git-credentials - 2.811
.gitdizini isteği — birini bulan, kaynak kodun tamamını geçmişiyle birlikte indirir - 1.907
.github/workflows/deploy.ymlveya.gitlab-ci.ymlgibi derleme talimatları isteği; bunlarda kayıt defterleri ve anahtar adları yer alır
Burada belirleyici olan istek sayısı değil,
farklı adreslerin sayısıdır: /credentials.json
98 adresten geldi, /.git-credentials 92 adresten. Bu, tek
bir tarayıcı değil, dünya çapında aynı anda çalışan bir
standart repertuvardır.
2. Oturum açma denemeleri boşa gider — kalıcı olarak
Odoo, parolaların denenmesine karşı kendi freni ile gelir. Bunun, Odoo kaynak kodunda belgelenmiş üç sınırı vardır: Sayaç, çalışma işleminin belleğinde durur ve her yeniden başlatmada sıfırlanır, engellemek yerine yalnızca geciktirir ve yalnızca parola denetimine kadar ulaşan denemeleri sayar.
Web RBL aynı noktalardan devreye girer, ancak veri tabanına yazar. Böylece şu geçerlidir:
- Durum her yeniden başlatmadan sağ çıkar ve tüm çalışma işlemleri için geçerlidir
- Her iki yol da kaydedilir:
/web/loginoturum açma formu ile/xmlrpc/2/commonve/jsonrpcarayüzleri - Parola denetimine hiç ulaşmayan denemeler de kaydedilir — örneğin geçerli bir oturum işareti olmadan yapılan oturum açmalar
- Veri tabanı yöneticisine yönelik başarısız bir erişim de sayılır; bu, en ağır oturum açma denemesidir
Oturum açmalar için eşik ona ayarlanmıştır ve nedeni bir ölçümdür: On yedi günde başarısız olan dokuz oturum açmanın çoğunluğu müşterilerden geldi; bunlar erişimi kendileri başka bir cihazda kurdular ve bu sırada yanlış alan adını girdiler — bir durumda kendi alan adlarını, yalnızca nokta yerine tire ile. İlk başarısız denemede uygulanacak bir engel, saldırganları değil, kurulum sırasındaki müşterileri vurmuş olurdu.
Buna karşılık sunucu zaten “lütfen kısa süre bekleyin” yanıtını verdiği halde kapıyı çalmaya devam eden kişi hemen engellenir. Bu mesajı bir insan okur ve bekler; onu yok sayan bir programdır. Eşiği sıfır olan ayrı bir desen tam da bu durumu yakalar ve bir meslektaşı vuramaz: Oraya yalnızca, zaten on başarısız denemeyi geride bırakmış ve sonra devam eden kişi ulaşır.
3. Saldırı artık sunucuya hiçbir maliyet çıkarmaz
/@fs/../../.env gibi bir yola yapılan prob, modülden
önce pahalıydı: Odoo hata sayfasını arar, işler, adresin oluşturulması sırasında
nokta bölümlerine takılır ve ardından
hata sayfasının hata sayfasında da başarısız olur. Prob başına iki
yığın izi. On yedi günde bu türden 28.401 hata ölçüldü,
buna ek olarak 9.467 ardışık hata.
Web RBL, ir.http._match içine, yani yol bulmadan önce müdahale eder.
Yanıt, şablonsuz, engelleme denetiminin ötesinde veri tabanı erişimi olmadan
ve günlük satırı olmadan verilir. İzin listesine,
tehdit listelerine ve ülke kurallarına karşı denetim,
önbellekten sıralı adres aralıkları üzerinden çalışır — otuz binin üzerinde aralıkta bile birkaç
mikrosaniye.
4. Güvenlik duvarı saldırganı daha ulaşmadan dışarı atar
Engelleme listesi, HAProxy ve OPNsense'in doğrudan okuyabildiği bir RBL listesi olarak yayımlanır. Saldırgan böylece web sunucusuna hiç ulaşamaz — aynı ana makinedeki başka hiçbir hizmete de. Bir kez kötü niyetli olarak tespit edilen bir erişim, böylece geriye dönük olarak tüm makineyi korur.
Üç kademe: engelle, say, bildir
Boşa giden her istek bir saldırı değildir. Bu yüzden Web RBL üç kademeyi ayırt eder ve kademe, kodlara dokunmadan her desen için değiştirilebilir.
| Kademe | Tetikleyen istek | Adres için sonuç |
|---|---|---|
| engelle | reddedilir | 24 saat engellenir, üç dikkat çekici günden sonra kalıcı olarak |
| say | geçer | yalnızca kaydedilir, engel yok |
| bildir | geçer | bulgu metniyle kaydedilir, asla engellenmez |
Tehdit listeleri ve ülkeler için dördüncü bir kademe vardır: oturum açmaya erişim yok. Web sitesi okunabilir kalır, oturum açma formu ve arayüzler kapalıdır. Bu, şüpheli ama kötü niyetli olması gerekmeyen her şey için orta yoldur — Tor, bir veri merkezi aralığı, müşterisi olmayan bir ülke.
Hangi saldırılar tespit edilir
Tüm desenler gerçek trafiğe karşı test edilmiştir. Farklı adreslerin sayısı bilerek yanında yer alır — bir desenin tek bir tarayıcıyı mı yoksa yaygın bir yöntemi mi yakaladığını gösterir.
| Saldırı sınıfı | İstekler | Adresler |
|---|---|---|
.env toplama | 57.721 | 223 |
| PHP probları | 12.237 | 256 |
| Değerli hedefe yönelik yol geçişi (path traversal) | 10.046 | 64 |
| Yapılandırma dosyaları | 5.535 | 114 |
| Bulut erişim anahtarları | 4.388 | 152 |
| WordPress probları | 3.366 | 385 |
.git toplama | 2.811 | 255 |
| Odoo keşfi (veri tabanı yöneticisi, sürüm sorgusu) | 2.500 | 213 |
Yapay zeka araç zincirleri ve komut yürütme (/mcp, /api/fs/exec) | 2.450 | 74 |
| Derleme talimatları (CI/CD) | 1.907 | 88 |
| GraphQL uç noktaları | 1.878 | 71 |
En yeni sınıf dikkat çekicidir. /api/fs/exec
54 farklı adresten 369 kez istendi — bu
bir okuma erişimi değil, komut çalıştırma girişimidir. Bu tür
hedefler iki yıl önce yoktu; yeni yapay zeka araçlarının
arayüzlerinden ve görev kuyruklarından kaynaklanıyorlar. Savunmasını yalnızca
WordPress ve PHP'ye yönlendiren, bunların hiçbirini görmez. Puanlamada bu sınıf
buna uygun olarak ağır basar.
Tehdit listeleri ve menşe ülke
Dört liste, 32.851 adres aralığı, hepsi “yalnızca bildir” durumunda. Her ek liste bir adres ve bir kademedir.
Yabancı bir liste, başka birinin bilmediğimiz nedenlerle,
hiç görmediğimiz trafik hakkında ortaya attığı bir iddiadır. Yanlış,
eskimiş veya başka bir amaç için tasarlanmış olabilir: blocklist.de en çok
başka yerlerde SSH oturum açma denemesi yapmış
adresleri toplar ve bu, bir web sunucusu hakkında pek bir şey
söylemez. Bu yüzden Web RBL yabancı listeleri kendi engelleme
listesinden ayrı tutar ve bu yüzden varsayılan değer
bildir'dir. Ve kendi izin listesi her zaman kazanır: Tanıdığımız bir müşteri,
üçüncü bir tarafın değerlendirmesinden daha ağır basar.
Menşe ülke her isabette ve her adreste görünür. Değerlendirme için vazgeçilmezdir — kendi ülkesinden sabah saat onda yapılan bir oturum açma denemesi, tek bir müşterisi bile olmayan bir ülkeden gelenden başka bir şeydir. Toplu engelleme için pek uygun değildir ve bunu kendi rakamlarımız söylüyor: Listemizdeki saldırganlar ağırlıklı olarak Belçika, Finlandiya ve Hollanda'daki bulut aralıklarından geldi. Almanca konuşulan bölgenin dışındaki her şey için bir engel onları vurmazdı — ama tatildeki kendi çalışanlarımızı ve iş seyahatindeki müşterileri vururdu.
Ülke kuralları boş olarak teslim edilir ve görünüm nedenini söyler.
Yanlış yapılandırmalar engellenmez, bildirilir
Gerçek trafikteki en sık durum ne saldırı ne de ziyaretçidir, bunun yerine web sunucusunu başka bir şey sanan arızalı yazılımdır:
- Bir QNAP NAS'ın web arayüzüne 1.367 çağrı — hedefi artık doğru olmayan bir eşitleme istemcisi. Tek bir bağlantı 962 kez kapıyı çaldı.
- 65 Autodiscover sorgusu — web alan adını Exchange'i sanan bir Outlook
Bu tür adresler asla engellenmez. Bir engel arızayı gidermez, onu gizler — ve cihazı zaten yanlış ayarlanmış olan kişiyi vurur. Bunun yerine, bulgu metni ve etkilenen alan adlarıyla bir kayıt oluşur ve isteğe bağlı olarak bundan otomatik olarak bir destek talebi çıkar: adres başına tam olarak bir tane; kapatılırsa ve adres yeniden dikkat çekerse, ikinci bir talep açılmak yerine aynı talep yeniden açılır.
QNAP, Synology, Exchange Autodiscover, ActiveSync
ile WebDAV, CalDAV ve CardDAV istemcileri tespit edilir. Desenler
tam dosya adlarını ve dizinleri belirtir, asla yalnızca uzantıları:
Aynı /cgi-bin/ dizininde zararsız
eşitleme çağrıları, printenv.pl gibi klasik problarla
yan yana durur.
İzin listesi: Asla engellenmeyen adresler
Bir yanılgının bedeli her adres için aynı değildir. Bir veri merkezindeki tarayıcı için yanlış alarm hiçbir şeye mal olmaz. Bir konum tünelinin karşı ucu için ise konuma mal olur.
Bu yüzden birincinin önünde duran ikinci bir liste vardır: asla engellenmeyen adresler ve ağlar. Bu liste hiçbir şeyi susturmaz — listede olan hâlâ denetlenir ve kaydedilir, yalnızca sonuç ortadan kalkar. Güvenlik duvarındaki bir istisnadan farkı budur: O kör eder, bu yalnızca sabırlı kılar.
Her gün iki kaynaktan doldurulur: güvenlik duvarının kendisinden, tüm VPN karşı uçlarıyla, yeni kurulan bir tünelin engelleme listesini birinin düşünmesine bağımlı olmaması için — ve Google ile Microsoft'un tarayıcıları (crawler) için yayımladığı adres aralıklarından. Gerçek bir Googlebot'u, kendine öyle diyen bir tarayıcıdan ancak böyle ayırt edebiliriz. Arama motorları asla engellenmemelidir; onları dışarıda bırakan, sitesini dizinlemeden geri çeker.
Bu sırada, karşılaştırmadan daha önemli bir kural geçerlidir: Boş bir yanıt asla silmez. Kaynak yanıt vermezse, boş veya anlaşılmaz yanıt verirse, liste değişmeden kalır. Bir arıza sırasında kendini boşaltan bir izin listesi, akla gelebilecek en kötü anda tüm tünelleri birlikte götürür.
Bir izin listesi kaydı bir müşteri taşıyorsa, onun ağından gelen her isabet ona atanır. Böylece bir yanlış yapılandırmanın hemen bir muhatabı olur; kimsenin adresleri aramasına gerek kalmaz.
Zorunlu bilgiler ve otomatik veri toplayıcılar
Künye (Impressum) sıradan bir sayfa değildir. İnsanlar için erişilebilir kalmalıdır, çünkü üzerindeki bir engel, bir toplayıcının aradığı tam olarak ihlali yaratır. Aynı zamanda ad ve adresin yer aldığı sayfadır — dolayısıyla makinelerle hasat edilmesinin hedefidir.
Avusturya'daki, gömülü Google yazı tipleri nedeniyle yapılan ihtar dalgasında günlükler, yazıların tek tek ziyaretlerden değil, otomatik bir toplu taramadan kaynaklandığını gösterdi: birbiriyle ilgisiz farklı ana makineler, milisaniyelik aralıklarla.
Web RBL bunu istisna yerine kademe düşürerek çözer.
Kanonik /impressum yolu hiçbir desene uymaz ve
her zaman erişilebilir kalır. /impressum.php gibi yabancı yazım biçimleri
— bir Odoo sayfasında
bulunamaz — bildirilir ve makineyle hasadı
kabul etmek istemeyen, bir parametreyi değiştirir.
sitemap ve robots bunun dışındadır
ve esasen engellenemez: Kişisel veri içermezler ve
onları almak her arama motoru tarayıcısının görevidir.
Alan adı ve tanımlayıcı: Erişim günlüğünde olmayanlar
werkzeug'un erişim günlüğü, ne istenen ana makineyi ne de çağıranın tanımlayıcısını kaydeder. Odoo ikisini de elbette alır — ana makine olmadan, birden çok web sitesi olduğunda doğru olanı seçemezdi. Ancak sonradan okunamaz.
Web RBL her isabette ikisini de saklar. Bu, başka türlü cevaplanamayan iki soruyu yanıtlar: Bir yanlış yapılandırmanın hangi web sitesine yöneldiği — ve dolayısıyla alan adının hangi müşteriye ait olduğu — ve bir adresin bir sayfayı mı yoksa hepsini mi ziyaret ettiği. Aynı adresin birbiriyle ilgisiz birden çok alan adı, toplu taramanın belirtisidir ve puanı yükseltir.
Tanımlayıcının ne kadar şey ifade ettiğini, web sitelerimizden birinde yapılan bir değerlendirme
gösterdi: Tüm trafiğin yüzde yetmişten fazlası orada, yüzden fazla
adrese dağılmış tek bir çağırana aitti. Tanımlayıcı olmasaydı bu, dağıtık
bir kazıyıcı (scraper) gibi görünürdü. Bu, OpenAI'nin tarayıcısı GPTBot idi
— sürekli robots.txt istiyordu ve
tamamen kurallara uygun davranıyordu.
Güvenlik yönlerinin ayrıntıları
1. Proxy tespiti — kesinlikle en tehlikeli nokta
Odoo bir ters proxy arkasında çalışıyorsa ve proxy_mode
yanlış ayarlanmışsa, modül her istekte aynı adresi görür:
proxy'nin adresini. Bir engel o zaman tüm ziyaretçileri aynı anda
dışarıda bırakır.
Bu yüzden Web RBL her engellemeden önce adres belirlemenin
güvenilir olup olmadığını kontrol eder. proxy_modenin bir yönlendirme
başlığıyla birlikte olmasını ister, proxy_mode olmadan bir
yönlendirme geldiğinde çalışmayı reddeder ve
aynı şekilde birden fazla ara proxy olduğunda da reddeder. Şüphe durumunda engellenmez.
2. Kendi ağlarımız asla
Özel adres aralıkları, loopback, link-local ve CGNAT sabit olarak dışarıda tutulur. Hiçbir koşulda listeye giremezler, elle bile olsa. Aynı şey yabancı listeler için de geçerlidir: Özel ve ayrılmış aralıklar ile saçma derecede büyük ağlar okunurken çöpe atılır.
3. Kendi hatası web sitesini de beraberinde götürmemelidir
Tüm denetim, her hatayı yakalayan bir koruma içinde çalışır. Burada ters giden bir şey günlüğe yazılır ve istek değişmeden devam eder. Kendi hatasında web sitesini beraberinde götüren bir koruma modülü, hiç olmamasından daha kötüdür. Ayrıca istek yolundaki tüm sorgular, ziyaretçinin tarayıcı dili olmadan ve çevrilmiş alanlara göre sıralama olmadan çalışır — kurulu olmayan bir dile sahip bir ziyaretçi, denetimin başarısız olmasına yol açmamalıdır.
4. Engellemeden önce gözlemlemek
Kurulumdan sonra, listelenen adreslerin olağan isteklerde engellenmesi kapalıdır. Problar reddedilir ve kaydedilir, geri kalan her şey geçer. Böylece birkaç gün boyunca, kimse dışarıda bırakılmadan önce listeye gerçekte kimlerin girdiğini izlemek mümkün olur. Aynısı davranış tespiti, tehdit listeleri ve ülke kuralları için de geçerlidir: önce bildir, görüldükten sonra engelle.
5. Geniş ağlar yerine dar desenler
Yanlış tanınan bir ziyaretçi, gözden kaçan bir probdan daha pahalıdır.
Bu yüzden her desen kendi kademesini taşır ve bu, desen başına
değiştirilebilir. Tek başına bir dosya uzantısı nadiren yeterlidir: .php için
14.012 gerçek prob, bir avuç eski bağlantıya karşı durur, .asp için ise oran tersidir. Bu tür
kararlar tahmin edilmez, ölçülür.
6. Elle verilen bir izin geçerliliğini korur
Bir adrese izin veren kişinin bir nedeni vardı. Başka bir isabet, bu kararı sessizce geçersiz kılmaz.
7. Liste korunuyor, ama bir sır değil
Uç nokta bir belirteç ister ve geçerli belirteç olmadan
403 ile değil, 404 ile yanıt verir — böylece adresin
varlığı hiç doğrulanmaz. Karşılaştırma
sabit zamanlı çalışır. Listenin kendisi gizli hiçbir şey içermez: Bize
kendiliğinden kapı çalmış adreslerden oluşur.
8. Muhasebede sır yok
Başarısız oturum açmalarda denenen kullanıcı adı kaydedilir, parola asla. Veri tabanı yöneticisinde iletilen değerlerden hiçbir şey okunmaz: Orada en başta ana parola bulunur ve bir engelleme listesindeki bir kayıt her veri tabanı yedeğine gider. GeoLite2 lisans anahtarı yalnızca sistem parametresinde bulunur, hiçbir günlük satırında yoktur.
9. Yem kullanılabilir hiçbir şey ifşa etmez
İsteğe bağlı olarak Web RBL, problara benzersiz bir kanarya değeri içeren uydurma içerikle yanıt verir. Bu değeri sonradan çağıran, sahte yanıtı okumuş ve buna göre hareket etmiştir — yanlış alarm bu durumda söz konusu değildir. Yemler, kullanılabilir bilgi, gerçek yol ve geçerli erişim bilgisi içermez. Bu işlev kapalı olarak teslim edilir, çünkü dışarıdan görülebilir şekilde davranışı değiştirir.
Modülün yapamadıkları
Bir güvenlik duvarının ve bir Web Application Firewall'un yerini tutmaz. Yollardaki bilinen yoklama desenlerini, başarısız oturum açmaları ve dikkat çekici davranışları tespit eder — formlara yönelik saldırıları, parametrelere sızma girişimlerini değil.
Ayrıca yalnızca HTTP üzerinden geri gelenleri görür. Bir saldırganın ele geçirdiği veri tabanı veya posta kutusu erişimleriyle ne yaptığı görünmez kalır — ve kanarya değerlerinin erişim bilgisi değil, yol olması tam da bu yüzdendir.
Ve özenin yerini tutmaz: .env problarını reddeden bir modül,
yanlışlıkla sunulan bir .env dosyasını tehlikesiz yapmaz.
Kullanılabilirlik
Web RBL, AGPL-3 altında herkese açık olarak sunulmaktadır ve bizde beş web sitesinde canlı olarak çalışmaktadır:
github.com/Alex0176/odoo-web-rbl
Modül, Odoo 19 Community gerektirir ve base ile web
dışında bağımlılığı yoktur. Destek talebi
entegrasyonu isteğe bağlıdır ve belirli bir destek talebi sistemi gerektirmez;
böyle bir sistem yoksa basitçe hiçbir şey olmaz. Menşe
ülke, MaxMind'in ücretsiz GeoLite2 veri tabanına ihtiyaç duyar;
yoksa alan boş kalır ve diğer her şey
değişmeden çalışır.
Daha fazlası için: Web RBL'nin güvenlik duvarı, iki faktörlü kimlik doğrulama ve yetkilerle birlikte eksiksiz bir güvenlik mimarisine nasıl uyduğu -- adım adım kılavuzla birlikte: Odoo 19 güvenlik mimarisini doğru birleştirme.
Sorularınızı, yorumlarınızı ve hata raporlarınızı memnuniyetle alırız — en çok GitHub'da bir Issue olarak.