DDoS koruması nasıl etkinleştirilir?


86

DDoS (Dağıtılmış Hizmet Reddi Saldırıları) genellikle sunucu düzeyinde engellenir, değil mi?

PHP düzeyinde engellemenin veya en azından azaltmanın bir yolu var mı?

Değilse, DDoS saldırılarını durdurmanın en hızlı ve en yaygın yolu nedir?


Daha iyi bir şey olmamasına rağmen , burada potansiyel olarak yardımcı olabilecek Apache modüllerinin bir listesi var. Ancak çok zengin görünmüyor ve dörtlü iki proje ('dos' ile arandığı gibi) hiçbir yere işaret etmiyor gibi görünüyor.
Audrius Meskauskas

Bunun gibi bir şey mi? mod-antiloris.sourceforge.net
K-Gun

Sistem, saldırının kendisine gönderdiği tüm istekleri artık işleyemediğinde bir DDOS başarılı olur. Uygulamanıza "Bu bir DDOS saldırısı mı" için her isteği kontrol eden bir kod eklerseniz, o zaman bu kod aslında daha çok zarar veriyordur, çünkü her istek için biraz daha fazla kaynak gerektirir. Bu, yalnızca anonim talebe zaten izin verilmeyen çok kısıtlayıcı bir ortamda işe yarar.
Hugo Delsing

Yanıtlar:


188

DDOS, veri merkezindeki önemli sistemleri alt eden bir saldırı ailesidir:

  • Barındırma merkezinin internete ağ bağlantısı
  • Barındırma merkezinin dahili ağı ve yönlendiricileri
  • Güvenlik duvarınız ve yük dengeleyicileriniz
  • Web sunucularınız, uygulama sunucularınız ve veritabanınız.

DDOS savunmanızı oluşturmaya başlamadan önce, en kötü durumdaki riske maruz değerin ne olduğunu düşünün. Küçük bir topluluk için kritik olmayan, kullanımı ücretsiz bir hizmet için, risk altındaki toplam değer fıstık olabilir. Milyar dolarlık yerleşik bir işletme için ücretli, halka açık, görev açısından kritik bir sistem için, değer şirketin değeri olabilir. Bu ikinci durumda, StackExchange'i kullanmamalısınız :) Her neyse, DDOS'a karşı savunmak için derinlemesine bir savunma yaklaşımına ihtiyacınız var:

  1. Sundukları internet ve güvenlik duvarı hizmetlerine ağ bağlantılarında IP ve bağlantı noktası filtreleme dahil olmak üzere sundukları hizmetleri anlamak için barındırma merkezinizle birlikte çalışın . Bu kritik: Birçok site barındırma şirketi tarafından internetten çekilir, çünkü barındırma şirketi DDOS'un bir müşteriye neden olduğu veri merkezi çapında kesinti ile ilgilenir. Ayrıca, bir DDOS saldırısı sırasında, barındırma merkezinin personeli ile çok yakın çalışacaksınız, bu nedenle acil durum numaralarını bilin ve onlarla iyi anlaşın :) Tüm uluslararası bölgeleri engelleyebilmeli, belirli hizmetleri veya ağı tamamen engelleyebilmelidirler. protokoller ve diğer geniş spektrumlu savunma önlemleri veya alternatif olarak yalnızca beyaz listedeki IP'lere izin verin (iş modelinize bağlı olarak)
  2. Barındırma merkezindeyken - hizmetleri (çoğunlukla statik) son kullanıcılarınıza dağıtmak için bir İçerik Dağıtım Ağı kullanın ve gerçek sunucularınızı DDOS mimarlarından gizleyin. Tam CDN, bir DDOS için tüm ülkelerdeki tüm düğümleri alamayacak kadar büyüktür; DDOS bir ülkeye odaklanmışsa, en azından diğer kullanıcılar hala iyidir.
  3. Tüm sistemlerinizi ve yazılım paketlerinizi en son güvenlik yamalarıyla güncel tutun - bunların hepsini kastediyorum:

    • Yönetilen anahtarlar - evet, bunların bazen güncellenmesi gerekir
    • Yönlendiriciler
    • Güvenlik duvarları
    • Yük dengeleyiciler
    • İşletim sistemleri
    • Web sunucuları
    • Diller ve kütüphaneleri
  4. İyi bir güvenlik duvarı veya güvenlik aracı kurduğunuzdan ve kalifiye bir güvenlik uzmanı tarafından düzenli olarak gözden geçirildiğinden emin olun . Güvenlik duvarındaki güçlü kurallar, birçok basit saldırıya karşı iyi bir savunmadır. Ayrıca her açık hizmet için mevcut olan bant genişliğini yönetebilmek de yararlıdır.

  5. İyi ağ izleme araçlarına sahip olun - bu, şunları anlamanıza yardımcı olabilir:

    • Sadece ağır yük altında olmak yerine saldırı altında olduğunuzu
    • Saldırının nereden geldiği (normalde iş yapmadığınız ülkeleri içerebilir) ve
    • Saldırının gerçekte ne olduğu (bağlantı noktaları, hizmetler, protokoller, IP'ler ve paket içerikleri)
  6. Saldırı, meşru web sitesi hizmetlerinin yoğun kullanımı olabilir (örneğin, sorgular çalıştıran 'yasal' URI'lara ulaşmak veya veri eklemek / güncellemek / silmek) - on ila milyonlarca farklı IP adresinden gelen binlerce veya milyonlarca istek, bir siteyi kendi sitesine getirecektir. dizler. Alternatif olarak, bazı hizmetlerin çalıştırılması o kadar pahalı olabilir ki, yalnızca birkaç istek DOS'a neden olur - gerçekten pahalı bir rapor düşünün. Bu nedenle , neler olup bittiğine dair iyi bir uygulama düzeyinde izlenmeye ihtiyacınız var:

    • Hangi hizmetler çağrıldı ve hangi bağımsız değişkenlerin / verilerin gönderildiği (ör. Uygulamanızda oturum açma)
    • Hangi kullanıcılar çağrıyı hangi IP'lerden yapıyor (yani uygulamanıza giriş yapıyor)
    • DB'nin gerçekleştirdiği hangi sorgular ve ekler / güncellemeler / siler
    • Sisteminizdeki tüm bilgisayarlarda (ve VM'lerde) ortalama yük, CPU kullanımı, disk i / o, ağ trafiği
    • Tüm bu bilgilerin kolayca alınabildiğinden ve farklı bilgisayarlardan ve hizmetlerden günlükleri ilişkilendirebileceğinizden emin olun (yani, tüm bilgisayarların ntp kullanılarak zaman eşitlendiğinden emin olun).
  7. Uygulamanızdaki makul kısıtlamalar ve sınırlar . Örneğin, şunları yapabilirsiniz:

    • Oturum açmış kullanıcılar başka bir küme kullanırken tüm anonim oturumları kümenizdeki ayrı uygulama sunucularına göndermek için yük dengeleyicideki bir QoS özelliğini kullanın. Bu, uygulama düzeyinde anonim bir DDOS'un değerli müşterileri almasını önler
    • Anonim hizmetleri korumak için güçlü bir CAPCHA kullanmak
    • Oturum zaman aşımları
    • Raporlar gibi belirli istek türleri için bir oturum sınırı veya oran sınırı vardır. Gerekirse anonim erişimi kapatabileceğinizden emin olun
    • Bir kullanıcının eşzamanlı oturum sayısı için bir sınıra sahip olduğundan emin olun (saldırıya uğramış bir hesabın milyon kez oturum açmasını önlemek için)
    • Farklı hizmetler için farklı veritabanı uygulama kullanıcılarına sahip olun (ör. İşlemsel kullanıma karşı raporlama kullanımı) ve bir tür web isteğinin diğerlerini ezmesini önlemek için veritabanı kaynak yönetimini kullanın
    • Mümkünse, bu kısıtlamaları dinamik veya en azından yapılandırılabilir yapın. Bu şekilde, saldırı altındayken, kullanıcı başına yalnızca bir oturum gibi ve anonim erişim olmaması gibi agresif geçici sınırlar (saldırıyı 'yavaşlatmak') belirleyebilirsiniz. Bu, müşterileriniz için kesinlikle harika değildir, ancak hiç hizmet almamasından çok daha iyidir.
  8. Son olarak, bir DOS Yanıt Planı belgesi yazın ve bunu tüm ilgili taraflarca dahili olarak gözden geçirin: İşletme, Yönetim, Yazılım geliştirme ekibi, BT ekibi ve bir güvenlik uzmanı. Belgeyi yazma süreci, sizin ve ekibinizin sorunlar üzerinde düşünmesine neden olacak ve en kötü şeyin tatil gününüzde sabah 3'te olması durumunda hazırlıklı olmanıza yardımcı olacaktır. Belge (diğer şeylerin yanı sıra) şunları kapsamalıdır:

    • Neler risk altında ve işin maliyeti
    • Varlıkları korumak için alınan önlemler
    • Bir saldırı nasıl tespit edilir
    • Planlanan yanıt ve yükseltme prosedürü
    • Sistemi ve bu belgeyi güncel tutmaya yönelik işlemler

Öyleyse, önsöz bir yana, işte bazı özel cevaplar:

DDOS genellikle sunucu düzeyinde engellenir, değil mi?

Gerçekte değil - en kötü DDOS saldırılarının çoğu düşük seviyelidir (IP paketi seviyesinde) ve DDOS saldırılarını işlemek için geliştirilmiş yönlendirme kuralları, güvenlik duvarları ve güvenlik cihazları tarafından yönetilir.

PHP düzeyinde engellemenin veya en azından azaltmanın bir yolu var mı?

Bazı DDOS saldırıları, geçerli URI'ler ve HTTP istekleri göndererek uygulamanın kendisini hedef alır. İsteklerin oranı arttığında, sunucularınız mücadele etmeye başlar ve bir SLA kesintisi yaşarsınız. Bu durumda, PHP seviyesinde yapabileceğiniz şeyler vardır:

  • Uygulama düzeyinde izleme: Her hizmetin / sayfanın isteklerini, neler olup bittiğini görebileceğiniz bir şekilde günlüğe kaydetmesini sağlayın (böylece saldırıyı hafifletmek için önlemler alabilirsiniz). Bazı fikirler:

    • Bir günlük aracına (veya Excel veya benzeri) kolayca yükleyebileceğiniz ve komut satırı araçlarıyla (grep, sed, awk) ayrıştırabileceğiniz bir günlük biçimine sahip olun. Bir DDOS'un milyonlarca satırlık günlük oluşturacağını unutmayın. Neler olup bittiğini anlamak için büyük olasılıkla günlüklerinizi (özellikle URI, zaman, IP ve kullanıcı açısından) dilimlemeniz ve aşağıdaki gibi veriler oluşturmanız gerekecek:

      • Hangi URI'lara erişiliyor
      • Hangi URI'ler yüksek oranda başarısız oluyor (saldırganların saldırdığı belirli URI'lerin olası bir göstergesi)
      • Hizmete hangi kullanıcılar erişiyor
      • Hizmete erişen her kullanıcı kaç IP
      • Hangi URI'lara erişen anonim kullanıcılar
      • Belirli bir hizmet için hangi argümanlar kullanılıyor?
      • Belirli bir kullanıcının eylemlerini denetleyin
    • Her isteğin IP adresini günlüğe kaydedin. DNS'yi tersine çevirmeyin - ironik bir şekilde bunu yapmanın maliyeti saldırganlar için DDOS'u kolaylaştırır

    • Tüm URI ve HTTP yöntemini günlüğe kaydedin, örneğin "GET http://example.com/path/to/service?arg1=ddos "
    • Varsa Kullanıcı Kimliğini kaydedin
    • Önemli HTTP bağımsız değişkenlerini günlüğe kaydedin
  • Makul oran sınırları: Belirli bir IP'nin veya Kullanıcının belirli bir süre içinde kaç istekte bulunabileceğine ilişkin sınırlar uygulayabilirsiniz. Meşru bir müşteri saniyede 10'dan fazla talepte bulunabilir mi? İsimsiz kullanıcılar pahalı raporlara erişebilir mi?

  • Anonim erişim için CAPTCHA: Kullanıcının bir DDOS botu değil, bir kişi olduğunu doğrulamak için tüm anonim istekler için bir CAPTCHA uygulayın.

DDOS saldırılarını durdurmanın en hızlı ve en yaygın yolu nedir?

En hızlısı muhtemelen şantaja teslim olmaktır, ancak bu arzu edilmeyebilir.

Aksi takdirde, yapmanız gereken ilk şey, barındırma ve / veya CDN sağlayıcınızla iletişim kurmak ve onlarla çalışmaktır (eğer sizinle iletişime geçmemişlerse, neler olup bittiğini sormuşlarsa ...). Bir DDOS oluştuğunda, büyük olasılıkla barındırma sağlayıcısının diğer müşterilerini ikincil olarak etkileyecektir ve sağlayıcı, kaynaklarını korumak için sitenizi kapatmak için önemli bir baskı altında olabilir. Günlüklerinizi (her türlü bilgiyi) sağlayıcı ile paylaşmaya hazır olun; bu günlükler, ağ monitörleri ile birlikte, saldırıyı engellemek / azaltmak için yeterli bilgi sağlayabilir.

Bir DDOS bekliyorsanız, barındırma sağlayıcınızı sağlayabilecekleri koruma düzeyinde nitelendirmek çok iyi bir fikirdir. Bunu azaltmak için DDOS deneyimine ve araçlarına sahip olmalıdır - araçlarını, süreçlerini ve sorun giderme prosedürlerini anlayın. Ayrıca barındırma sağlayıcı gelen sahiptir destekleyen neyi sormak onların yukarı sağlayıcıları. Bu hizmetler daha fazla ön veya aylık maliyet anlamına gelebilir, ancak bunu bir sigorta poliçesi olarak değerlendirin.

Saldırı altındayken, günlüklerinizi almanız ve onları çıkarmanız gerekecek - saldırının modelini deneyin ve çalışın. Anonim erişimi kapatmayı ve saldırı altındaki hizmetleri kısıtlamayı düşünmelisiniz (yani uygulamanın hizmet için hız sınırını azaltın).

Şanslıysanız ve küçük, sabit bir müşteri tabanınız varsa, geçerli müşterilerinizin IP adreslerini belirleyebilirsiniz. Durum buysa, kısa bir süre için beyaz liste yaklaşımına geçebilirsiniz. Tüm müşterilerinizin bunun devam ettiğini bildiğinden emin olun, böylece yeni bir IP'den erişmeleri gerektiğinde arayabilirler :)


Doug McClean'ın şu adreste harika bir tavsiyesi var: https://stackoverflow.com/a/1029613/1395668


20

Sorunun PHP kısmına göre;

Bunun için PHP'ye güvenmesem de, uygulanabilir ancak tüm bu olasılıkları veya daha fazlasını dikkate almam gerekiyor;

  1. Saldırgan, her istek için IP'yi değiştirebilir
  2. Saldırgan, hedef sitenin bu parametreleri önemsemediği URI'ye parametre (ler) geçirebilir
  3. Saldırgan, süresi dolmadan oturumu yeniden başlatabilir ...

Basit sözde;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>

8

Php seviyesi istek zincirinde çok geç.

Apache sunucunuzu açık kaynaklı bir uygulamanın arkasına koymak sizin için iyi bir seçenek olabilir.

http://tengine.taobao.org/ , DDOS önlemeyi amaçlayan bazı belgeler ve kaynak kodu daha fazla modül içerir. Bu, nginx'in bir genişlemesidir, böylece apache örneğiniz için ters proxy olarak kolayca kurabilirsiniz.

Çarpışmayla nasıl mücadele edileceğini öğrenmek için bkz: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ DoS saldırılarına sahiptir.

Tamamen unuttum, http://www.cloudflare.com en iyi ücretsiz web uygulaması güvenlik duvarlarından biridir, ücretsiz ve ücretli planları vardır ve kıçınızı DDOS'tan kurtaracak, sadece önbelleğe alma yetenekleri için yüksek trafikli sitelerimizin çoğunda kullanıyoruz . Bu harika!



5

DDoS en iyi, çok pahalı, amaca yönelik ağ cihazları tarafından gerçekleştirilir. Ana bilgisayarlar, nispeten düşük performansa, durum tükenmesine, sınırlı bant genişliğine vb. Maruz kaldıkları için DDoS koruması yapmakta genellikle iyi değildirler. DDoS azaltma donanımına erişiminiz yoksa, iptables, apache modları ve benzer hizmetlerin kullanılması bazı durumlarda yardımcı olabilir. veya bir DDoS azaltma hizmeti, ancak ideal olmaktan uzaktır ve sizi yine de saldırı riski altında bırakır.


8
Bir çözüme ihtiyacımız var ve ideal bir çözüm yoksa kısmi çözümlere ihtiyacımız vardı. Kimsenin bir tavsiyeye ihtiyacı yok, "bunu yapamazsınız".
Audrius Meskauskas

5

PHP tarafında buna benzer bir şeye ne dersiniz:

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}

1
Bu kodda bazı hatalar var: 10 sabit kodlu, sunucu ve oturum değişkenlerinde strtotime gerekli değil ve $ _SESSION ['ban_up'] == 1 = 1 olmalı
Jason Silver


2

Do DEĞİL PHP tabanlı koruma kullanma, bu korkunç ve hemen hemen hiç bir etkisi olacak! Web sunucunuzu, örneğin Nginx'te limit_req modülünü kullanarak ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html ) hız sınırı istekleri için yapılandırın

Bununla birlikte, katman-4 ile savaşmak için CloudFlare kullanmanızı tavsiye ederim - ancak ödeme yapmak istemediğiniz sürece katman 7 tabanlı saldırıları değil.


evet, benim için de harika çalıştı, buradaki deneyimim softwareengineeringsolutions.co.uk/…
Elvis Ciotti

2

DDOS genellikle sunucu seviyesinde engellenir, Lütfen Sunucu Seviyenizde DDOS korumasını etkinleştirin. DDOS korumaları için lütfen aşağıdaki notları kontrol edin.

DDOS sorunlarını önlemeye yardımcı olabilecek Apache HTTP Sunucusu yapılandırma ayarları:

RequestReadTimeout yönergesi, istemcinin isteği göndermek için alabileceği süreyi sınırlamaya izin verir.

Başlıklar dahil isteği almak için 10 saniye ve istek gövdesini almak için 30 saniye bekleyin:

RequestReadTimeout header=10 body=30

İstek gövdesini almak için en az 10 saniye bekleyin. İstemci veri gönderirse, zaman aşımı için üst sınır olmaksızın (LimitRequestBody tarafından dolaylı olarak verilen sınır dışında) alınan her 1000 bayt için zaman aşımını 1 saniye artırın:

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

KeepAliveTimeout yönergesi DoS saldırılarına maruz kalan sitelerde de düşürülebilir. Hatta bazı siteler, performansta başka dezavantajları da olan KeepAlive aracılığıyla kalmaları tamamen kapatır. Diğer modüller tarafından sağlanan çeşitli zaman aşımı ile ilgili direktiflerin değerleri kontrol edilmelidir.

LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine ve LimitXMLRequestBody direktifleri, istemci girdisi tarafından tetiklenen kaynak tüketimini sınırlamak için dikkatlice yapılandırılmalıdır. MaxRequestWorkers direktifini, sunucunun kaynakları tüketmeden maksimum sayıda eşzamanlı bağlantıyı yönetmesine izin verecek şekilde ayarlayın.


2

Anti DDOS adımları:

  • İlk önemli şey, önce ddos ​​saldırısını belirlemektir. Ddos saldırısını daha erken belirlemek, sunucunuz için daha iyi anlamına gelir.
  • Sunucunuz için daha iyi bant genişliği kullanılabilir hale geliyor. Her zaman sunucunuz için gerekli olan yeterli bant genişliğini koruyun. Bu DDOS saldırısını engellemeyecek ancak daha uzun zaman alacaktır. Böylece harekete geçmek için biraz daha zaman kazanacaksınız.
  • Kendi web sunucunuz varsa, yönlendiricinizi hız sınırına göre ağ parametresinde savunabilir, paketleri farklı saldırı kaynaklarına bırakmak için filtreler ekleyebilir, yarı açık bağlantıları daha agresif bir şekilde zaman aşımına uğratabilirsiniz. Ayrıca daha düşük SYN, ICMP ve UDP flood drop eşikleri ayarlayın.
  • Bunlar hakkında fazla bir fikriniz yoksa, gidin ve barındırma sağlayıcılarınızla hızlı bir şekilde iletişime geçin. DDOS saldırılarını önlemek için ellerinden geleni yapabilirler.
  • Cloudflare ve diğer birçok şirket tarafından sağlanan Özel DDOS azaltma hizmeti de vardır . DDOS saldırılarını önlemenize yardımcı olabilecekleri. Ayrıca birçok şirket ucuz ddos koruması ve dos koruması sunar .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.