DDoS(Distributed Denial of Service Attacks)는 일반적으로 서버 차원에서 차단됩니다.
PHP 수준에서 차단하거나 최소한 줄일 수 있는 방법이 있습니까?
그렇지 않은 경우 DDoS 공격을 막는 가장 빠르고 일반적인 방법은 무엇입니까?
질문에 대한 답변
DDOS는 다음과 같은 데이터 센터의 주요 시스템을 압도하는 공격 패밀리입니다.
- 호스팅 센터의 인터넷 네트워크 연결
- 호스팅 센터의 내부 네트워크 및 라우터
- 방화벽과 로드 밸런서
- 웹 서버, 애플리케이션 서버 및 데이터베이스.
DDOS 방어 구축을 시작하기 전에 최악의 경우 위험 가치가 무엇인지 고려하십시오.소규모 커뮤니티를 위한 중요하지 않은 무료 서비스의 경우 위험의 총액은 땅콩일 수 있습니다.수십억달러 규모의 기존 기업에서 유료 공공용 미션 크리티컬 시스템의 경우, 그 가치는 회사의 가치일 수 있습니다.후자의 경우 Stack Exchange를 사용하면 안 됩니다.어쨌든 DDOS를 방어하려면 심층적인 방어 접근법이 필요합니다.
- 호스팅 센터와 협력하여 제공하는 서비스(인터넷 및 방화벽 서비스에 대한 네트워크 연결에서의 IP 및 포트 필터링 포함)를 파악합니다.이것은 매우 중요합니다.호스팅 회사가 DDOS로 인한 데이터 센터 전체의 혼란을 한 고객에게 처리하기 때문에 많은 사이트가 호스팅 회사에 의해 인터넷에서 회수됩니다.또, DDOS 공격시에는, 호스트 센터의 스탭과 매우 밀접하게 협력합니다.따라서, 긴급 번호를 알고, 그들과의 관계를 좋게 해 주세요.이러한 스탭은, 국제 지역 전체를 블록 하거나, 특정의 서비스나 네트워크 프로토콜등의 광범위한 방어 수단을 완전하게 차단하거나, 또는 온·온·온·온·온·오프를 허가할 수 있습니다.y개의 화이트리스트 IP(비즈니스 모델에 따라 다름)
- 호스팅 센터에서는 콘텐츠 전송 네트워크를 사용하여 최종 사용자에게 가까운 서비스(주로 정적)를 배포하고 실제 서버를 DDOS 설계자로부터 숨깁니다.전체 CDN은 DDOS가 모든 국가의 모든 노드를 제거하기에는 너무 큽니다. DDOS가 한 국가에 집중되어 있다면 적어도 다른 사용자는 정상입니다.
모든 시스템과 소프트웨어 패키지를 최신 보안 패치로 최신 상태로 유지합니다.즉, 다음과 같습니다.
- 관리 스위치 – 업데이트가 필요할 수 있습니다.
- 라우터
- 방화벽
- 로드 밸런서
- 운영 체제
- 웹 서버
- 언어 및 그 라이브러리
적절한 방화벽 또는 보안 어플라이언스를 설정하고 자격 있는 보안 전문가가 정기적으로 검토해야 합니다.방화벽에 대한 강력한 규칙은 많은 단순한 공격에 대한 좋은 방어입니다.또한 열려 있는 각 서비스에 사용할 수 있는 대역폭을 관리할 수도 있습니다.
적절한 네트워크 감시 툴을 준비합니다.이것에 의해서, 다음의 내용을 이해할 수 있습니다.
- 단순히 무거운 짐을 지고 있는 것이 아니라 공격을 받고 있다는 것
- 공격원(통상 거래하지 않는 국가도 포함)과
- 공격이 실제로 무엇인지(포트, 서비스, 프로토콜, IP 및 패킷 콘텐츠)
공격은 합법적인 웹 사이트 서비스(예를 들어 쿼리를 실행하는 ‘합법적인’ URI를 공격하거나 데이터를 삽입/갱신/삭제)를 과도하게 사용하는 것일 수 있습니다. 수천에서 수백만 개의 서로 다른 IP 주소에서 수신되는 요청은 사이트를 마비시킵니다.또는 일부 서비스는 실행 비용이 너무 많이 들기 때문에 몇 가지 요청만으로 DOS가 발생할 수 있습니다. 매우 비싼 보고서라고 생각하십시오.따라서 어떤 일이 일어나고 있는지에 대한 적절한 애플리케이션 수준의 모니터링이 필요합니다.
- 호출된 서비스와 전송되는 인수/데이터(애플리케이션 로그인 등)
- 호출하고 있는 사용자와 호출원 IP(애플리케이션 로그인 등)
- DB가 수행하는 쿼리 및 삽입/업데이트/삭제
- 시스템 내 모든 컴퓨터(및 VM)의 부하 평균, CPU 사용률, 디스크 I/O, 네트워크 트래픽
- 이 모든 정보를 쉽게 검색할 수 있는지, 서로 다른 컴퓨터 및 서비스의 로그를 상호 연관시킬 수 있는지 확인합니다(즉, 모든 컴퓨터가 ntp를 사용하여 시간 동기화되었는지 확인합니다).
응용 프로그램의 합리적인 제약 및 제한.예를 들어 다음과 같습니다.
- 로드 밸런서의 QoS 기능을 사용하여 모든 익명 세션을 클러스터 내의 개별 애플리케이션 서버로 전송하고 로그온한 사용자는 다른 세트를 사용합니다.이를 통해 애플리케이션 레벨의 익명 DDOS가 귀중한 고객을 배제하는 것을 방지할 수 있습니다.
- 강력한 CAPCHA를 사용하여 익명 서비스 보호
- 세션 타임아웃
- 보고서와 같은 특정 유형의 요청에 대해 세션 제한 또는 환율 제한을 설정합니다.필요에 따라 익명 액세스를 해제할 수 있는지 확인합니다.
- 사용자가 동시 세션 수를 제한하는지 확인합니다(해킹된 계정이 100만 번 로깅되지 않도록 하기 위해).
- 다양한 서비스에 대해 서로 다른 데이터베이스 애플리케이션 사용자(예: 트랜잭션 사용 및 보고서 사용)를 보유하고 데이터베이스 리소스 관리를 사용하여 한 유형의 웹 요청이 다른 모든 서비스를 압도하는 것을 방지합니다.
- 가능하면 이러한 제약조건을 동적으로 하거나 적어도 구성 가능하게 합니다.이렇게 하면 공격을 받는 동안 사용자당 세션이 1개뿐이고 익명 액세스가 없는 등 적극적인 일시적인 제한(‘공격 스톨링’)을 설정할 수 있습니다.이것은 확실히 고객에게는 좋지 않지만, 서비스가 전혀 없는 것보다는 훨씬 낫습니다.
마지막으로 DOS Response Plan 문서를 작성하여 모든 관계자에 의해 내부 리뷰를 받습니다.비즈니스, 관리, 소프트웨어 개발팀, 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 수준이 너무 늦습니다.
Apache 서버를 오픈 소스 어플라이언스 뒤에 배치하는 것이 좋습니다.
http://tengine.taobao.org/에는 DDOS 예방을 위한 몇 가지 문서와 소스 코드가 있습니다.이는 nginx의 확장이므로 아파치 인스턴스의 역프록시로 쉽게 설정할 수 있습니다.
충돌에 대처하는 방법에 대해서는, http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ 를 참조해 주세요.DoS 공격은 다음과 같습니다.
http://www.cloudflare.com은 최고의 무료 웹 애플리케이션 방화벽 중 하나이며, 무료 및 유료 플랜을 갖추고 있으며, 많은 트래픽 사이트에 캐싱 기능만을 위해 사용하고 있습니다.정말 멋지다!
PHP 수준에서는 이 작업을 수행할 수 없습니다.DDOS는 웹 서버에 너무 많은 요청을 보내는 일종의 공격입니다.웹 서버가 PHP 스크립트를 호출하기 전에 요청을 거부합니다.
Apache 를 사용하고 있는 경우는, Apache 의 힌트(http://httpd.apache.org/docs/trunk/misc/security_tips.html 를 참조해 주세요.
DDoS는 매우 고가의 전용 네트워크 어플라이언스에서 가장 잘 처리됩니다.호스트는 비교적 낮은 성능, 상태 소모, 대역폭 제한 등의 영향을 받기 때문에 일반적으로 DDoS 보호를 제대로 수행하지 못합니다.DDoS 경감 하드웨어 또는 DDoS 경감 서비스에 액세스할 수 없는 경우 iptables, Apache mod 및 유사한 서비스를 사용하면 도움이 될 수 있지만 이상과는 거리가 멀고 여전히 공격의 위험이 있습니다.