본문 바로가기

이슈(보안)

[보안] Bind DNS의 DDoS 차단 기능 100% 활용하기!

반응형
Anti-DDoS 기능 활용을 위해 최신의 Bind DNS로 업그레이드 검토 필요해

 

굳이 지난 6월말, 일부 xxx.go.kr 도메인에 대한 DNS DDoS 공격의 예를 들지 않더라도 최근 DDoS공격자들은 웹에 대한 공격이 anti-ddos에 의해 방어가 되면, 다음 단계로 DNS에 대한 DDoS공격을 감행하는 것이 자주 목격되고 있다. 그만큼 이제 DNS에 대한 DDoS 공격 risk가 현실화되고 있다는 것을 뜻하는 것으로, 이제 각 조직에서는 이에 대한 기술적 대응 방안을 구체적으로 고민하고 해답을 마련하여야 할 시기라고 생각한다. 다행스럽게도 최신 버전의 Bind 소프트웨어에서는 DDoS에 대응 가능한 비율제한(rate-limit) 보안 기능이 추가되어 제공되고 있는데, 유용한 몇 가지 기능에 대해 살펴보도록 하자.

Centos등 Redhat 계열에서는 2013년 3월말부터 6.x 배포판 버전부터 RRL(Response-Rate-Limiting) 이라는 기능을 포함한 bind를 제공하고 있는데, 아래와 같이 확인 가능하다.

# rpm -q bind –changelog
* Wed Mar 27 2013 Adam Tkac <atkac redhat com> 32:9.8.2-0.17.rc1.4

- ship dns/rrl.h in -devel subpkg

이 기능은, bind 설정 파일인 named.conf 의 options {} 내에 rate-limit {} 로 설정할 수 있는데, 제공되는 기능들은 다음과 같다.

[ rate-limit {
         [ responses-per-second number ; ]
         [ referrals-per-second number ; ]
         [ nodata-per-second number ; ]
         [ nxdomains-per-second number ; ]
         [ errors-per-second number ; ]
         [ all-per-second number ; ]
         [ window number ; ]
         [ log-only yes_or_no ; ]
         [ qps-scale number ; ]
         [ ipv4-prefix-length number ; ]
         [ ipv6-prefix-length number ; ]
         [ slip number ; ]
         [ exempt-clients  { address_match_list } ; ]
         [ max-table-size number ; ]
         [ min-table-size number ; ]
      } ; ]

 

이 중에서 유용하게 활용 가능한 중요한 설정 옵션을 살펴보도록 하자.

ipv4-prefix-length number ;
기본적으로, 이 rate-limit 보안 기능은 /24대역 즉, C Class를 기준으로 적용된다. 즉, 동일한 C Class 대역에서 접속을 하면 해당 request는 단일한 client로 인지한다는 것인데, 각 개별 IP별로 count를 하는 것이 reasonable하므로 이 값은 24가 아니라 개별 IP를 뜻하는 32로 설정하는 것이 좋다.

responses-per-second number ;
각 소스 ip별로 초당 응답할 비율을 지정하는 부분이다. 일반적인 qps(qps per second) 공격시에는 한 ip에서 수백~수천 qps를 생성하여 정상적인 질의에 대해 응답하지 못하도록 하므로 한 ip당 5qps이하로 설정하면 오탐없이 운영 가능할 것이다.

nxdomains-per-second number ;
금번 6.25일에 발생했던 xxx.gcc.go.kr(xxx는 임의의 문자열) 에 대한 query flooding공격의 경우 다량의 NX(Non-existent)DOMAIN을 질의함으로써 dns서버의 메모리를 고갈하도록 하거나 정상 유저의 dns질의를 처리하지 못하도록 하는 형태의 공격으로, 위와 같이 설정할 경우 특정 IP에서 초당 일정 수준 이상의 NXDOMAIN 질의에 대해 응답을 하지 않게 된다.

errors-per-second number ;
이는 앞의 nxdomains를 제외한 SERVFAIL,  FORMERR등 모든 종류의 error에 대한 비율제한이라고 생각하면 된다.

all-per-second number ;
이는, 정상,에러응답에 관계없이 한 ip 에서 총 질의 가능한 qps의 수를 제한하는 설정으로 평균적으로 앞에서 설정한 값들의 3-4배 정도로 설정하는 것이 좋다.

log-only yes_or_no ;
설정을 적용하기 앞서 실제비율제한은 하지 않고, rate-limit에 도달시에 로그만 남기도록 하는 설정이다. 각자의 환경에 적용하기 앞서 시범적으로 운영할 때 유용하게 활용할 수 있다.

slip number ;
이는 클라이언트에 대한 유효성 체크 기능이 없는 DNS에 유효성 기능을 추가 하기 위해 실제 DNS를 질의한 client에게 바로 응답하지 않고, TC(truncated) 메시지로 응답하여 tcp로 재질의 하도록 유도하는 기능이다. 그렇게 되면 정상적인 client는 3 way handshake를 한 후 tcp로 재 질의를 하여야 한다. 통상적으로 2 정도면 적당하다.
  
위의 정보를 기초로 실제 작동 여부를 확인해 보도록 하자.
 
named.conf 에 아래와 같이 설정해 보도록 하자.

rate-limit {
     nxdomains-per-second 1;
     ipv4-prefix-length 32;
     slip 2;
 };

이후, 다수의 NXDOMAIN query를 해 보면 다음과 같은 패킷 캡처화면을 볼 수 있다. 

1 192.168.198.173 -> 192.168.213.204 DNS Standard query A 0.809928333227621.example.com
2 192.168.213.204 -> 192.168.198.173 DNS Standard query response, No such name
3 192.168.198.173 -> 192.168.213.204 DNS Standard query A 0.990417249591218.example.com
4 192.168.213.204 -> 192.168.198.173 DNS Standard query response
5 192.168.198.173 -> 192.168.213.204 TCP 41702 > 53 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=3124747279 TSER=0 WS=7
6 192.168.213.204 -> 192.168.198.173 TCP 53 > 41702 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 TSV=3737413786 TSER=3124747279 WS=6
7 192.168.198.173 -> 192.168.213.204 TCP 41702 > 53 [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=3124747282 TSER=3737413786
8 192.168.198.173 -> 192.168.213.204 DNS Standard query A 0.990417249591218.example.com
9 192.168.213.204 -> 192.168.198.173 TCP 53 > 41702 [ACK] Seq=1 Ack=50 Win=14528 Len=0 TSV=3737413788 TSER=3124747282
10 192.168.213.204 -> 192.168.198.173 DNS Standard query response, No such name
11 192.168.198.173 -> 192.168.213.204 TCP 41702 > 53 [ACK] Seq=50 Ack=110 Win=5888 Len=0 TSV=3124747284 TSER=3737413788
12 192.168.198.173 -> 192.168.213.204 TCP 41702 > 53 [FIN, ACK] Seq=50 Ack=110 Win=5888 Len=0 TSV=3124747284 TSER=3737413788
13 192.168.213.204 -> 192.168.198.173 TCP 53 > 41702 [FIN, ACK] Seq=110 Ack=51 Win=14528 Len=0 TSV=3737413791 TSER=3124747284
14 192.168.198.173 -> 192.168.213.204 TCP 41702 > 53 [ACK] Seq=51 Ack=111 Win=5888 Len=0 TSV=3124747287 TSER=3737413791

먼저 1~2 번은 존재하지 않는 도메인으로 질의를 하자 no such name으로 응답한 정상적인 flow이다. 3번은 두 번째 NXDOMAIN query를 하자 4번에서는 질의에 대한 응답 대신 TC(truncated) 메시지로 응답하였으며 5-7번은 3 way handshake를 맺고 8번에서 UDP로 DNS질의를 하자 9번에서 TCP 응답을 하고, 10번에서 UDP로 정상 응답한 것을 알 수 있다. 11번부터 14번까지는 4 way handshake로 TCP 접속을 끊는 화면을 보여주고 있다.  

위의 패킷 캡처 화면에는 보이지 않지만, 4번째 라인의 상세 패킷을 보면
.... ..1. .... .... = Truncated: Message is truncated” 라고 되어 있다.  

설정한 rate-limit 에 걸렸을 경우에는 /var/log/messages 파일에 아래와 같은 로그가 남게 된다.

Jul  1 14:11:10 vul-web named-sdb[15282]: limit responses to xx.xx.xx.xx/32 for xxxx.com IN A  (00014672)
Jul  1 14:12:10 vul-web named-sdb[15282]: stop limiting responses to xx.xx.xx.xx/32 for xxxx.com IN A  (00014672)

위의 예는 client의 소스 IP가 위조되지 않은 경우의 예이지만, 만약 위조된 IP에서 대량의 query가 들어오게 되면 Bind DNS는 설정된 정책에 따라 일부에 대해서만 응답하고, 나머지 요청에 대해서는 응답하지 않게 된다. 이 보안 설정은 도메인에 대한 위임권한을 가진 AUTH DNS 뿐만 아니라, IP 제한이 어려운 resolving(캐싱) DNS 에서도 DNS 증폭 공격을 차단하는 등 유용하게 설정할 수 있을 것이다.

rate-limit 기능 및 DNS에 대한 DDoS에 대한 risk와 대응방안에 대해서는 아래의 링크 및 기사도 참고하기 바란다.

# rate-limit 관련링크
http://www.redbarn.org/dns/ratelimits 

 

출처

- https://www.dailysecu.com/news/articleView.html?idxno=4640

 

728x90
반응형