분산 서비스 거부 또는 "DDoS" 공격은 악의적인 디지털 통신 전술을 통해 서버의 리소스를 격리합니다. 이러한 유형의 공격은 컴퓨터 세계의 조직적인 습격입니다. 수많은 성가신 반유사 조치가 결합되어 노련한 서버를 궤도에서 멈추게 할 만큼 충분히 강력한 위협을 만듭니다. 무엇보다도, 순진한 서버에 대해 이러한 게릴라 웹 전쟁을 벌이는 여러 수단이 있습니다. 다행히 서버는 반격하도록 구성할 수 있습니다.
널리 사용되는 Unix 시스템용 서버 시스템인 Nginx에는 DDoS 공격의 효율성을 크게 제한할 수 있는 충분한 기능이 내장되어 있습니다.
다음은 Nginx 기반 서버에서 이러한 위협을 처리하기 위한 몇 가지 효과적인 옵션입니다.
구성 파일 백업
설정을 변경하기 전에 서버 구성을 빠르게 백업해야 합니다. 이를 위해 다음 명령이 작동합니다.
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup-original
완료되면 계속 진행할 준비가 된 것입니다.
트래픽 확인
서버의 트래픽을 주시하면 보안을 최적화하고 추가 전술을 구현하기가 더 쉬워집니다. Nginx에는 이를 위해 특별히 제작된 모듈이 있습니다.
상태 페이지 설정
Nginx는 일반적으로 이러한 종류의 기능을 서버 환경에 보다 쉽게 통합할 수 있도록 하는 "stub status"(http_stub_status_module)라는 모듈과 함께 제공됩니다. 먼저 다음 명령을 사용하여 확인하십시오.
nginx -V
또는 위의 파이프를 grep에 연결하여 더 빠르게 찾을 수 있습니다.
nginx -V 2>&1 | grep -o with-http_stub_status_module
출력이 위의 출력과 같으면 계속 진행할 수 있습니다. 그렇지 않으면 포함된 모듈과 함께 Nginx 설치를 다시 설치하거나 다시 컴파일해야 합니다.
확인할 수 있는 상태 페이지를 설정하는 것은 간단하지만 보안을 유지하기 위해 최소(사용자 컴퓨터)로 액세스를 제한해야 합니다. "/etc/nginx/nginx.conf"에 있는 서버의 기본 구성 파일을 열어 시작하십시오.
그것을 열고 "localhost", "/status_page" 및 "127.0.0.1" 대신 자신의 정보를 대체하여 모듈을 활성화하기 위해 "http 지시문"에 다음 코드를 추가합니다.
server { listen 80; listen [::]:80; server_name localhost; ## # Status Page Settings ## location /status_page { stub_status on; allow 127.0.0.1; allow ::1; deny all; } }
참고 :이 파일을 수정하려면 sudo 권한이 필요합니다.
이제 구성을 테스트하십시오.
sudo nginx -t
모든 것이 정상이면 서버에 다시 로드 신호를 보냅니다.
sudo systemctl reload nginx
상태 페이지에 액세스하려면 웹 브라우저에서 "/status_page"가 뒤에 오는 server_name 위치를 방문하거나 curl과 같은 명령줄 도구를 사용하세요. (이는 브라우저의 캐시가 자동으로 업데이트되지 않는 경우에 유용합니다.) 다음은 예제에서 페이지에 액세스하기 위한 curl 명령입니다.
curl localhost/status_page
브라우저에서 위의 내용은 다음 이미지와 같습니다.
액세스 로그 확인
위에서 설정한 상태 페이지를 확인할 때 비정상적인 트래픽이 발생하면 서버의 접속 로그를 확인하는 것이 좋습니다. 이것은 "/var/log/nginx/access.log"에서 찾을 수 있습니다. 로그에는 사용된 HTTP 방법, 액세스 시도 날짜/시간, 사용자 에이전트 및 액세스된 페이지가 나열됩니다.
연결 제한
DDoS 공격을 방지하기 위해 시도해 볼 가치가 있는 여러 유용한 전술 중에서 가장 간단하고 효과적인 것 중 하나는 들어오는 트래픽 속도를 제한하는 것입니다.
이상적으로는 악의적인 봇이 인간 클라이언트에 대해 합리적인 비율을 유지하면서 비인간적인 속도로 서버를 압도하는 것을 방지할 수 있을 정도로 액세스를 억제해야 합니다. Nginx에서는 limit_req_zone
을 사용하여 수행할 수 있습니다. 및 limit_req
지시. 다음 코드는 서버가 표시하도록 구성된 모든 위치에서 사용할 메모리 및 속도 제약 조건을 설정합니다.
limit_req_zone $binary_remote_addr zone=speedbump:10m rate=10r/s;
"영역"은 사용자 요청이 저장되는 메모리 공간의 이름과 크기(이 경우 메가바이트)를 지정합니다. "Rate"는 Nginx가 초당 수락할 총 요청 수를 설정합니다(이 예에서는 10). 이 코드를 하나의 규칙으로 생각하고 다음 코드를 해당 규칙의 사용으로 생각하십시오.
limit_req zone=speedbump burst=20;
위의 코드는 실제로 우리의 제한 규칙을 구현하는 것 이상을 수행합니다. 또한 정상보다 조금 더 빨리 나타나는 합법적인 연결을 부드럽게 처리하기 위해 최대 20개의 요청으로 구성된 작은 대기열을 추가합니다. 규칙과 대기열을 모두 초과하면 클라이언트에 503 오류가 발생합니다. nginx.conf에서 두 지시문은 다음과 같습니다.
IP 주소 블랙리스트
귀하의 서버를 DDoSing하는 IP 주소를 확보할 수 있는 경우 해당 IP 주소를 블랙리스트에 추가하고 이 IP 주소에서 시작된 모든 연결을 끊을 수 있습니다.
서버 지시문에 다음 코드를 추가하십시오.
location / { deny 123.123.123.0/28; # ... }
특정 파일에 대한 차단 요청
DDoS 공격이 서버의 특정 파일을 대상으로 하는 경우(예:WordPress의 xmlrpc.php 파일(대부분의 WordPress 서버에서 많이 대상이 되는 파일)) 해당 파일에 대한 모든 요청을 차단할 수 있습니다. 다음 코드를 서버 지시문에 추가하십시오.
location /xmlrpc.php { deny all; }
위의 절차를 따르면 대부분의 DDoS 공격을 제한할 수 있습니다. 배치할 수 있는 추가 보안 옵션에 대해서는 Nginx 설명서를 확인하십시오.