DDOS Attack 막기(Linux,Apache 환경)

 

Written by Inshane

불펌은 상관하지 않으나 내용 출처는 밝혀주시기 바랍니다. – CEnA

 

0. DDOS 개요

사이트를 운영하다보면 정말 별의 별놈이 다 있는걸 알 수 있는데

DDOS 공격은 여러 경로를 통해 감염된 좀비 PC들을 이용하여 한 서버에 트래픽을 과도하게 유발하여

서버 운영을 막는 변태적(?)인 공격이다.

일반적인 공격은 모든 아이피를 대상으로 개방된 웹서버를 지정하여 공격이 들어올때가 많으며,

이때 공격에 사용될 사이트내 특정 주소를 무한 연결하여 서버에 트래픽을 유발한다.

 

몇몇 중소업체를 대상으로 공격을 시도하는 푼돈벌이꾼, 자칭 “현수씨”로 인해

유무형의 피해를 보신 업체 관리자들을 위해 이 글을 적는다.

 

 

1. 기본적 설명 배경

 ㄱ. 서버환경은 :  CentOS 4, Apache, Oops-firewall(oops.org)를 기준으로 하되 기본 방화벽(iptable) 이라해도 별반 차이없다.
 ㄴ. 웹서버를 공격하고 있는것으로 간주하고 설명을 적는다.

 ㄷ. 모든 공격은 100% 막는다는게 없다. 막았다 생각되도 공격자가 공격 패턴을 바꿔가면서 공격하기 때문이다.

이런 싸움은 누가 먼저 지치느냐의 싸움이므로 공격시도시 빠른시간에 캐치하여 공격 패턴을 빠르게 추리는게 답이다.

2. 공격 진단

DDOS 공격시 공격자들은 DB에 Update나 Insert, Delete등을 일으키는 주소를 입력하여 공격하는 경우가 많다.

이경우는 DB 부하까지 같이 생기므로 서버 부하량 측정시 DB도 같이 점검하도록 한다.
(ex : 게시판 글 조회시 hit 수가 update되는걸 이용하여 특정 게시판 주소 등을 직접 입력하여 공격한다.)

 

또한 한개의 주소를 Attack하는 경우 해당 주소를 바꾸는 식으로 방어가 가능하기 때문에
여러개의 주소를 동시다발적으로 입력할때가 많다. 공격 패턴은 다양하지만

대부분 아래와 같은 방법으로 공격당하고있는 현재 서버 상태에 대한 진단이 가능하다.

 

ㄱ. $ top -d 1
  : httpd가 차지하는 점유율이나 평균 서버 부하량을 본다. 평균적인 서버 부하량을 미리 알고 있다면 비교가 될것이다.
 한서버에 웹+DB등 여러가지를 돌리는 서버라면 어느곳에서 부하가 생기는지 잘 측정해봐야 할것이다.

ㄴ. $ ps aux | grep httpd | wc -l   
  : 프로세서 개수 구하기, 일반적인 프로세서 개수보다 급증해 있는지 체크해본다.
 Apache 설정에서 지속성(KeepAlive) 등의 설정에 따라 프로세서의 기본 개수는 차이가 있다.

ㄷ. $ tail -f /var/log/httpd/access_log   //아파치 로그를 찍어봅니다. 
  : 웹서버를 공격한다면 로그를 직접 보는게 가장 확실하게 공격여부를 체크할 수 있다. 
 공격이 자주 시도되는 주소 몇개를 찾아서 해당내용만 grep ‘내용’ 등으로 걸어서 정확한 공격 주소를 찾아본다.

 

 3. 공격 대처
 
  ㄱ. 아파치를 종료시키거나 80포트(웹서비스 운영포트)를 차단한다.

포트 차단시 일부 https(443)등도 같이 차단해줘야 효과를 볼 수 있을것이다.
 
  ㄴ. 아파치 로그를 분석한다. 공격이 들어오는 웹주소를 찾아서 해당 주소의 IP리스트를 뽑는다.
  DDOS 공격시 좀비 pc는 최소 50대~최대 몇만대 가량의 pc가 동원될 수 있으며

중/소규모 웹서버에는 평균적으로 2천대에서 5천대정도의   좀비pc가 동원되는것으로 추정된다.
 이 좀비pc들을 죄다 Block 처리 하는식으로 내용을 뽑도록 한다.

 

  ㄷ. DB에 엑세스 하는 경우 DB에 Insert/Update/Delete를 못하도록 하고, 공격이 과다할때는 select도 부하량이 걸릴수 있으므로

모든 DB연결을 끊는것도 하나의 방법이다.

 

 

4. 테스트 예제 스크립트 작성

 

아래와 같이  192.168.10.1 주소에서 /test/test.html을 공격하고 있음을 알 수 있고, 해당 루틴을 뽑아내기 위해

아래와 같이 스크립트를 구성한다.

192.168.10.1 – – [04/Oct/2010:11:49:57 +0900] “GET /test/test.html HTTP/1.1” 200 5 “http://www.cena.co.kr/test/test.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)”
192.168.10.1 – – [04/Oct/2010:11:49:57 +0900] “GET /test/test.html HTTP/1.1” 200 5 “http://www.cena.co.kr/test/test.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)”
192.168.10.1 – – [04/Oct/2010:11:49:58 +0900] “GET /test/test.html HTTP/1.1” 200 5 “http://www.cena.co.kr/test/test.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)”
192.168.10.1 – – [04/Oct/2010:11:49:58 +0900] “GET /test/test.html HTTP/1.1” 200 5 “http://www.cena.co.kr/test/test.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)”
192.168.10.1 – – [04/Oct/2010:11:49:58 +0900] “GET /test/test.html HTTP/1.1” 200 5 “http://www.cena.co.kr/test/test.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)”

 

실제 스크립트 구현단계(test.sh)

 

 

핵심이 되는 구간은 7,8,9라인이다.
7번라인에서는 access_log에서 30초 전부터 현재시간까지의 로그를 뽑되($4)
그중에서 IP에 해당되는 부분($1) 과 엑세스주소를($7) 를 뽑는다.
(뽑히는 형태 :    192.168.10.1  /test/test.html 식이다.)

 

테스트를 위해 30초내 2번 이상 해당 로그가 찍혀 있다면(거의 대부분의 로그가 찍힐것이다.) attack으로 간주하도록 하였으나
실제로 DDOS 공격시 30초내 최소 10회 이상 Attack이 들어오므로 해당 수치를 조정할 필요가 있다.
너무 적게 잡으면 일반적인 유저가 블럭될 수 있고, 너무 크게 잡으면 DDOS공격자가 수치를 적당히 낮춰서

지속적으로 공격을 할수도 있으니 적절하게 정하도록 한다.

 

일반적인 DDOS 공격패턴은 크게 두가지로 나뉘는데 1분내 동원 가능한 pc가 1000대라면

 ㄱ. 1000대의 좀비pc가 트래픽이 허용하는 만큼 단일한 특정주소로 공격이 들어오는 경우
 가장 잘 발생하는 공격패턴이며, 보통 공격시 같은 아이피에서 1초에 3~10번가량을 페이지 Access 하므로 이를 추려낸다.

 

 ㄴ. 1000대가 각각 한번씩만 특정 주소를 엑세스하는경우
 거의 발생하지 않는 경우지만 정교하게 제어가 가능한 좀비pc라면 이런 패턴으로 공격이 들어올 수도 있다.
 이경우 검출 시간을 늘려서 IP를 체크하거나  IP로 비교하는 대신에 특정 주소로 비교를 하여

해당 주소로 공격이 들어감을 추릴 수 있다.  다소 검출에 까다로우므로 로그를 분석후 적용할 규칙을 정하도록 한다.

간혹 특정 주소도 순차적으로 바꿔가면서 엑세스 하는 경우가 있으나 대부분 숫자만 바꿔가거나(/test/test.html?id=1 ~ 1000), 

50개 이내의 주소를 번갈아가면서 공격하는 식이다.(ex : /test/test1.html~test50.html)

 

8번 라인은 방화벽에 등록할 IP내용이다.방화벽 단계에서 DROP하도록 한다.
%-A INPUT -s 192.168.10.1 -j DROP
구절이 완성되고 oops-firewall인 경우 user.conf에 등록시키도록 한다. (기본 iptable의 경우 iptable 설정에 등록시킨다.)

9번 라인은 공격으로 간주한 Pattern을 표기한것이다.

 

이후 자동으로 DDOS를 막기 위해 비교식을 추가로 더 넣어볼 수도 있다.

httpd 프로세서의 수를 검출해서 이 수치가 지정된 수치보다 더 커지는지를 감지하거나
(ex : httpdCnt=ps -ef | grep 'httpd' | wc -l)
네트워크 접속수치를 확인하여 이 수치가 지정된 수치보다 커지는지를 감지
(ex : connUserCnt=netstat -na | grep 'ESTABLISHED' | wc -l )

위의 방법을 응용하여 방어 방법을 마련할 수도 있다.

 

5. 마치며

DDOS의 가장 확실한 해결책은 모든 좀비PC를 차단하는 것이라 생각된다.

차단된 좀비PC가 실제 사이트 이용자인지 아닌지를 판단하여 적절한 보안대책을 설명해주도록 한다.

물론 차단된  IP를 풀어줄때도 충분히 고려하고 풀어주도록 하며, 섣부른 패턴 판단은 금물이니

꼼꼼하게 패턴을 판단해서 DDOS공격과 일반 사용자를 구분하도록 한다.

 

 

 

]]>

도큐멘트 에 올린 글 태그됨: , , , , , , , , ,

댓글 남기기