DDoS (Distributed Denial of Service Attacks)는 일반적으로 서버 수준에서 차단됩니까?
PHP 수준에서 차단하거나 최소한 줄이는 방법이 있습니까?
그렇지 않다면 DDoS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
DDoS (Distributed Denial of Service Attacks)는 일반적으로 서버 수준에서 차단됩니까?
PHP 수준에서 차단하거나 최소한 줄이는 방법이 있습니까?
그렇지 않다면 DDoS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
답변:
DDOS는 다음과 같은 데이터 센터의 주요 시스템을 압도하는 공격 군입니다.
DDOS 방어를 구축하기 전에 최악의 위험 가치가 무엇인지 고려하십시오. 소규모 커뮤니티를위한 중요하지 않고 무료로 사용할 수있는 서비스의 경우 위험에 처한 총 가치는 땅콩 일 수 있습니다. 수십억 달러 규모의 기존 비즈니스를위한 유료, 공개 대상, 미션 크리티컬 시스템의 경우 그 가치는 회사의 가치 일 수 있습니다. 후자의 경우 StackExchange를 사용하면 안됩니다. :) 어쨌든 DDOS를 방어하려면 심층 방어 접근 방식이 필요합니다.
모든 시스템과 소프트웨어 패키지를 최신 보안 패치로 업데이트 하십시오. 모든 것을 의미합니다.
적절한 방화벽 또는 보안 어플라이언스가 설정되어 있고 자격을 갖춘 보안 전문가가 정기적으로 검토 하는지 확인하십시오 . 방화벽에 대한 강력한 규칙은 많은 단순 공격에 대한 좋은 방어입니다. 개방형 서비스마다 사용 가능한 대역폭을 관리 할 수있는 것도 유용합니다.
적절한 네트워크 모니터링 도구 를 갖추십시오. 다음을 이해하는 데 도움이 될 수 있습니다.
공격은 단순히 합법적 인 웹 사이트 서비스를 많이 사용하는 것일 수 있습니다 (예 : 쿼리를 실행하는 '법적'URI를 누르거나 데이터를 삽입 / 업데이트 / 삭제). 수천 또는 수백만 개의 서로 다른 IP 주소에서 들어오는 수천 또는 수백만 개의 요청이 사이트를 무릎. 또는 일부 서비스는 실행 비용이 너무 비싸서 몇 개의 요청만으로 DOS가 발생할 수 있습니다. 정말 값 비싼 보고서라고 생각하면됩니다. 따라서 무슨 일이 일어나고 있는지에 대한 좋은 애플리케이션 수준 모니터링 이 필요 합니다.
응용 프로그램의 현명한 제약 및 제한 . 예를 들어 다음과 같이 할 수 있습니다.
마지막으로 DOS 대응 계획 문서를 작성하고 비즈니스, 관리, SW 개발 팀, IT 팀 및 보안 전문가와 같은 모든 관련 당사자의 내부 검토를받습니다. 문서를 작성하는 과정은 귀하와 귀하의 팀이 문제를 숙고하게하고, 휴일 오전 3시에 최악의 상황이 발생할 경우 대비할 수 있도록 도와줍니다. 문서는 다음 사항을 포함해야합니다.
따라서 서문을 제쳐두고 여기에 몇 가지 구체적인 답변이 있습니다.
DDOS는 일반적으로 서버 수준에서 차단됩니다.
실제로는 아닙니다. 최악의 DDOS 공격의 대부분은 낮은 수준 (IP 패킷 수준에서)이며 DDOS 공격을 처리하기 위해 개발 된 라우팅 규칙, 방화벽 및 보안 장치에 의해 처리됩니다.
PHP 수준에서 차단하거나 최소한 줄이는 방법이 있습니까?
일부 DDOS 공격은 애플리케이션 자체를 겨냥하여 유효한 URI와 HTTP 요청을 보냅니다. 요청 속도가 올라가면 서버가 어려움을 겪고 SLA가 중단됩니다. 이 경우 PHP 수준에서 수행 할 수있는 작업이 있습니다.
애플리케이션 수준 모니터링 : 각 서비스 / 페이지가 진행 상황을 볼 수있는 방식으로 요청을 기록하는지 확인합니다 (공격을 완화하기위한 조치를 취할 수 있음). 몇 가지 아이디어 :
로그 도구 (또는 Excel 등)에 쉽게로드하고 명령 줄 도구 (grep, sed, awk)로 구문 분석 할 수있는 로그 형식이 있어야합니다. DDOS는 수백만 줄의 로그를 생성합니다. 무슨 일이 일어나고 있는지 파악하기 위해 로그 (특히 URI, 시간, IP 및 사용자와 관련하여)를 슬라이스하고 다음과 같은 데이터를 생성해야 할 것입니다.
각 요청의 IP 주소를 기록합니다. DNS를 역방향으로 돌리지 마십시오. 역설적이게도 이렇게하면 공격자가 DDOS를 더 쉽게 사용할 수 있습니다.
합리적인 속도 제한 : 특정 IP 또는 사용자가 특정 기간에 만들 수있는 요청 수에 제한을 구현할 수 있습니다. 합법적 인 고객이 초당 10 개 이상의 요청을 할 수 있습니까? 익명의 사용자가 값 비싼 보고서에 액세스 할 수 있습니까?
익명 액세스를위한 CAPTCHA : 모든 익명 요청에 대해 CAPTCHA를 구현하여 사용자가 DDOS 봇이 아닌 사람인지 확인합니다.
DDOS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
가장 빠른 방법은 바람직하지 않을 수 있지만 협박에 굴복하는 것입니다.
그렇지 않으면 가장 먼저해야 할 일은 호스팅 및 / 또는 CDN 제공 업체에 연락하여 그들과 협력하는 것입니다 (도대체 무슨 일이 일어나고 있는지 물어 보지 않았다면 ...). DDOS가 발생하면 호스팅 공급자의 다른 고객에게 부수적으로 영향을 미칠 수 있으며 공급자는 단순히 리소스를 보호하기 위해 사이트를 종료해야하는 상당한 압력을받을 수 있습니다. 공급자와 로그 (모든 정보)를 공유 할 준비를하십시오. 이러한 로그는 네트워크 모니터와 결합되어 공격을 차단 / 완화하기에 충분한 정보를 제공 할 수 있습니다.
DDOS를 기대하는 경우 호스팅 제공 업체가 제공 할 수있는 보호 수준에 대해 자격을 부여하는 것이 좋습니다. DDOS 경험과이를 완화하기위한 도구가 있어야합니다. 도구, 프로세스 및 에스컬레이션 절차를 이해해야합니다. 또한 호스팅 제공 업체에서이 지원하는 일에 대해 물어 자신의 상류 제공. 이러한 서비스는 더 많은 선불 또는 월 비용을 의미 할 수 있지만이를 보험 정책으로 취급하십시오.
공격을 받고있는 동안 로그를 가져 와서 채굴해야합니다. 공격 패턴을 조사하고 해결해야합니다. 익명 액세스를 끄고 공격을받는 서비스를 제한하는 것을 고려해야합니다 (예 : 서비스에 대한 응용 프로그램의 속도 제한을 줄임).
운이 좋고 고정 된 소규모 고객 기반이있는 경우 유효한 고객 IP 주소를 확인할 수 있습니다. 이 경우 잠시 동안 화이트리스트 접근 방식으로 전환 할 수 있습니다. 모든 고객이 새로운 IP에서 액세스해야하는 경우 전화를 걸 수 있도록 진행되고 있는지 확인하세요. :)
Doug McClean 은 https://stackoverflow.com/a/1029613/1395668 에서 훌륭한 조언을 제공합니다.
질문의 PHP 부분에 따르면;
PHP에 의존하지는 않지만 구현할 수는 있지만 이러한 모든 가능성 이상을 고려해야합니다.
단순 의사;
<?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;
?>
PHP 레벨이 요청 체인에서 너무 늦습니다.
오픈 소스 어플라이언스 뒤에 아파치 서버를 배치하는 것이 좋은 선택 일 수 있습니다.
http://tengine.taobao.org/ 에는 DDOS 방지를 목표로하는 일부 문서와 소스 코드가 더 있습니다. nginx의 확장이므로 아파치 인스턴스의 역방향 프록시로 쉽게 설정할 수 있습니다.
충돌과 싸우는 방법에 대해서는 http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ 를 참조하십시오 .
완전히 잊었습니다. http://www.cloudflare.com 은 최고의 무료 웹 응용 프로그램 방화벽 중 하나이며 무료 및 유료 요금제를 보유하고 있으며 캐싱 기능을 위해 트래픽이 많은 사이트에 많이 사용합니다. . 굉장합니다!
PHP 레벨에서는 이것을 할 수 없습니다. DDOS는 웹 서버에 너무 많은 요청을 보내는 일종의 공격입니다. 웹 서버는 PHP 스크립트를 호출하기 전에 요청을 거부합니다.
Apache를 사용하는 경우 Apache의 몇 가지 팁이 있습니다. http://httpd.apache.org/docs/trunk/misc/security_tips.html
DDoS는 매우 고가의 특수 목적 네트워크 어플라이언스에서 가장 잘 처리됩니다. 호스트는 상대적으로 낮은 성능, 상태 고갈, 제한된 대역폭 등의 영향을 받기 때문에 일반적으로 DDoS 보호를 잘 수행하지 못합니다. iptables, apache mods 및 유사한 서비스를 사용하면 DDoS 완화 하드웨어에 액세스 할 수없는 경우 일부 상황에서 도움이 될 수 있습니다. 또는 DDoS 완화 서비스이지만 이상적이지 않고 여전히 공격 위험에 노출됩니다.
PHP 측에서 이와 같은 것은 어떻습니까?
//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;
}
아파치에서 ddos / dos에 사용할 수있는 플러그인이 있습니다. 좋은 시작 http://www.debianadmin.com/how-to-protect-apache-against-dosddos-or-brute-force-attacks.html
LEMP에있는 경우 여기에서 확인할 수 있습니다. http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
이것들은 저렴한 시작점입니다.
PHP 기반 보호를 사용 하지 마십시오. 끔찍하고 거의 영향을 미치지 않습니다! 예를 들어 limit_req 모듈 ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )을 사용하여 Nginx에서 요청 속도를 제한하도록 웹 서버를 구성합니다.
하지만 CloudFlare를 사용하여 계층 4와 싸우는 것이 좋지만 비용을 지불 할 의사가없는 한 계층 7 기반 공격은 사용하지 않는 것이 좋습니다.
DDOS는 일반적으로 서버 수준에서 차단됩니다. 서버 수준에서 DDOS 보호를 활성화하십시오. DDOS 보호에 대한 아래 참고 사항을 확인하십시오.
DDOS 문제를 방지 할 수있는 Apache HTTP Server 구성 설정 :
RequestReadTimeout 지시문은 클라이언트가 요청을 보내는 데 걸리는 시간을 제한 할 수 있습니다.
헤더를 포함한 요청을 수신하는 데 10 초, 요청 본문을 수신하는 데 30 초를 허용합니다.
RequestReadTimeout header=10 body=30
요청 본문을 수신하는 데 최소 10 초가 걸립니다. 클라이언트가 데이터를 보내는 경우 시간 제한에 대한 상한선없이 수신 된 1000 바이트마다 제한 시간을 1 초씩 늘립니다 (LimitRequestBody에 의해 간접적으로 지정된 제한 제외).
RequestReadTimeout body=10,MinRate=1000
RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
KeepAliveTimeout 지시문은 DoS 공격을받는 사이트에서도 낮출 수 있습니다. 일부 사이트는 KeepAlive를 통해 킵 얼라이브를 완전히 해제하기도합니다. 물론 성능에 대한 다른 단점도 있습니다. 다른 모듈에서 제공하는 다양한 타임 아웃 관련 지시문의 값을 확인해야합니다.
LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine 및 LimitXMLRequestBody 지시문은 클라이언트 입력에 의해 트리거되는 리소스 소비를 제한하도록 신중하게 구성해야합니다. MaxRequestWorkers 지시문을 조정하여 서버가 리소스 부족없이 최대 동시 연결 수를 처리 할 수 있도록합니다.
안티 DDOS 단계 :