Anasayfa > Programlama > Apache > Apache için ModSecurity Kullanıcı Kılavuzu

Apache için ModSecurity Kullanıcı Kılavuzu




ModSecurity, web uygulamaları için açık kaynak kodlu saldırı tespit ve önleme motorudur (engine). ModSecurity aynı zamanda web uygulama güvenlik duvarı olarak da adlandırılabilir. ModSecurity web sunucunun içine gömülmüş bir şekilde, güçlü bir şemsiye gibi davranarak uygulamaları saldırılardan korumaya çalışır.

 

ModSecurity web saldırıları ile başa çıkma gücünüzü arttırarak web sunucu ile bütünleşir. Bahsetmeye değer bazı özellikleri:

 

·         İstek filtreleme; gelen istekler, web sunucusu veya diğer başka bir modül tarafından alınmadan önce, anında analiz edilir. (Daha kesin olarak, ModSecurity’e ulaşmadan önce istekler üzerinde bazı işlemeler yapılır ama bu gömülü olarak çalışmanın gerekliliğindendir.)

 

·         Anti-atlatma teknikleri: yollar (paths) ve parametreler, atlatma teknikleri ile savaşmak için analiz edilmeden önce normalize edilirler.

 

·         HTTP protokolü; motor HTTP’den anladığı için, çok spesifik ve detaylı seviyede filtreleme yapar. Örnek olarak, bireysel parametrelere veya isimli cookie değerlerine bakmak mümkündür.

 

·         POST veri analizi; ModSecurity motoru (engine) POST metodu kullanılarak gönderilen içerikleri de yakalar.

 

·         Denetleme kaydı; her istekğin (POST dahil olmak üzere) bütün detayları sonradan adli analiz için kullanılabilir.

 

·         HTTPS filtreleme; motor web sunucusuna gömüldüğü için, veriye şifre çözme işlemi uygulandıktan sonra erişir.

 

·         Sıkıştırılmış içerik filtreleme; yukarıdaki gibi, motor, istek verisine şifre çözme işlemi uygulandıktan sonra erişir.

 

ModSecurity saldırıları saptamada veya önlemede kullanılabilir.

 

Lisans

 

ModSecurity iki lisans altında kullanılabilir. Kullanıcılar, Açık Kaynak Kodlu / Bedava Yazılım ürünü olarak GNU General Public License (http://www.gnu.org/licenses/gpl.html) gerekleri altında yazılımı kullanmayı tercih edebilirler. Alternatif olarak: bireysel veya site-boyu üretim için son kullanıcı lisansları, uygulamalar, web sunucuları veya güvenlik araçları ile kapalı kaynak dağıtımı için OEM ticari lisansları kullanılabilir. Ticari lisanslar ile alakalı daha fazla bilgi için lütfen Thinking Stone ile bağlantıya geçin.

 

Thinking Tel: +44 20 8141 2161 Fax: +44 87 0762 3934 http://www.thinkingstone.com/ <contact@thinkingstone.com>

Stone

 

 

Teşekkür

 

Bu modül, Apache web sunucusunu üreten ve Apache modül programlamayı öğrendiğim, saatlerini Apache modüllerini yapmak için harcayan güzel insanlar olmasaydı mümkün olmazdı.

 

İletişim

 

ModSecurity, Ivan Ristic ve Thinking Stone tarafından geliştirilmiştir. Yorumlar ve özellik isteklerinizi iletebilirsiniz. Lütfen e-maillerinizi <ivanr@webkreator.com>’a yollayın.

 

Not

 

Lütfen destek isteklerinizi kişisel e-mail adresime yollamayın. Destek isteklerini cevaplamaya zaman harcıyorum ama artık özel olarak yanıtlamıyorum. Çünkü bu diğer kullanıcıların cevapları bulmak için mail arşivlerini kullanmalarını engelliyor. Eğer cevaplara çabucak ihtiyacınız varsa veya garantili cevap zamanlarına ihtiyacınız varsa Thinking Stone’dan ticari destek almayı düşünün.

 

Çeviri bedirhan urgun, e-mailleriniz için: urgunb@hotmail.com. İnteraktif bir web uygulama güvenliği sözlüğü için: http://sozluk.enderunix.org/webappsec.

 

Kurulum

 

Kuruluma başlamadan önce, tercih ettiğiniz kurulum metodunu seçmeniz gerekecektir. İlk olarak, CVS’ten ModSecurity’nin en yeni versiyonunu (en iyi özelliklerle ama daha kararsız) mu kuracağınızı veya en son kararlı dağıtımı mı kullanacağınızı seçmeniz gerekir. Eğer bir kararlı dağıtım seçerseniz, ModSecurity’i ikiliden (binary) kurmanız mümkün olabilir. Yine de her zaman kaynak kodundan derlemeniz mümkündür.

 

Aşağıdaki bir kaç sayfa, bir metodu diğerine seçmenizdeki avantajları hakkında size bilgiler verecek.

 

CVS Erişimi

 

Eğer modülün en son verisyonuna erişmek istiyorsanız, CVS deposundan almanız gerekir. En son kararlı dağıtımından sonra yapılan değişiklikler listesi genellikle web sitesinden (ve CHANGES adlı dosyadan) ulaşılabilir. ModSecurity için CVS deposunu SourceForge (http://www.sf.net/) sunar. Direk olarak veya kullanıyorsanız webden şu adresi kullanarak ulaşabilirsiniz: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/mod-security/

 

Bilgisayarınıza kaynak kodunu indirmek için aşağıdaki iki komutu çalıştırmanız gerekir:

 

$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mod-security login
            
            

 

 

$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/mod-security \
            
            

 

 

> co mod_security
            
            

 

 

İlk satır sizin anonim kullanıcı olarak girişinizi sağlayacak, ve ikinci depodaki bütün mevcut dosyaları indirecektir.

 

Gecelik SnapShot İndirme

 

Eğer CVS’i istemiyor ama hala en yeni sürümü istiyorsanız, gecelik tarball’ı aşağıdaki adresten indirilebilirsiniz:

 

http://www.modsecurity.org/download/snapshot/mod_security-snapshot.tar.gz

 

 

Yeni özellikler mod_security’e, her yeni değişiklikten sonra doğrulama testleri uygulanarak bir bir eklenir. Bu, CVS’teki her sürümün her zaman kullanılabilir olmasını sağlar.

 

Sabit (Stable) Dağıtım İndirme

 

Sabit (kararlı) dağıtımları indirmek için http://www.modsecurity.org/download/ adresine gidin. İkili (binary) dağıtımlar her zaman hazır değildir. Eğer hazırsa, indirme sayfasında listelenirler. Eğer hazır değilse, kaynak kodu dağıtımını indirin.

Kaynaktan Kurma

 

Kaynaktan kurarken iki seçeneğiniz vardır: modülü web sunucusuna kurmak, mod_security.c’yi dinamik paylaşılan nesnesine (DSO) derlemek.

 

DSO

 

 

DSO olarak kurmak daha kolaydır, ve prosedür bütün Apache dalları için aynıdır. İlk olarak, dağıtımı bir yere açın (her hangi bir yer olur), ve modülle beraber derleyin:

 

# /apachehome/bin/apxs -cia mod_security.c
              
              

 

 

Bundan sonra Apache’yi durdurup ve başlatmanız gerekir (Eğer yeniden başlatmaya (restart) çalışırsanız bir segfault alabilirsiniz).

 

# /apachehome/bin/apachectl stop
              
              

 

 

# /apachehome/bin/apachectl start
              
              

 

 

Not

 

apxs aracının kurulu olmadığı platformlar hakkında insanlardan şikayet e-postaları almıştım. Bazı Unix dağıtımlarında bu araç (apxs) ayrı bir pakette dağıtılmaktadır. Problem bu paketin kurulum ile gelmediğinde ortaya çıkmaktadır. Bu problemi çözmek için sağlayıcınızın verdiği ve kendi özel yapım modülünüzü nasıl ekleyeceğinizi açıklayan dokümanını okuyun. (Bazı RedHat platformlarında apxs aracına erişmek için http-devel paketini kurmanızı gerekir.)

 

Apache 1.x ile Statik Kurulum

 

Bir modül statik olarak derlendiğinde, web sunucunun gövdesine gömülür. Bu metod bir miktar daha hızlı bir çalıştırılabilir (executable) üretir ama derleme metodu (ve daha sonra yönetimi) biraz daha karmaşıktır.

 

$ cd <apache1-source>
              
              

 

 

$ cp <modsecurity-source>/apache1/mod_security.c ./src/modules/extra
              
              

 

 

$ ./configure \
              
              

 

 

> --activate-module=src/modules/extra/mod_security \
              
              

 

 

> --enable-module=security
              
              

 

 

Normal olarak yaptığınız gibi web sunucusunu derleyin, kurun ve başlatın.

 

Apache 2.x ile Statik Kurulum

 

Apache 2.x ile statik derleme için tek yapmanız gereken modülün kaynak kodunu Apache kaynak kodu ağacına kopyalamanız ve Apache’i yeniden yapılandırmanızdır:

 

$ cd <apache2-source>
              
              

 

 

$ cp <modsecurity-source>/apache2/mod_security.c ./modules/proxy
              
              

 

 

$ ./configure \
              
              

 

 

> -enable-security \
              
              

 

 

> --with-module=proxy:mod_security.c
              
              

 

 

Apache 2.x Kurulumuna Entegre Etmek

mod_security’i Apache 2.x kurulumuna entegre etmeyi seçebilirsiniz.

 

$ cd <modsecurity-source>/apache2
              
              

 

 

$ mkdir -r <apache2-source>/modules/security
              
              

 

 

$ cp mod_security.c Makefile.in config.m4 <apache2-source>/modules/security
              
              

 

 

$ cd <apache2-source>
              
              

 

 

$ ./buildconf
              
              

 

 

Bu noktadan sonra mod_security, Apache’iye kurulum ile beraber gelen diğer modüller gibi görünecektir ama varsayılı olarak (by default) derlenmeyecektir. Çalışır duruma getirmek için aşağıdakileri uygulayın:

 

$ ./configure --enable-security
              
              

 

 

İkiliden (binary) Kurulum

 

Bazı durumlarda, modülü ikili (binary) olarak kurmak isteyeceksinizdir. Şu an itibariyle indirmek için sadece Windows ikililerini bulunduruyorum. İkiliden kurarken, dağıtımda büyük ihtimalle her iki Apache dalına ait iki DSO kütüphanesine sahip olacaksınız. Kullandığınız sürüm için uygun olanı seçin. Sonra aşağıdaki gibi devam edin:

 

Apache 1.x

 

 

mod_security.so (Unix için) veya mod_security.dll (Windows için) dosyalarını libexec/ dizinine (bu dizin Apache kurulumuna bağıldır, kaynak ağacına değil) kopyalayın. Daha sonra httpd.conf dosyasına aşağıdaki satırı ekleyin. 

 

LoadModule security_module    libexec/mod_security.so
              
              

 

 

Hali hazırdaki yapılandırmanıza bağlı olarak (modül yükleme sırasını açık olarak belirtmiş olabilirsiniz) AddModule direktifi ile modülü kullanmayı aktive etmeniz gerekebilir.

 

AddModule mod_security.c
              
              

 

 

Çoğu durumunda satırı nereye eklediğiniz önemlidir. mod_security’i modül zincirinde son olarak çalıştırmanız önerilir (ve aslında dahili chroot özelliğini kullanmayı amaçlıyorsanız bu adım gereklidir).  Daha fazla bilgi için “chroot desteği için gerekli modül sıralaması (Apache 1.x)” bölümünü okuyun.

 

Apache 2.x

 

 

mod_security.so (Unix için) veya mod_security.dll (Windows için) dosyalarını modules/ dizinine (bu dizin Apache kurulumuna bağıldır, kaynak ağacına değil) kopyalayın. Daha sonra httpd.conf dosyasına aşağıdaki satırı ekleyin.

 

 

LoadModule security_module    modules/mod_security.so
              
              

 

 

Yapılandırma

 

ModSecurity yapılandırma direktifleri yapılandırma dosyanıza (tipik olarak httpd.conf) direk olarak eklenir. Web sunucu çalışmaya başladığında, modülün çalışıp çalışmayacağının belli olmadığı (modülün var olup olmadığı) durumlarda geleneksel olarak modülün yapılandırma direktifleri <IfModule> kap etiketlerinin (container tag) içine eklenir. Bu Apache’nin, modül aktif olmadığı zamanlarda yapılandırma direktiflerini görmezden gelmesini sağlar.

 

<IfModule mod_security.c>
          
          

 

 

    # mod_security configuration directives
          
          

 

 

    # ...
          
          

 

 

</IfModule>
          
          

 

 

Apache, yapılandırma verilerinin birden fazla dosyada bulunmasına izin verdiği için ModSecurity yapılandırma direktiflerini tek bir dosyada (mesela modsecurity.conf) gruplamak ve httpd.conf ‘dan Include direktifi ile içermek mümkündür.

 

Include conf/modsecurity.conf
          
          

 

 

Filtrelemeyi Açma/Kapama

 

Varsayılı olarak filtreleme motoru kapalıdır. İstekleri gözlemek için aşağıdakini yapılandırma dosyanıza ekleyin:

 

SecFilterEngine On
            
            

 

 

Bu parametre için desteklenen parametre değerleri:

 

·         On - her isteği analiz et

 

·         Off - hiçbirşey yapma

 

·         DynamicOnly - Sadece yürütme esnasında dinamik olarak üretilen istekleri analiz et. Bu seçeneği kullanarak web sunucunuzun değerli CPU çevrimlerini (cycle) statik dosyalar için gönderilen istekleri kontrol etmek için harcamasına engel olabilirsiniz. ModSecurity’nin, bir isteğin dinamik olarak üretilip üretilmediğine nasıl karar verdiğini anlamak için "Neyin kaydedileceğini seçme" bölümünü okuyun.

 

POST tarama

 

İstek gövde verisi (veya POST verisi) tarama özelliği varsayılı olarak (by default) kapalıdır. Kullanmak için açmanız gerekir:

 

SecFilterScanPOST On
            
            

 

 

mod_security, istek gövdesi için iki kodlama tipini destekler:

 

·         application/x-www-form-urlencoded - form verisini iletmek için kullanılır

 

·         multipart/form-data - dosya iletmek için kullanılır

 

Diğer kodlamalar çoğu web uygulamaları tarafından kullanılmazlar. Sadece bu kodlama tiplerinin web sunucusu tarafından kabul edilmesini sağlamak için aşağıdaki satırı yapılandırma dosyanıza ekleyin:

 

SecFilterSelective HTTP_Content-Type \
            
            

 

 

"!(^$|^application/x-www-form-urlencoded$|^multipart/form-data;)"
            
            

 

 

Tamponlamayı (Buffering) dinamik olarak durdurma

 

İstek bazında POST verisi tarama özelliğini kapatmak mümkündür. Eğer ModSecurity, MODSEC_NOPOSTBUFFERING çevre değişkeninin tanımlı olduğunu görürse POST veri taramasını yapmayacaktır. Mesela, karşıdan dosya yüklemeleri için POST veri tamponlama özelliğini kapatmak için aşağıdakini kullanın:

 

SetEnvIfNoCase Content-Type \
            
            

 

 

"^multipart/form-data;" "MODSEC_NOPOSTBUFFERING=Do not buffer file uploads"
            
            

 

 

Neden tamponlamanın kapatıldığını açıklamak için MODSEC_NOPOSTBUFFERING değişkenine atanan değer, hata ayıklama (debug) kaydına yazılacaktır.

 

ModSecurity’i dinamik olarak kontrol etme

 

İstek bazında ModSecurity’i açmak veya kapatmak da mümkündür. Bu da MODSEC_ENABLE çevre değişkeni ve SetEnvIf ve SetEnvIfNoCase direktifleri ile mümkündür. Eğer MODSEC_ENABLE tanımlı değilse SecFilterEngine ile belirlenen yapılandırma kullanılacaktır. Eğer MODSEC_ENABLE tanımlı ise SecFilterEngine direktifinin değeri görmezden gelinecektir. MODSEC_ENABLE değerler aynı SecFilterEngine direktifindeki gibidir: On, Off, veya DynamicOnly.

 

Bölünmüş transfer (Chunked transfer) kodlama

 

HTTP protokolü, veri boyutunun önceden bilinmediği hallerde kullanılan bir istek transfer metodunu destekler. İsteğin gövdesi (body) parçalar halinde ulaştırılır. Ve metodun ismi (bölünmüş transfer kodlama) de buradan gelir. ModSecurity şimdilik parçalanmış transfer isteklerini desteklemez; parçalanmış kodlama kullanılan bir istek yapıldığında isteğin gövdesini (body) görmezden gelir. Apache bu kodlama metodunu desteklese de çoğu modül (mesela, Apache 1.3.x PHP modülü) desteklemez.

 

Açık bırakıldığında bu metod saldırgana kötü amaçlı verileri gizleyerek yollama imkanı tanır. Saldırganların bu zayıflığı gerçeklemelerini önlemek için aşağıdaki satırı yapılandırma dosyanıza ekleyin:

 

SecFilterSelective HTTP_Transfer-Encoding "!^$"
            
            

 

 

Bu durum, parçalanmış (bölünmüş) transfer kodlama kullanma yoluyla cevap yollama kabiliyetinizi etkilemez.

 

Varsayılı (Default) İşlem Listesi

 

Ne zaman bir kural bir istekle eşleşse, bir veya daha fazla işlem uygulanır. Bireysel filtreler kendi işlemlerini içerebilir ama bütün filtreler için varsayılı bir işlem kümesi tanımlamak daha kolaydır. (İsterseniz her kural için işlem de koyabilirsiniz.) Varsayılı işlemleri SecFilterDefaultAction direktifi ile tanımlarsınız. Mesela, aşağıdaki satır, motoru her kural eşleşmesinde kayıt tutacak ve isteği 404 durum kodu ile reddecek şekilde yapılandıracaktır.

 

SecFilterDefaultAction "deny,log,status:404"
            
            

 

 

SecFilterDefaultAction  direktifi sadece bir parametre kabul eder; virgül işaretiyle ayrılmış işlemler. Burada tanımladığınız işlemler, kendi işlemleri olan kurallar hariç, her filtre eşleşmesinde kullanılacaktır.

 

Not

 

1.8.6’dan itibaren, eğer hayati olmayan (non-fatal) varsayılı işlem listesi (istekleri reddetmeyen bir liste, mesela log,pass) tanımlarsanız böyle bir işlem listesi ilklendirme (initialization) safhasında görmezden gelinecektir. İlklendirme safhası istek hakkında bilgi edinmek için dizayn edilmiştir. Hayati olmayan işlemlere izin vermek, isteğin bazı bölümlerinin kaybolmasına neden olacaktır. Bu bilgiler dahili süreç için gerekli olacağından bu tür işlemler kabul edilemez. Eğer ModSecurity’nin “sadece algıla” modunda çalışmasını istiyorsanız bütün örtülü denetlemeleri kapatmalısınız (URL kodlama denetlemesi, Evrensel kod -Unicode- kodlama denetlemesi, cookie format denetlemesi, ve bayt aralığı kısıtlaması).

 

Not

 

Bazı işlemler varsayılı listede bulunamaz. Bunlar; id, rev, skipnext, chain, chained.

 

 

Örtülü Denetim

 

1.8.6. ile birlikte örtülü istek denetimi (yapılandırıldığı takdirde) sadece istek işleminin başlangıcında yapılacaktır. Örtülü denetim istek satırına ve başlıklarına yapılacak kontrollerden oluşur.

 

Not

 

1.9dev4 ile beraber evrensel kod denetimi ilk örtülü istek denetiminin parçası olduğunda Referer başlığına uygulanmaz. Bunun nedeni, bu başlığın çoğunlukla diğer web sitelerinden bilgiler içermesidir, ve bu sitelerdeki kodlamanın korunan sitenin kodlamasından farklı olmasıdır.

 

Filtre Kalıtımı

 

Üst dizinlerde tanımlanan filtreler normal olarak içiçe yazılan Apache yapılandırma kapsamı tarafından kalıtılırlar. Bu davranış çoğu durumda kabul edilebilir (ve bazen gereklidir), ama her zaman değil. Bazen bu kontrolleri sitenin bazı bölümlerinde gevşetmek gerekir. SecFilterInheritance direktifi kullanılarak:

 

SecFilterInheritance Off
            
            

 

 

ModSecurity’e üst filtrelerini görmezden gelmesini ve kurallara yeni baştan başlamasını söyleyebilirsiniz. Bu direktif sadece kuralları etkiler. Yapılandırma, her zaman üst kapsamdan kalıtılır ama bunu uygun yapılandırma direktiflerini kullanarak istediğiniz gibi değiştirebilirsiniz.

 

Not

 

Yapılandırma ve kural kalıtımı varsayılı olarak (by default) her zaman açıktır. Eğer kalıtım özelliği kapatılan kapsam altında alt kapsamınız varsa ve eğer bu alt kapsamda da kalıtımı kapatmak istiyorsanız kalıtımı tekrar doğrudan, direktif yardımı ile, kapatmanız gerekecektir.

 

Üst kapsamdan gelen kuralları kalıtım yoluyla almak istemiyorsanız, yeni kapsam için yeni kurallar yazabilirsiniz veya basitçe Include direktifini kullanarak aynı kuralları diğer bir çok kapsama dahil edebilirsiniz.

 

Bazen alt kapsamda sadece küçük değişiklikler gerekebilir. Bu tür durumlarda seçici kalıtım seçeneğini kullanmayı seçebilirsiniz. Bunu, aşağıdaki iki direktif yardımıyla başarabilirsiniz:

 

·         SecFilterImport - üst kapsamdan tek bir kural dahil etmek için. Bu direktif alt kapsamda baştan başlamak için ve üst kapsamdan sadece seçilen kuralları dahil etmek için faydalıdır.

 

·         SecFilterRemove - hali hazırdaki kapsamdan bir kural çıkarmak için. Bu direktif üst kapsamdaki ile aynı kural kümesi ile başlamak ve sadece seçilen kuralları silmek istediğiniz zaman faydalıdır.

 

SecFilterImport ve SecFilterRemove direktiflerinin her ikisi de bir kural ID’leri listesi kabul ederler. Hedef kuralların ID’leri olmak zorundadır (bu, ID işlemi kullanılarak yapılır). Bu direktifler yapılandırma dosyasında bulundukları sıra ile çalıştırılırlar. Bu nedenle, SecFilterRemove direktifi ile kural çıkarmak ve sonra SecFilterImport direktifi ile kural eklemek mümkündür. Aşağıda, aynı yapılandırma kurallarını farklı yollarla üreten iki örnek bulabilirsiniz.

 

Not

 

Eğer bir hedef kural ID’si zincirin bir parçası olan kuralı gösterirse, import ve remove direktifleri sadece ID’inin gösterdiği kuralı değil bütün zinciri etkileyecektir.

 

Örnek 1: üst kapsamındaki kurallar kalıtılmaz, ama sadece bir kural dahil edilir.

 

SecFilter XXX id:1001
            
            

 

 

SecFilter YYY id:1002
            
            

 

 

SecFilter ZZZ id:1003
            
            

 

 


            
            

 

 

<Location /subcontext/>
            
            

 

 

    SecFilterInheritance Off
            
            

 

 

    SecFilterImport 1003
            
            

 

 

</Location>
            
            

 

 

Örnek 2: iki kural çıkarılarak, kurallar üst kapsamdan kalıtılır (dahil edilir).

 

SecFilter XXX id:1001
            
            

 

 

SecFilter YYY id:1002
            
            

 

 

SecFilter ZZZ id:1003
            
            

 

 


            
            

 

 

<Location /subcontext/>
            
            

 

 

    SecFilterRemove 1001 1002
            
            

 

 

</Location>
            
            

 

 

Not

 

Apache web sunucusu çok çeşitli kapsamları destekler (mesela, <Directory>, <Location>, <Files>, ...). Kapsamların birleştirildikleri sıra önemlidir. Kalıtımı ve çeşitli kapsamları birleştirmeyi denememelisiniz. Eğer birleştirmek zorundaysanız, düşündüğünüz gibi çalıştığını doğrulamak için yapılandırmayı test edin ve Apache kapsam birleştirme dokümanlarını dikkatlice okuyun: http://httpd.apache.org/docs-2.0/sections.html#mergin.

 

 

Çok kullanıcılı ortamlarda filtre kalıtımı

 

Çok kullanıcılı ortamlarda ModSecurity çalıştırıdığınızda, ve kullanıcılarınızın .htaccess dosyalarında kurallar kullanmalarına izin verildiğinde, üst kapsamdan kural dahil etmelerine izin vermeyebilirsiniz. Bunu başarmak için iki yol vardır.

 

Not

 

Kullanıcılarınıza güvenmiyorsanız (mesela, web hizmeti veriyorsanız), ModSecurity’e ulaşmalarına asla izin vermemelisiniz. .htaccess olanağı ModSecurity yapılandırmasını uygulama kodunda tuttuğundan, kısıtlı yönetim kontrol yetki dağıtımı için faydalıdır. Ama kullanıcıların yapılandırmayı değiştirme olasılıkları olan durumlarda değil. Eğer kötü niyetli (güvensiz) bir ortamdaysanız, .htaccess özelliğini ModSecurity’i -DDISABLE_HTACCESS_CONFIG sekmesi ile derleyerek tamamen kapatmalısınız.

Öncelikle, bazı kuralları zorunlu kılmak için zorunlu işlem zincirini kullanabilirsiniz. Bu tür kurallar alt kapsam tarafından her zaman kalıtılacaktır.

 

Diğer bir yöntem SecFilterInheritanceMandatory direktifini kullanarak kapsamdaki bütün kuralları alt kapsam için zorunlu hale getirmektir.

 

SecFilterInheritanceMandatory On
            
            

 

 

Not

 

SecFilterInheritance özelliğinin kapsamda açık olması gibi, SecFilterInheritanceMandatory özelliği de, üst kapsamda kullanılan değerler ne olursa olsun, bir kapsamda her zaman kapalıdır.

 

Bu tür bir durumda ne olacağını merak ediyor olabilirsiniz:

 

SecFilter XXX id:1001
            
            

 

 

SecFilterInheritanceMandatory On
            
            

 

 

<Location /subcontext/>
            
            

 

 

    SecFilterInheritance Off
            
            

 

 

    SecFilter YYY id:1002
            
            

 

 

    SecFilter ZZZ id:1003,mandatory
            
            

 

 

</Location>
            
            

 

 


            
            

 

 

<Location /subcontext/another/>
            
            

 

 

    SecFilterRemove 1001 1002 1003
            
            

 

 

    SecFilter QQQ id:1004
            
            

 

 

</Location>
            
            

 

 

Ana kapsamda kural kalıtımı zorunlu olduğundan, /subcontext/ kapsamı 1001 numaralı kuralı, SecFilterInheritance Off kuralına rağmen, kalıtacaktır. Bu alt kapsam önce 1001 kuralını, daha sonra 1002 ve 1003 numaraları koşacaktır.

 

Ana kapsamdan, zorunlu kural 1001, silme çabalarına rağmen /subcontext/another/ kapsamına da iletilecektir. Bu, mandatory işlemi kullanılarak kalıtım için zorunlu hale getirilen kural 1003 için de geçerlidir. SecFilterRemove 1001 1002 1003 direktifi, öte yandan, 1002 numaralı kuralı silmekte başarılı olacaktır çünkü kalıtım /subcontext/ kapsamında zorunlu değildir. Bu nedenle, bu kapsam ilk olarak 1001 ve 1003 daha sonra 1004 kurallarını koşacaktır.

 

Not

 

skip işlemini kullanan kurallarını içermeden veya silmeden kaçınmalısınız. Eğer çok dikkatli değilseniz, istediğinizin dışında bir şeyler yapan bir yapılandırma ile karşılaşabilirsiniz.

 

URL Kodlama Denetimi

 

Özel karakterler URL içerisinde gönderilmeden kodlanmalıdırlar. Her karakter üç karakterden oluşan ve XY’nin bir hexadecimal karakter kodunu temsil ettiği %XY kombinasyonu ile değiştirilebilir. (daha fazla detay için http://www.rfc-editor.org/rfc/rfc1738.txt)  Hexadecimal sayılar sadece A’dan F’ye olan harfleri içerir, ama saldırganlar kod çözme algoritmasını kandırmak için diğer harfleri de kullanırlar. ModSecurity verilen bütün kodlamaları doğru olduklarını anlamak için kontrol eder.

 

URL kodlama denetimini aşağıdaki satır ile açabilirsiniz:

 

SecFilterCheckURLEncoding On
            
            

 

 

Not

 

Bu direktif multipart/form-data (dosya yükleme) kullanıldığında bir POST verisindeki kodlamayı kontrol etmez. Gerekmez çünkü bu kodlamada URL kodlama kullanılmaz.

 

Evrensel Kodlama Denetimi

 

Diğer bir çok özellik gibi Evrensel kodlama denetlemesi varsayılı olarak kapalıdır. Eğer uygulamanız veya alttaki işletim sisteminiz evrensel kodu kabul ediyor veya anlıyorsa bu özelliği açmalısınız.

Not

 

Evrensel kod ve UTF-8 kodlama hakkında daha fazla bilgi RFC 2279’da bulunabilir (http://www.faqs.org/rfcs/rfc2279.html).

 

SecFilterCheckUnicodeEncoding On
            
            

 

 

Bu özellik UTF-8 kodlamanın kullanıldığını varsayar ve üç tip hatayı kontrol eder:

 

·         Yetersiz bayt.  UTF-8 iki, üç, dört, beş ve altı baytlık kodlamaları destekler. ModSecurity bir veya daha fazla baytın eksik olduğu durumları bulur.

 

·         Geçersiz kodlama. Bir çok karakterin ilk iki bitlerinin 0x80 olması gerekmektedir. Saldırganlar bunu kullanarak evrensel kod çözücülerini alt etmek için kullanabilirler.

 

·         Çok uzun karakterler. ASCII karakterleri evrensel kod uzayına direk olarak eşlenirler ve bu nedenle sadece 1 bayt ile gösterilirler. Ama, bir çok ASCII karakterleri iki, üç, dört, beş ve altı karakterler şeklinde de kodlanabilir ve böylece kod çözücüleri bu karakterlerin farklı karakterler olduğuna inandırabilirler (ve böylece güvenlik kontrollerini geçebilirler).

 

Bayt Aralığı Kontrolü

 

İsteklerin içerisindeki baytların sadece belli bir aralıkta olmalarını sağlayabilirsiniz. Bu yığıt taşması (stack overflows) saldırılarını önlemekte faydalı olabilir (çünkü bu saldırılar genelde rasgele ikili -binary- içerik içerirler). Sadece 32’den 126’ya kadar (kapsayacak şekilde) bayt değerlerine izin vermek için, aşağıdaki direktifi kullanın:

 

SecFilterForceByteRange 32 126
            
            

 

 

Varsayılı aralık değerleri 0 ve 255’tir. Yani bütün bayt değerleri kabul edilir.

 

Not

 

Bu direktif POST içerisindeki bayt aralıklarını multipart/form-data kodlama kullanıldığında (karşıdan dosya yükleme) kontrol etmez. Bu şekilde ikili (binary) dosyaların karşıdan yüklenmesi bir problemle karşılanmaz. Ama, bu tür bir istekten parametreler alındıktan sonra geçerli bayt aralıkları kontrol edilir.

 

Diğerlerinin ModSecurity’i Görmesine İzin Verilmesi

 

1.9’dan önce ModSecurity SecServerResponseToken direktifini desteklerdi. Kullanıldığında, bu direktif web sunucusu imzasında modülün var olup olmadığını kontrol ederdi. Bu direktif 1.9’da artık çalışmıyor. Kullanıldığında, hata kaydına bir uyarı mesajı düşecektir.

 

Kurallar

 

Filtreleme motoru çalışır hale getirildiğinde, her gelen istek yakalanır ve işlemden geçirilmeden önce analiz edilir. Analiz istek formatını denetlemek için dizayn edilen bir seri kontrollerle başlar. Bu kontroller yapılandırma direktifleri kullanılarak kontrol edilebilir. İkinci aşamada, istek, kullanıcı tarafından tanımlanan ve eşlenen filtrelerden geçer. Bu eşleşmenin sonucu pozitif olursa, belli işlemler uygulanır.

Basit filtreleme

 

Filtrelemenin en basit formu, isminden de anlaşılacağı gibi basittir. Şuna benzer:

 

SecFilter KEYWORD
            
            

 

 

Bunun gibi her basit filtre istek içerisinde anahtar sözcüğü arar. Arama çok geniş yapılır; isteğin ilk satırına (GET /index.php?parameter=value HTTP/1.0 gibi) uygulanır. POST isteklerinde, isteğin gövdesi de aranır (tabi ki istek gövdesi tamponlaması -buffering- desteklenirse).

 

Yol (path) normalizasyonu

 

Filtreler işlenmemiş istek verilerine uygulanmaz, normalize edilmiş kopyalarına uygulanır. Bunu, saldırganların farkedilmemek için kullandıkları bir çok değişik atlatma tekniklerini önlemek için yaparız. Örneğin, komut satırı çalıştırma saldırısını yakalayacak bir filtre yazdığınızı düşünün:

 

SecFilter /bin/sh
            
            

 

 

Ama saldırgan /bin/./sh şeklinde (aynı anlama gelen) bir dizgi kullanabilir.

 

ModSecurity aşağıdaki değişiklikleri otomatik olarak uygular:

 

·         Sadece Windows’da, \ işaretini / işaretine çevirir.

 

·         /./ işaretlerini /

işaretine çevirir.

 

·         // işaretlerini /

işaretine çevirir.

 

·         URL kodlanmış karakterleri çözer.

 

Aşağıdaki kontrolleri açıp kapamayı seçebilirsiniz:

 

·         URL kodlamayı denetleme

 

·         Belli aralıktaki baytları kullanmayı

 

Boş (Null) bayt saldırı önleme

 

Boş (null) bayt saldırıları C/C++ tabanlı yazılımların aklını karştırmaya ve onları dizginin bittiğine (bitmediği halde) inandırmaya çalışır. Bu çeşit bir saldırı aslında tipik olarak düzgün bir SecFilterByteRange filtresi ile engellenir. Ama, bunu yapmazsanız boş bayt ModSecurity’nin işlemini karıştırabilir. Bununla savaşmak için, ModSecurity çözme (decoding) sırasında boş baytları arar ve onları boşluğa dönüştürür. Yani,aşağıdaki filtre daha önce:

 

SecFilter hidden
            
            

 

 

aşağıdaki istek içerisindeki saklanmış kelimeyi bulamazdı:

 

GET /one/two/three?p=visible%00hidden HTTP/1.0
            
            

 

 

Ancak şimdi beklendiği çalışmaktadır.

 

Düzenli İfadeler (Regular expressions

)

 

Daha önce bahsettiğim en basit filtreleme metodu aslında biraz daha karmaşıktır. Tam yazılım şekli (syntax) aşağıdaki gibidir:

 

SecFilter KEYWORD [ACTIONS]
            
            

 

 

İlk olarak, KEYWORD basit bir dizgi (text) değildir. Düzenli bir ifadedir (regular expression). Düzenli bir ifade, yazı içinde örüntü eşlemede (pattern matching) kullanılan mini bir programlama dilidir. Bu güçlü aracı, hakkını vererek kullanmak için düzenli ifadeleri çok iyi anlamanız gerekir. Aşağıdaki kaynaklar ile başlamanızı öneririm:

 

·         Perl-uyumlu düzenli ifadeler yardım sayfası, http://www.pcre.org/pcre.txt

 

 

·         Perl Düzenli İfadeler, http://www.perldoc.com/perl5.6/pod/perlre.html

 

 

·         Düzenli İfadelere Hakim Olma, http://www.oreilly.com/catalog/regex/

 

 

·         Düzenli İfadeler için Google araması, http://www.google.com/search?q=regular%20expressions

 

 

·         Wikipedia girişi, http://en.wikipedia.org/wiki/Regular_expression

 

 

·         POSIX düzenli ifadeleri, http://www.wellho.net/regex/posix.html

 

 

Not

 

Apache 1.x ve Apache 2.x için iki farklı düzenli ifade motoru (regular expression engine) kullanılmıştır. Apache 1.x’in düzenli ifade motoru POSIX uyumludur. Apache 2.x’in düzenli ifade motoru PCRE uyumludur. Ana kural olarak, Apache 1.x’de çalışan düzenli ifadeler Apache 2.x’de de çalışır, ama diğer şekilde değil. Eğer her ikisinde de çalışması gereken kurallar yazmanız gerekirse, iyi test etmeniz gerekir.

 

İkinci parametre, kuralın eşleşmesi durumunda yapılacak işlem listesi tanımıdır. İşlemler bu kılavuzda daha sonra açıklanacaktır.

 

Tersyüz ifadeler

 

Ünlem işareti bir düzenli ifadenin ilk karakteri ise, filtre düzenli ifadeyi tersyüz edilmiş olarak görür. Örneğin, aşağıdaki ifade:

 

SecFilter !php
            
            

 

 

php kelimesini içermeyen her isteği reddeder.

 

İleri (Advanced) filtreleme

 

Her ne kadar SecFilter’ı kullanmak kolay gelse de, er ya da geç çok geniş bir kapsamı olduğunu ve bu nedenle çok iyi çalışmadığını anlayacaksınız. Diğer direktif: 

 

SecFilterSelective LOCATION KEYWORD [ACTIONS]
            
            

 

 

aramanın tam olarak nerede yapabileceğiniz seçeneğini size sunar. KEYWORD ve ACTIONS bölümleri SecFilter ile aynıdır. LOCATION bölümü daha detaylı bir açıklama gerektirir.

 

LOCATION parametresi bir hatla (pipe) ayrılmış bir seri yer belirtecinden oluşur.

 

Aşağıdaki örneğe bakın:

 

SecFilterSelective "REMOTE_ADDR|REMOTE_HOST" KEYWORD
            
            

 

 

Düzenli ifadeyi sadece istemcinin IP adresine ve sunucu ismine uygulayacaktır. Mümkün olan yer belirteçlerinin listesi bütün CGI değişkenlerini ve daha fazlasını kapsar. İşte bütün liste:

 

·         REMOTE_ADDR

 

·         REMOTE_HOST

 

·         REMOTE_USER

 

·         REMOTE_IDENT

 

·         REQUEST_METHOD

 

·         SCRIPT_FILENAME

 

·         PATH_INFO

 

·         QUERY_STRING

 

·         AUTH_TYPE

 

·         DOCUMENT_ROOT

 

·         SERVER_ADMIN

 

·         SERVER_NAME

 

·         SERVER_ADDR

 

·         SERVER_PORT

 

·         SERVER_PROTOCOL

 

·         SERVER_SOFTWARE

 

·         TIME_YEAR

 

·         TIME_MON

 

·         TIME_DAY

 

·         <