Netscaler ile DDos ve Dos Ataklarını Yönetmek 2 Rate Limit

Transkript

Netscaler ile DDos ve Dos Ataklarını Yönetmek 2 Rate Limit
RATE LIMIT
Rate limit özeliği belirli bir zaman aralığında bir kaynağın kullanabileceği maksimum yükü
belirterek ağ ve onun kaynaklarının bir saldırgan tarafından istilaya uğramasını önler.
Örneğin ip temelli böcekler ve örümcekler (crawler/spider) tarafından ağ sunucularının aşırı
yüklenmesinin önlenmesine yarımdımcı olur.
Rate limit özelliği Citrix Netscaler üzerinde ki belirli bir network birimi veya virtual birim için
maksimum yükü tanımlamamıza olanak sağlar. Bu özellik bize bu birim ile bağlantılı trafik
oranını izlemek için Netscaler’i konfigüre etmemize ve trafik oranına göre gerçek zamanlı
önleyici eylemler almamıza olanak sağlar.
Bu özellik, Netscaler’a istekleri bir sel gibi gönderen bir saldırgan tarafından ağ saldırıya maruz
kaldığında özellikle kullanışlıdır. Böylelikle istemciler için kaynak uygunluğunu etkileyen riskleri
hafifletebilir ve Netscaler’ın yönettiği ağ kaynaklarını ve güvenirliğini iyileştirebilirsiniz.
Virtual server, URL, domain ve domain ve URL kombinasyonlarını içeren kullanıcı tanımlı ve
virtual birimlerle bağlantılı trafik oranlarını kontrol edebilir ve izleyebilirsiniz. Eğer trafik çok
yüksek ise trafik oranını kısabilir ve trafik oranını önceden belirlenen limitleri aştıysa trafiği belirli
bir virtual server’a yönlendirebilirsiniz. HTTP,TCP ve DNS istekleri için oran temelli İzleme
uygulanabilir.
Belirli senaryolar da trafik oranını izemek için bir “rate limit identifier” oluşturulmalıdır. “Rate limit
identifier” “Time Slice” olarak adlandırılan belirli bir zaman aralığında özel bir tipte ki
bağlantıların ve isteklerin maksimum değerleri gibi sayısal eşik değerlerini tanımlar.
İsteğe bağlı olarak “stream selector” olarak bilinen filitreler tanımlayabilir ve “rate limit identifier”
ayarlandığı esnada “stream selector” ‘leri “rate limit identifier” ile ilişkilendirebilirsiniz. Isteğe
bağlı “stream selector” leri oluşturup “limit identifier”’e bağladıktan sonra limit identifier’ı
tanımladığınız bir policy içinden çağırmalısınız.
Rate limit identifier’leri rewrite,responder, DNS ve integrated cache policy’lerinden çağırmanız
bazı senaryolarda çok kullanışlı olacaktır.
Rate limit kullanım senaryoları
DNS rate limit
Belirli bir DNS istemcisinin çok fazla DNS lookup isteği yapmasını önleyerek DNS base Dos
saldırlar önlenebilir.
Boot Limit
Belirli bir kaynaktan elverişli olduğundan daha hızlı sunulan istekleri önlemeye yardımcı olur.
Attack Prevention/Application Protection
İşlemci yükünü arttıran CGI saldırılarını önler.
Brute Force login girişimleri
Tek bir kaynaktan bir login sayfasına erişimi sınırlar.
Stream Selector Yapılandırma
Trafik Stream Selector erişimi kısmak istenilen bir birimi belirtmek için tanımlanan isteğe bağlı
bir filitredir. Selector isteğe ve yanıta uygulanır ve rate stream identifier tarafından analiz
edilecek olan veri noktalarını seçer. Bu veri noktaları hemen hemen IP adresi, subnet, domain
adı, TCP veya UDP identifier ve özel string veya URL’lerde ki uzantılar gibi karekteristik
özellikleri temel alabilir.
Bir stream selector birbirinden ayrı birleşik olmayan expression’lardan oluşur. Bir trafik stream
selector maksimum beş adet expression içerebilir. Her bir expression birbirine AND ile bağlıdır.
Örneğin aşağıda örneği incelersek top_client_url selector’ü birbirinden ayrı birleşik olmayan iki
ayrı expression içermektedir. Bu selector özetle aynı istemci ip’sinden aynı url’e olan istekler için
veri noktaları oluşturur.
Örnek;
HTTP.REQ.URL
CLIENT.IP.SRC
HTTP.RE.URL
CLIENT.IP.SRC
Netscaler CLI’dan trafik stream selector yapılandırmak için;
add stream selector <name> <rule> ...
Örnek
Primary> add stream selector top_client_url HTTP.REQ.URL CLIENT.IP.SRC
Netscaler GUI’den trafik stream selector yapılandırmak için;
1. AppExpert > Rate Limiting > Selectors’den Add butonuna tıklayalım.
HTTP.REQ.URL ve CLIENT.IP.SRC expression’larını Insert butonuna tıklayarak
ekledikten sonra Ok butonuna tıklayalım.
Trafik Rate Limit Identifier Tanımlama
Eğer stream selector ile ayarlanan trafik miktarı belirli bir zaman aralığında sayısal bir limiti
aşıyorsa rate limit identifier maktıksal TRUE değerini döner.
Netscaler CLI’dan traffic limit identifier tanımlama
add ns limitIdentifier <limitIdentifier> -threshold <positive_integer> -timeSlice
<positive_integer> -mode<mode> -limitType ( BURSTY | SMOOTH ) -selectorName
<string> -maxBandwidth <positive_integer> -trapsInTimeSlice <positive_integer>
SelectorName:Rate limit selector’ünün adıdır. Eğer bu alan NULL ise limit identifier’in virtual
server’a veya global olarak bağlı olup olmamasına göre, rate limiting, virtual server veya
Netscaler tarafından alınan bütün tafiğe herhangi bir filitre olmaksızın uygulanır.
Limit Modes: Request Rate

Belirli bir zaman aralığında ki (time slice) istekleri izler.10 ms’nin katları olarak belirtilir.

-limit Type SMOOTH:
Bir Leaky Bucket yaklaşımıdır. Kullanıcın sabit oranda yeni bağlantı kurduğu trafik
pattern’inde kullanışlıdır.Aralık boyunca eşit bir dağılım gösterir.(her on ms’de on istek
gibi). Netscaler istekleri 10/ms’de bir izler. Örneğin 200 ms başına 4 istek
belirtilmişseniz, Netscaler her 50 ms’de 1 istek oranını izler.

-limitType BURST: TimeSlice ile belirtilen zaman aralığında herhangi bir zaman
istemcinin yaptığı istek sayısının istemciye tanımlanan kotayı doldurduğu Token Bucket
yaklaşımıdır. Trafiğin çoğu belirli bir aralıkta tek bir noktaya gelir.(Örneğin bir saniyelik
bir aralığın ilk 10 ms’si) .Kullanıcı eriştiğinde kısa ve şiddetli bir aktivite ve sonrasında
kullanıcı sayfayı okurken aktivitenin olmadığı durum burst (patlamalı) uygulamaya güzel
bir örnektir. Burda dikkat edilmesi gereken nokta TimeSlice olarak belirlediğimiz zaman
aralığının herhanangi bir noktasında threshold değeri aşıldığında aşılan saniyeden
TimeSlice süresinin sonuna kadar eğer responder action DROP seçilmişse
drop’lanacaktır. Örneğin Aynı client ip’sinden aynı URL’e gelen istek oraını 10 dakikada
1000 istek olarak ayardıysak ve Beşinci dakikada bu şart sağlandıysa ve responder
policy’de bu şart sağlandığında uygulanacak eylemi (action) bağlantıyı düşürmek
(DROP) olarak ayarladıysak client beşinci dakikadan onuncu dakikaya kadar
drop’lanacak ve onuncu dakikanın sonunda rate limit tekrar hesaplancaktır.
Limit Modes:Connection
 İstemci için aktif işlem’leri (transaction) izler ve limiti belirler. Daima -limitType
BURSTY için kullanılır.
 Web böcekleri ve örümcekleri gibi pek çok eş zamanlı bağlantı açan web HTTP
trafikleri için kullanışlıdır.
Limit Modes: -maxBandwitdh
 İstemcinin başına bantgenişliği (kbits/sec) kullanımı
Threshold: İstekler (Eğer mode REQUEST_RATE seçili ise) her bir zaman aralığı için
izlendiğinde belirlenen zaman aralığında izin verilen maksimum istek sayısıdır. Bağlantılar
(mode CONNECTION seçildiyse) izlendiği zaman izin verilen toplam bağlantı sayısıdır.
Time Slice:İsteklerin dip eşik değerini (threshold) aşıp aşmadığını kontrol etmek için
izlendiği süre boyunca on milisaniyenin katları olarak milisaniye zaman aralığı.
Maximum Bandwith:İzin verilen maksimum bantgenişliği (kbps)
Traps:Konfigüre edilen zaman aralığında (timeslice) gönderilecek traps sayısını belirler.
Eğer 0 ise trap disable edilir. Aşağıda rate limit’in oluşturduğu trap’lar görünmektedir.
Netscaler GUI’den
1. AppExpert > Rate Limiting > Limit Identifier’den Add butonuna tıklayalım. Selector
kutusundan daha önce oluşturduğumuz Top_Client_URL selector’ünü seçelim. Mode
kutusundan REQUEST_RATE’i ve Limit Type olarak BURSTY seçelim. Time Slice
kutucuğuna 60000 ms ve Threshold kutucuğuna 1000 yazarak bir dakikada aynı
client’dan aynı URL’e yapılan istek eşik değerini 1000 olarak belirtmiş oluyoruz.
Limit Identifier Policy
Uygun olan Netcaler özelliğinde (rewrite,responder, DNS ve integrated cache gibi) bu kuralın
ayarlanmasıyla rate temelli uygulama davranışı yürürlüğe konulur. Trafik oranını analiz etmek
için kural ifadesinde aşağıda ki ifade kulanılmalıdır.
sys.check_limit(<limit_identifier>)
limit identifier daha önce oluşturulan limit idenfier’ın adı olmalıdır.
Kural ifadesi en az iki komponent içeren birleşik bir ifade olmalıdır:

Kural’da ki İlk komponent rate limit identifier’ın uygulandığı trafiği belirtmek için kullanılan
ifade olmaldır. Örneğin: http.req.url.contains("my_aspx.aspx")

Kuralda ki ikinci komponent rate limit identifier’i belirten ifade olmalıdır.
Örneğin; sys.check_limit("Top_Client_Url_Limit_Identifier ") . Bu kural’daki son ifade
olmalıdır.
Netscaler CLI ile rate-based policy konfigurasyonu
add cache|dns|rewrite|responder policy <policy_name> -rule expression &&
sys.check_limit("<LimitIdentifierName>") [<feature-specific information>]
add responder policy rate_limit_responder_policy "HTTP.REQ.URL.CONTAINS(\"my_aspx.asp
x\") && SYS.CHECK_LIMIT(\"Top_Client_Url_Limit_Identifier\")" NOOP -logAction rate_limit_ms
g_act
Netcaler GUI ile rate-based policy konfigurasyonu
1. Rate limit’i entegre etmek istediğiniz Netscaler özelliğini (Örneğin Integrated Caching,
Rewrite veya Responder) açalım ve Policies’e tıklayalım.
2. Deyay panosu’ndan Add butonuna tıklayalım. Name alanına tanımlayacağımız kural için
bir isim yazalım
3. Expression alanine poicy rule’unu yazalım ve sys.check_limit’i içerdiğinden emin olalım.
Action alanina rate limit identifier gerçekleştiğinde alınması gereken aksiyonu seçelim.
Action kısmı DROP ve RESET olabileceği gibi herhang bir sayfaya yönlendirmede
olabilir. Bizim örneğimizde NOOP seçerek herhangi bir aksiyon almasını istemediğimiz
belirtiyoruz. Bu karşın Log Action alanında rate limit sağlandığında ns.log ve newnslog’a
loglanmasını custom message action ile ayarlıyoruz. Özetle bu rate limit sağlandığında
herhangi bir aksiyon almayacak ama Netscaler /var/log altında ki ns.log’a istemci ip ve
istekte bulunduğu URL’ı yazacak. İlk aşamada action’ı DROP moda almamalı ve
belirlenen bir süre (bir gün veya bir hafta gibi ) sadece log action’ın ns.log’a yazdığı
custom message action çıktısı incelenerek en uygun threshold ve timeslice değerleri
belirlenmelidir.
4. Hazırladığımız responder policy üzerine sağ tıklayıp Policy Manager’ı seçelim
5. Rate limit responder policy’sini atamak istediğimiz atama noktasını seçelim. Bu örnekte
Load balancing virtual server’u seçiyoruz. Protokol olarak HTTP ve virtual server olarak
load balancing virtual server’umuzu seçelim.
6. Bu kısımda hazırladığımız rate limit responder policy’i seçip Bind butonuna tıklamalıyız.
Netscaler CLI ile Auditing Message Action ayarlanması
add audit messageaction rate_limit_msg_act ALERT "\"Max request attempts detected from \" +
CLIENT.IP.SRC + \" to \" + HTTP.REQ.URL + \" within a 60 sec period. Possible brute force atta
ck
Netscaler GUI ile Auditing Message Action ayarlanması
1. Auditing>Message Action’a tıklayalım.Yeni bir message action eklemek için Add
butonuna tıklayalım. Log level kutusundan log ALERT’i seçelim. Expression alanına rate
limit sağlandığında ns.log’a yazılmasını istediğimiz mesaj’ı yazalım ve Create butonuna
tıklayalım.
Trafik Oranını Görmek
Eğer bir veya daha fazla virtual server üzerinden akan trafik rate-based policy’ye match
ediyorsa bu trafik oranını görebiliriz. Rate istatistik bilgileri rate-based policy içinde
kullandığımız limit identifier içinde bulunmaktadır.
Netscaler CLI ile trafik oranını görüntülemek
show ns limitSessions <limitIdentifier>
Primary> sh ns limitsessions Top_Client_Url_Limit_Identifier
1)
Time Remaining:
Total Hash:
IPs gathered:
109 secs Hits: 2
23768 Hash String: /common.js
Action Taken: 0
1) 192.168.3.251
Active Transactions: 0
2)
Time Remaining:
Total Hash:
108 secs Hits: 2
Action Taken: 0
656362 Hash String: /
IPs gathered:
1) 192.168.3.251
Active Transactions: 0
3)
Time Remaining:
Total Hash:
109 secs Hits: 2
Action Taken: 0
664527 Hash String: /images/Green_citrixlogo.jpg
IPs gathered:
1) 192.168.3.251
Active Transactions: 0
Done
Netscaler GUI ile trafik oranını görüntülemek
1. AppExpert > Rate Limiting > Limit Identifiers gidelim ve trafik oranını görüntülemek
istediğimiz limit identifier’ı seçip mouse ile üzerinde sağ tıkladığımızda çıkan menüden
Show Sessions’ı seçelim.
Rate Limit’i Message Audit Action’dan görüntülemek,
Rate limit’in tetiklenip tetiklenmediğini ns.log dosyasından custom message action
oluşturuken kullandığımız "brute force attack" kelime dizisini grep’leyerek görebiliriz. Burda
hangi client ip’den hangi URL’e limit identifier’de belirlediğimiz limiti aştığını görebiliriz.
Dikkat edilmesi gereken önemli bir nokta ise şube bazlı çalışan müşteri ortamlarında NAT
üzerinden çıkan istemcilerin oluşturulan rate limit’i tetikleyebileceğidir. Bu nedenle şubelerin
internet çıkış ipleri ve merkez ofis internet çıkış ip’si özellikle false positive olduğu
düşünülerek responder rate-based policy’de rate limit dışında bırakılmalıdır.
root@ns# cd /var/log
root@ns# cat ns.log | grep "brute force attack"
Jan 5 22:50:50 <local0.alert> 127.0.0.2 01/05/2016:20:50:50 GMT 0-PPE-0 : default
RESPONDER Message 1856947 0 : "Max request attempts detected from 192.168.3.251
to / within a 60 sec period. Possible brute force attack"
Jan 5 22:50:50 <local0.alert> 127.0.0.2 01/05/2016:20:50:50 GMT 0-PPE-0 : default
RESPONDER Message 1856950 0 : "Max request attempts detected from 192.168.3.251
to /css/defaultstyles.css within a 60 sec period. Possible brute force attack"
Jan 5 22:50:50 <local0.alert> 127.0.0.2 01/05/2016:20:50:50 GMT 0-PPE-0 : default
RESPONDER Message 1856952 0 : "Max request attempts detected from 192.168.3.251
to /common.js within a 60 sec period. Possible brute force attack"
Jan 5 22:50:50 <local0.alert> 127.0.0.2 01/05/2016:20:50:50 GMT 0-PPE-0 : default
RESPONDER Message 1856954 0 : "Max request attempts detected from 192.168.3.251
to /images/index.jpg within a 60 sec period. Possible brute force attack"
Rate-Based Policy Örnekleri
 Bir URL’den saniye başına isteklerin sayısının sınırlanması
add stream selector ipStreamSelector http.req.url "client.ip.src"
add ns limitIdentifier ipLimitIdentifier -threshold 4 -timeSlice 1000
-mode request_rate -limitType smooth -selectorName ipStreamSelector
add responder action myWebSiteRedirectAction redirect
"\"http://www.mycompany.com/\""
add responder policy ipLimitResponderPolicy "http.req.url.contains(\"myasp.asp\")
&& sys.check_limit(\"ipLimitIdentifier\")" myWebSiteRedirectAction
bind responder global ipLimitResponderPolicy 100 END -type default
---------------------------------------------------------------------------------------------------------------- Eğer istekte bulunan URL 20000 ms başına 5’i geçiyorsa response’un
cache’lenmesi
add stream selector cacheStreamSelector http.req.url
add ns limitidentifier cacheRateLimitIdentifier -threshold 5 -timeSlice 2000
-selectorName cacheStreamSelector
add cache policy cacheRateLimitPolicy -rule "http.req.method.eq(get)
&& sys.check_limit(\"cacheRateLimitIdentifier\")" -action cache
bind cache global cacheRateLimitPolicy -priority 10
------------------------------------------------------------------------------------------------------------------- Eğer istekler rate limiti aşıyorsa www.yourcompany.com ‘dan isteklerde alınan
cookie’yi baz alarak bağlantının DROP’lanması.
add stream selector reqCookieStreamSelector "http.req.cookie
.value(\"mycookie\")" "client.ip.src.subnet(24)"
add ns limitIdentifier myLimitIdentifier -Threshold 2 -timeSlice 3000
-selectorName reqCookieStreamSelector
add responder action sendRedirectUrl redirect '\"http://www.mycompany.com\"
+ http.req.url' -bypassSafetyCheck YES
add responder policy rateLimitCookiePolicy
"http.req.url.contains(\"www.yourcompany.com\")
&& sys.check_limit(\"myLimitIdentifier\")" sendRedirectUrl
--------------------------------------------------------------------------------------------------------------------- Belirli bir istemci ip’si ve DNS alanadından istekler rate limiti aşıyorsa bir DNS
paketinin DROP’lanması
add stream selector dropDNSStreamSelector client.udp.dns.domain client.ip.src
add ns limitIdentifier dropDNSRateIdentifier -timeslice 20000 -mode request_rate
-selectorName dropDNSStreamSelector -maxBandwidth 1 -trapsintimeslice 20
add dns policy dnsDropOnClientRatePolicy "sys.check_limit
(\"dropDNSRateIdentifier\")" -drop yes
----------------------------------------------------------------------------------------------------------------------- Aynı subnet’ten (32 subnet mask) aynı hedef IP adresine gelen HTTP istek
sayısının limitlenmesi.
add stream selector ipv6_sel "CLIENT.IPv6.src.subnet(32)" CLIENT.IPv6.dst Q.URL
add ns limitIdentifier ipv6_id -imeSlice 20000 -selectorName ipv6_sel
add lb vserver ipv6_vip HTTP 3ffe::209 80 -persistenceType NONE -cltTimeout 180
add responder action redirect_page redirect "\"http://redirectpage.com/\""
add responder policy ipv6_resp_pol "SYS.CHECK_LIMIT(\"ipv6_id\")" redirect_page
bind responder global ipv6_resp_pol 5 END -type DEFAULT

Benzer belgeler