본문 바로가기
Unix.Linux

리눅스(Linux) 네임서버(bind 9)에서 로그 설정(logging)

by 누피짱 2015. 2. 6.
bind 네임서버는 네임서버관련한 여러 로그를 생성해서 모니터링에 도움을 준다. 이 로그는 주로 2가지 방식으로 처리를 한다. 하나는 syslog를 통해서 남기는 것이고, 다른 하나는 null로 버리는 것이다. 2가지 방법 모두 아쉬운 점이 있다. syslog에 함께 쌓기에는 다른 시스템 로그에 섞여서 보기 불편하고, 로그를 남기지 않기(null)에는 답답하다. bind는 이 딜레마의 명쾌한 답을 제시하고 있다.

1. syslog에 남은 네임서버 로그

다음은 네임서버의 security 카테고리의 로그가 syslog 통해서 저장된 예이다. security 카테고리에 포함된 로그들이어서 남길 필요성이 있지만, 이런 로그들이 많이 쌓이다보면 정작 봐야할 시스템 로그가 가려질 수 있는 문제도 있다. bind 네임서버의 logging 설정에는 로그 카테고리별로 '별도 파일'에 로그를 남기는 방법을 제공한다.

 
Apr  2 06:59:56 ns1 named[620]: client 59.160.XXX.XXX#53109: query (cache) './A/IN' denied
Apr  2 06:59:56 ns1 named[620]: client 211.111.XXX.XXX#53801: query (cache) './A/IN' denied
Apr  2 07:00:02 ns1 named[620]: client 59.160.XXX.XXX#53129: query (cache) './A/IN' denied
Apr  2 07:00:02 ns1 named[620]: client 211.111.XXX.XXX#53812: query (cache) './A/IN' denied
Apr  2 07:00:08 ns1 named[620]: client 59.160.XXX.XXX#53150: query (cache) './A/IN' denied
Apr  2 07:00:08 ns1 named[620]: client 211.111.XXX.XXX#53826: query (cache) './A/IN' denied
Apr  2 07:00:14 ns1 named[620]: client 59.160.XXX.XXX#53174: query (cache) './A/IN' denied
Apr  2 07:00:14 ns1 named[620]: client 211.111.XXX.XXX#53840: query (cache) './A/IN' denied
 


2. named.conf 에서 logging 설정

 
logging {
        category lame-servers { null; };
        category notify       { null; };

        channel default_debug { null; };
        channel debug_log {
                file "/var/log/named_debug.log" versions 10 size 20M;
                severity dynamic;
                print-category yes;
                print-severity yes;
                print-time yes;
        };

        category security { debug_log; };
        category xfer-in  { debug_log; };
        category xfer-out { debug_log; };
        category general  { debug_log; default_syslog; };
};
 


위의 logging 설정의 하나 하나가 정확히 어떤 것을 의미하는지 모르더라도, 짐작은 될 것이다.

1) notify, lame-servers 카테고리는 로그를 남기지 않는다.
2) security, xfer-in, xfer-out, general 카테고리(category security 항목)에 해당하는 로그를 /var/log/named_debug.log 파일로 저장한다. 파일 크기는 20MB 로 제한한다.

짐작했던 것이 맞았는가? 그렇다면 이제 상세하게 살펴보자.

1) file "파일명" : 로깅 파일의 경로를 지정한다. 만약 chroot된 상태로 운영한다면, 실제 저장경로는 chroot된 디렉토리 아래에 쌓인다. chroot 디렉토리가 /var/named라고 할 때, 실제로는 /var/named/var/log/ 아래에 쌓이게 되는 것이다. 네임서버가 다른 유저 권한으로 실행된다면(데몬 실행시 -u user명 옵션), 해당 유저에게 디렉토리 쓰기 권한이 있어야 한다.
2) versions 숫자 : 로이테션하여 보관할 로그 갯수를 지정한다. 로테이션이 되면 가장 최신 로그가 .0 이며, 그 이전의 로그는 .1, 그 이전은 .2, .3, .4... 처럼 로그 파일명이 정해진다. 'versions 99' 는 로테이션시 unlimited로 간주된다.
3) size 크기 : 파일 크기를 지정한다. 단위가 없으면 bytes단위. 10M은 10 MBytes를 뜻한다. 사용할 수 있는 단위는 k, K, m,M, g, G
4) versions와 size와의 관계를 살펴보자.
   ① size, versions 모두 설정한 경우 (일반적인 경우임)
      size값으로 설정한 크기에 도달하면 로그는 로테이션 된다.
   ② versions 파라미터가 없고, size 값만 설정한 경우
      size로 지정한 크기까지 로그를 남기고 멈춘다. files이 다시 줄어든 경우(삭제나 truncate) 로그를 남긴다.
   ③ size 값 설정이 없고, versions만 설정한 경우
      bind가 재실행될 때만 로테이션 된다.

5) severity 레벨 :

  critical | error | warning | notice | info  | debug [ level ] | dynamic  


severity로 지정할 수 있는 것은 위 7가지. 오른쪽으로 갈수록 보다 상세한 로그가 남는다. 이는 syslog의 level을 생각하면 된다. debug 레벨은 debug 0으로 지정하면 디버깅 모드를 사용하지 않는 것이며, 1~3까지 레벨을 지정하면 디버깅 모드로 로그(보다 상세한 로그)를 남긴다.

dynamic은 뭘까? debug 레벨로 로그를 남긴다. 그러나 이 로그 레벨이 0~3 중에서 하나로 고정되는 것이 아니라, 동적으로 변경할 수 있다는 의미이다. 동적으로 어떻게 변경할까? 2가지 방법이 있다. bind(데몬명 : named) 데몬을 실행할 때 -d '레벨'으로 지정하거나, rndc trace명령으로 debug 레벨을 변경할 수 있다. debug 레벨을 0으로 초기화하려면 rndc notrace 명령을 내리면 된다.

다음은 rndc에서 debug 레벨관련 관련 명령어이다.
 
  trace      Increment debugging level by one.
  trace level   Change the debugging level.
  notrace   Set debugging level to 0.
 


rndc status 명령으로 현재 debug 레벨을 확인할 수 있다.
 
# rndc status
number of zones: ???
debug level: 0
... 생략 ...
server is up and running
 


6) print-time yes     : 로그 파일에 날짜, 시간 정보를 남긴다. default = no
7) print-category yes : 로그 카테고리 정보를 남긴다. default = no
8) print-severity yes : 로그 severity(중요도 정도, 이를테면 error, notice, info, debug 등)를 남긴다. default = no

위에서 반드시 print-time은 yes로 설정해줘야 모니터링이 편하며, 3개 모두 yes로 설정하는 것을 개인적으로 권장한다.

9) category 카테고리명 : 로그의 카테고리를 지정한다. 카테고리가 상당히 많으므로 bind 매뉴얼을 살펴보는게 좋다.

10) channel 채널명 :

channel은 logging 설정의 묶음이다. 동일한 설정을 여러 카테고리별로 사용할 때, 각 카테고리별로 반복 설정할 필요없이 하나의 channel명으로 정의를 해놓으면 된다. 위 logging 설정 중 category security 설정을 다시 보자.

 
        category security { debug_log; };
 


category security는 debug_log 채널 설정을 따른다고 되어 있다. 결국 security 카테고리는 1) named_debug.log 로그 파일에, 2) 최대 20MB크기, 10개까지 로테이션, 3) 로그 파일에는 시간정보와 카테고리, 레벨 정보를 남기게 된다.

3. channel 설정 깊이 알기

이 부분은 모르고 넘어가도 되니, 급한 분은 '4. 네임서버 로그'로 넘어가기 바란다.
channel은 사용자가 정의하는 채널도 있지만, 미리 정의된 4개의 채널이 존재한다.

- default_syslog
- default_debug
- default_stderr
- null

각각 채널은 다음과 같이 미리 정의되어 있다.

 
channel default_syslog {
        syslog daemon;        # send to syslog's daemon facility
        severity info;        # only send priority info and higher
};

channel default_debug {
        file "named.run";     # write to named.run in the working directory
                              # Note: stderr is used instead of "named.run"
                              # if the server is started with the "-f" option.
        severity dynamic;     # log at the server's current debug level
};

channel default_stderr {  # writes to stderr
        file "<stderr>";      # this is illustrative only; there's currently
                              # no way of specifying an internal file
                              # descriptor in the configuration language.
        severity info;        # only send priority info and higher
};

channel null {            
        null;                 # toss anything sent to this channel
};
 


syslog로 보내지는 로그는 default_syslog 채널의 설정을 적용받는다. 로그 분류(facility)는 daemon으로 되어 있고, info 레벨 이상의 로그만 syslog로 보내진다. 이를 변경하려면 default_syslog를 재정의하면 된다. local1~local6 등으로 facility를 설정하면 syslog로그로 보내진 로그도 별도 파일에 저장하기 편할 것이다.

debug 레벨 로그는 default_debug 채널의 설정을 적용받는다. rndc trace 명령으로 debug 레벨을 변경한 상태라면 named.run 파일(file "named.run"; 설정)에 로그를 저장하려고 할 것이다. 그러나 named.run 파일을 생성하거나 write할 퍼미션이 없다면 다음과 같이 로그가 syslog쪽에 남게 된다.

 
Apr  2 08:06:42 ns1 named[17414]: loading configuration from '/etc/named.conf'
Apr  2 08:06:42 ns1 named[17414]: isc_log_open 'named.run' failed: permission denied
 


debug 레벨 로그가 필요없다면 다음과 같이 null 처리해 주는 것도 괜찮다.

 
   channel default_debug { null; };
 


또는 별도 파일명을 지정해도 된다. 이 글 맨 위의 logging 설정에 다음 설정을 추가한다면 의미는 이런 의미를 갖게 된다. security, xfer-in, xfer-out, general 이외 카테고리의 debug 레벨 로그는 named_misc.log에 남게 된다.

 
   channel default_debug {
      file "/var/log/named_misc.log";
      severity dynamic;

      print-category yes;
      print-severity yes;
      print-time yes;
   };
 


다음과 같이 general 카테고리는 2개의 채널이 적어진 경우도 있다. 이는 2개의 채널 설정을 모두 따르겠다는 의미이다. 즉, debug 로그 파일에도 저장이 되고, syslog로도 보내진다.

 
   category general  { debug_log; default_syslog; };
 


general 카테고리는 네임서버와 관련된 기본적 로그들이 많다. 따라서 general 카테고리를 별도 정의하고 싶다면 syslog에도 보내도록 설정해주는 것이 좋다.

4. 네임서버 로그

위처럼 logging 설정을 하고, rndc reload 또는 네임서버 재실행을 하면 된다. rndc trace명령으로 debug 레벨을 변경해보면 debug 레벨별로 어떤 로그가 남기는지 알 수 있다. 경험적으로는 debug 0 (즉, info)또는 debug 1 이 로그량에서 적당하다. 참고로 날짜 형식은 '02-Apr-2009' 또는 'Apr  2'형식으로 남는다.

 
02-Apr-2009 07:47:44.849 security: info: client 211.111.XXX.XXX#59106: query (cache) './A/IN' denied
02-Apr-2009 07:47:50.453 security: info: client 59.160.XXX.XXX#61038: query (cache) './A/IN' denied
02-Apr-2009 07:47:50.849 security: info: client 211.111.XXX.XXX#59122: query (cache) './A/IN' denied
02-Apr-2009 07:47:56.453 security: info: client 59.160.XXX.XXX#61060: query (cache) './A/IN' denied
02-Apr-2009 07:48:02.233 security: info: client 202.108.XXX.XXX#60838: query (cache) './NS/IN' denied
02-Apr-2009 07:48:02.276 security: info: client 202.108.XXX.XXX#60838: query (cache) './NS/IN' denied
... 생략 ...
02-Apr-2009 07:52:38.968 security: debug 1: client 164.124.XXX.XXX#32904: recursion available: denied
02-Apr-2009 07:52:42.813 security: debug 1: client 222.254.XXX.XXX#17366: recursion available: denied
02-Apr-2009 07:53:43.920 security: debug 3: client 66.249.XXX.XXX#55479: request is not signed
02-Apr-2009 07:53:43.920 security: debug 1: client 66.249.XXX.XXX#55479: recursion available: denied
02-Apr-2009 07:53:43.920 security: debug 3: client 66.249.XXX.XXX#55479: query '도메인명/IN' approved
 


5. 참고자료

* DNS BIND logging Clause
  http://www.zytrax.com/books/dns/ch7/logging.html

* BIND Configuration File Guide -- logging Statement
  http://www.ludd.luth.se/~kavli/BIND8/logging.html

* 네임서버의 로그
  http://ubuntu.or.kr/viewtopic.php?f=21&t=4042&p=18550

* Secure BIND Template
  http://www.cymru.com/Documents/secure-bind-template.html

* named.conf man page
  http://docsrv.sco.com/cgi-bin/man/man?named.conf+4tcp


제  목 : 네임서버(bind 9)에서 로그 설정(logging)
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2009.11.9(월)

댓글