DDoS (Distributed Denial of Service Attacks)는 일반적으로 서버 수준에서 차단됩니까?
PHP 수준에서 차단하거나 최소한 줄이는 방법이 있습니까?
그렇지 않다면 DDoS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
답변
DDOS는 다음과 같은 데이터 센터의 주요 시스템을 압도하는 공격 군입니다.
- 호스팅 센터의 인터넷 네트워크 연결
- 호스팅 센터의 내부 네트워크 및 라우터
- 방화벽 및로드 밸런서
- 웹 서버, 애플리케이션 서버 및 데이터베이스.
DDOS 방어를 구축하기 전에 최악의 위험 가치가 무엇인지 고려하십시오. 소규모 커뮤니티를위한 중요하지 않고 무료로 사용할 수있는 서비스의 경우 위험에 처한 총 가치는 땅콩 일 수 있습니다. 수십억 달러 규모의 기존 비즈니스를위한 유료, 공개 대상, 미션 크리티컬 시스템의 경우 그 가치는 회사의 가치 일 수 있습니다. 후자의 경우 StackExchange를 사용하면 안됩니다. 🙂 어쨌든 DDOS를 방어하려면 심층 방어 접근 방식이 필요합니다.
- 호스팅 센터와 협력하여 그들이 제공하는 인터넷 및 방화벽 서비스에 대한 네트워크 연결에서의 IP 및 포트 필터링을 포함하여 그들이 제공하는 서비스를 이해하십시오. 이것은 매우 중요합니다. 호스팅 회사가 DDOS로 인해 한 고객에게 발생하는 데이터 센터 전체의 중단을 처리하기 때문에 호스팅 회사 가 인터넷에서 많은 사이트를 가져옵니다 . 또한 DDOS 공격 중에는 호스팅 센터의 직원과 매우 긴밀하게 협력하므로 비상 전화 번호를 알고 그들과 좋은 관계를 유지하십시오 🙂 그들은 전체 국제 지역을 차단하고 특정 서비스 또는 네트워크를 완전히 차단할 수 있어야합니다. 프로토콜 및 기타 광범위한 방어 조치 또는 허용 목록에있는 IP 만 허용 (비즈니스 모델에 따라 다름)
- 호스팅 센터에서 -Content Delivery Network 를 사용 하여 최종 사용자에게 가까운 서비스 (주로 정적)를 배포하고 DDOS 설계자로부터 실제 서버를 숨 깁니다. 전체 CDN은 DDOS가 모든 국가의 모든 노드를 제거하기에는 너무 큽니다. DDOS가 한 국가에 초점을 맞추고 있다면 적어도 다른 사용자는 여전히 괜찮습니다.
-
모든 시스템과 소프트웨어 패키지를 최신 보안 패치로 업데이트 하십시오. 모든 것을 의미합니다.
- 관리 형 스위치-가끔 업데이트가 필요합니다.
- 라우터
- 방화벽
- 로드 밸런서
- 운영체제
- 웹 서버
- 언어와 라이브러리
-
적절한 방화벽 또는 보안 어플라이언스가 설정되어 있고 자격을 갖춘 보안 전문가가 정기적으로 검토 하는지 확인하십시오 . 방화벽에 대한 강력한 규칙은 많은 단순 공격에 대한 좋은 방어입니다. 개방형 서비스마다 사용 가능한 대역폭을 관리 할 수있는 것도 유용합니다.
-
적절한 네트워크 모니터링 도구 를 갖추십시오. 다음을 이해하는 데 도움이 될 수 있습니다.
- 단순히 무거운 부하를받는 것이 아니라 공격을 받고 있음
- 공격의 출처 (일반적으로 거래하지 않는 국가 포함) 및
- 공격이 실제로 무엇인지 (포트, 서비스, 프로토콜, IP 및 패킷 콘텐츠)
-
공격은 단순히 합법적 인 웹 사이트 서비스를 많이 사용하는 것일 수 있습니다 (예 : 쿼리를 실행하는 ‘법적’URI를 누르거나 데이터를 삽입 / 업데이트 / 삭제). 수천 또는 수백만 개의 서로 다른 IP 주소에서 들어오는 수천 또는 수백만 개의 요청이 사이트를 무릎. 또는 일부 서비스는 실행 비용이 너무 비싸서 몇 개의 요청만으로 DOS가 발생할 수 있습니다. 정말 값 비싼 보고서라고 생각하면됩니다. 따라서 무슨 일이 일어나고 있는지에 대한 좋은 애플리케이션 수준 모니터링 이 필요 합니다.
- 호출 된 서비스 및 전송되는 인수 / 데이터 (예 : 애플리케이션에 로그인)
- 호출을 수행하는 사용자 및 IP (예 : 애플리케이션에 로그인)
- DB가 수행하는 쿼리 및 삽입 / 업데이트 / 삭제
- 시스템의 모든 컴퓨터 (및 VM)에 대한로드 평균, CPU 사용률, 디스크 I / O, 네트워크 트래픽
- 이 모든 정보를 쉽게 검색 할 수 있고 서로 다른 컴퓨터 및 서비스의 로그를 연관시킬 수 있는지 확인하십시오 (즉, 모든 컴퓨터가 ntp를 사용하여 시간 동기화되었는지 확인).
-
응용 프로그램의 현명한 제약 및 제한 . 예를 들어 다음과 같이 할 수 있습니다.
- 로드 밸런서의 QoS 기능을 사용하여 모든 익명 세션을 클러스터의 개별 애플리케이션 서버로 전송하고 로그온 한 사용자는 다른 세트를 사용합니다. 이것은 응용 프로그램 수준의 익명 DDOS가 귀중한 고객을 빼앗는 것을 방지합니다.
- 강력한 CAPCHA를 사용하여 익명 서비스 보호
- 세션 시간 초과
- 보고서와 같은 특정 유형의 요청에 대해 세션 제한 또는 비율 제한이 있습니다. 필요한 경우 익명 액세스를 끌 수 있는지 확인
- 사용자의 동시 세션 수에 제한이 있는지 확인하십시오 (해킹 된 계정이 백만 번 로그온하는 것을 방지하기 위해).
- 서로 다른 서비스 (예 : 트랜잭션 사용과보고 사용)에 대해 서로 다른 데이터베이스 애플리케이션 사용자를 보유하고 데이터베이스 리소스 관리를 사용하여 한 유형의 웹 요청이 다른 모든 요청을 압도하는 것을 방지합니다.
- 가능한 경우 이러한 제약 조건을 동적으로 만들거나 최소한 구성 가능하게 만드십시오. 이렇게하면 공격을받는 동안 사용자 당 하나의 세션 만 있고 익명 액세스가없는 등 공격적인 임시 제한 (공격을 ‘조절’) 할 수 있습니다. 이것은 확실히 고객에게는 좋지 않지만 서비스가 전혀없는 것보다 훨씬 낫습니다.
-
마지막으로 DOS 대응 계획 문서를 작성하고 비즈니스, 관리, SW 개발 팀, IT 팀 및 보안 전문가와 같은 모든 관련 당사자의 내부 검토를받습니다. 문서를 작성하는 과정은 귀하와 귀하의 팀이 문제를 숙고하게하고, 휴일 오전 3시에 최악의 상황이 발생할 경우 대비할 수 있도록 도와줍니다. 문서는 다음 사항을 포함해야합니다.
- 위험에 처한 요소와 비즈니스 비용
- 자산 보호를위한 조치
- 공격 탐지 방법
- 계획된 대응 및 에스컬레이션 절차
- 시스템 및이 문서를 최신 상태로 유지하기위한 프로세스
따라서 서문을 제쳐두고 여기에 몇 가지 구체적인 답변이 있습니다.
DDOS는 일반적으로 서버 수준에서 차단됩니다.
실제로는 아닙니다. 최악의 DDOS 공격의 대부분은 낮은 수준 (IP 패킷 수준에서)이며 DDOS 공격을 처리하기 위해 개발 된 라우팅 규칙, 방화벽 및 보안 장치에 의해 처리됩니다.
PHP 수준에서 차단하거나 최소한 줄이는 방법이 있습니까?
일부 DDOS 공격은 애플리케이션 자체를 겨냥하여 유효한 URI와 HTTP 요청을 보냅니다. 요청 속도가 올라가면 서버가 어려움을 겪고 SLA가 중단됩니다. 이 경우 PHP 수준에서 수행 할 수있는 작업이 있습니다.
-
애플리케이션 수준 모니터링 : 각 서비스 / 페이지가 진행 상황을 볼 수있는 방식으로 요청을 기록하는지 확인합니다 (공격을 완화하기위한 조치를 취할 수 있음). 몇 가지 아이디어 :
-
로그 도구 (또는 Excel 등)에 쉽게로드하고 명령 줄 도구 (grep, sed, awk)로 구문 분석 할 수있는 로그 형식이 있어야합니다. DDOS는 수백만 줄의 로그를 생성합니다. 무슨 일이 일어나고 있는지 파악하기 위해 로그 (특히 URI, 시간, IP 및 사용자와 관련하여)를 슬라이스하고 다음과 같은 데이터를 생성해야 할 것입니다.
- 액세스되는 URI
- 높은 비율로 실패하는 URI (공격자가 공격하는 특정 URI의 가능성 표시)
- 서비스에 액세스하는 사용자
- 각 사용자가 서비스에 액세스하는 IP는 몇 개입니까?
- 익명 사용자가 액세스하는 URI는 무엇입니까?
- 주어진 서비스에 사용되는 인수
- 특정 사용자 작업 감사
-
각 요청의 IP 주소를 기록합니다. DNS를 역방향으로 돌리지 마십시오. 역설적이게도 이렇게하면 공격자가 DDOS를 더 쉽게 사용할 수 있습니다.
- 전체 URI 및 HTTP 메서드를 기록합니다. 예 : “GET http://example.com/path/to/service?arg1=ddos “
- 존재하는 경우 사용자 ID를 기록하십시오.
- 중요한 HTTP 인수 기록
-
-
합리적인 속도 제한 : 특정 IP 또는 사용자가 특정 기간에 만들 수있는 요청 수에 제한을 구현할 수 있습니다. 합법적 인 고객이 초당 10 개 이상의 요청을 할 수 있습니까? 익명의 사용자가 값 비싼 보고서에 액세스 할 수 있습니까?
-
익명 액세스를위한 CAPTCHA : 모든 익명 요청에 대해 CAPTCHA를 구현하여 사용자가 DDOS 봇이 아닌 사람인지 확인합니다.
DDOS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
가장 빠른 방법은 바람직하지 않을 수 있지만 협박에 굴복하는 것입니다.
그렇지 않으면 가장 먼저해야 할 일은 호스팅 및 / 또는 CDN 제공 업체에 연락하여 그들과 협력하는 것입니다 (도대체 무슨 일이 일어나고 있는지 물어 보지 않았다면 …). DDOS가 발생하면 호스팅 공급자의 다른 고객에게 부수적으로 영향을 미칠 수 있으며 공급자는 단순히 리소스를 보호하기 위해 사이트를 종료해야하는 상당한 압력을받을 수 있습니다. 공급자와 로그 (모든 정보)를 공유 할 준비를하십시오. 이러한 로그는 네트워크 모니터와 결합되어 공격을 차단 / 완화하기에 충분한 정보를 제공 할 수 있습니다.
DDOS를 기대하는 경우 호스팅 제공 업체가 제공 할 수있는 보호 수준에 대해 자격을 부여하는 것이 좋습니다. DDOS 경험과이를 완화하기위한 도구가 있어야합니다. 도구, 프로세스 및 에스컬레이션 절차를 이해해야합니다. 또한 호스팅 제공 업체에서이 지원하는 일에 대해 물어 자신의 상류 제공. 이러한 서비스는 더 많은 선불 또는 월 비용을 의미 할 수 있지만이를 보험 정책으로 취급하십시오.
공격을 받고있는 동안 로그를 가져 와서 채굴해야합니다. 공격 패턴을 조사하고 해결해야합니다. 익명 액세스를 끄고 공격을받는 서비스를 제한하는 것을 고려해야합니다 (예 : 서비스에 대한 응용 프로그램의 속도 제한을 줄임).
운이 좋고 고정 된 소규모 고객 기반이있는 경우 유효한 고객 IP 주소를 확인할 수 있습니다. 이 경우 잠시 동안 화이트리스트 접근 방식으로 전환 할 수 있습니다. 모든 고객이 새로운 IP에서 액세스해야하는 경우 전화를 걸 수 있도록 진행되고 있는지 확인하세요. 🙂
Doug McClean 은 https://stackoverflow.com/a/1029613/1395668 에서 훌륭한 조언을 제공합니다.
답변
질문의 PHP 부분에 따르면;
PHP에 의존하지는 않지만 구현할 수는 있지만 이러한 모든 가능성 이상을 고려해야합니다.
- 공격자는 각 요청에 대해 IP를 변경할 수 있습니다.
- 공격자는 대상 사이트가이 매개 변수를 신경 쓰지 않는 URI에 매개 변수를 전달할 수 있습니다.
- 공격자는 만료되기 전에 세션을 다시 시작할 수 있습니다.
단순 의사;
<?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
이것들은 저렴한 시작점입니다.