사이트 내 전체검색
[linux] DNS 에서의 보안 및 Optimizing
로빈아빠
https://cmd.kr/server/227 URL이 복사되었습니다.

본문

DNS 에서의 보안 및 Optimizing

[출처] http://www.linuxlab.co.kr/docs/01-06-6.htm

ISC BIND(Berkeley Internet Name Domain) & DNS 에서의 보안 및 Optimizing (1)

필자: 이우중(wjlee at debianusers.org)

참고문헌

Securing and Optimizing Linux: DNS and BIND
Author’s: Gerhard Mourani (gmourani at openna.com)
Website: http://www.openna.com
Version: rc1.0



목차
Ⅰ. 들어가며

Ⅱ. Compiling - Optimizing & Installing ISC BIND & DNS
    1. 설치에 필요한 정보
    2. 설치하기전의 짧은 팁
    3. 설치하기

Ⅲ. Security
    1. chroot jail 을 이용한 ISC BIND & DNS 의 운영

Ⅳ. Optimizing ISC BIND & DNS - lwresd의 사용

Ⅴ. 마치며


Ⅰ. 들어가며
먼저 이 글에서는 전반적인 DNS 의 개념 과 설정 등에 대한 내용을 배제하였다. 물론 Gerhard Mourani 의 Securing and Optimizing Linux: DNS and BIND 에는 DNS 의 기초적인 설정까지도 다루고 있으나 DNS 의 개념과 설정방법을 다룬 글들은 많이 있으므로 이 글에서 이러한 부분을 생략하는 것에 대해서 양해를 구하 고자 한다.

DNS에 대한 개념과 이 글에서 다루지 않 은 설정파일(named.conf 등)이나 mapping 파일에 대한 자세한 설정은 원문에서도 볼 수 있다. 원문은 참고문헌에 기록한 http://www.openna.com/products/books/ securing-optimizing-linux/old.htm 중 버전 1.0 의 ISC BIND & DNS 부분이다.

이 문서에서 다루고 있는 것은 ISC BIND 9.1.1 이지만 http://www.isc.org 의 최신 릴리즈 버전은 9.1.2 이 다.(문서의 최신버전은 공개되지 않고 있으며 old version 중 최신의 버 전은 1.3 이지만 큰 차이는 없다.)
이 문서는 Redhat Linux 를 기준으로 작성되었다. 

이 문서에서 중점적으로 다룰 부분들을 요 약하면 다음과 같다.

  1. 보안 및 최적화를 고려한 설치
  2. Security (chroot jail-runnig by non- root user)
  3. Optimizing (lwresd)
  4. TSIG(Transaction SIGnature) 및 BIND9 에서 제공되어지는 utility 에 의한 보안

이번 호에서는 1~3번까지의 내용을 다룰 생각이며, 다음 호에서는 4. ISC BIND & DNS 에서 소개한 TSIG (Transaction SIGnature)에 의한 Primary DNS 와 Secondary DNS 간의 zone file transfer 및 기타 BIND9 에서 제공되어지는 Utility 에 의한 보안 부분을 소개할 것이다.



Ⅱ. Compiling - Optimizing & Installing ISC BIND & DNS
1. 설치에 필요한 정보

설치에 필요한 소스 정보를 요약하면 아래 와 같다.

ISC BIND & DNS Homepage : htp://www.isc.org
ISC BIND & DNS FTP site: 204.152.184.27
Package name : bind-9.1.2.tar.gz

* 선행요구조건
설치 이전에 ISC BIND & DNS 의 성능 향상을 위하여 OpenSSL 라이브러리가 설치되어 있어야 한다. 만약 openSSL 이 설치되 어 있지 않다면 make 과정에서 에러가 난다. Debian GNU/Linux (sid)의 경우는 openssl 과 libssl-dev 패키지를 설치하면 된다.

2. 설치하기전의 짧은 팁

rpm 이나 deb 등의 패키지로 설치하지 않 는 경우(tar ball에 의한) 설치 이후에, 설치된 file의 위치에 대한 list 를 얻는 팁을 간단하게 소개하고자 한다.

1) 설치하기 전 아래와 같은 간단한 명령 을 사용하여 현재 디렉토리 및 파일 정보를 저장한다.
    (단, root 유저로 /root 디렉토리에 서 수행하는 것을 권장한다.)

[root@wjlee /root]# find /* > DNS1

2) 설치 이후 다음과 같은 방법으로 설치 된 file 들을 list화 할 수 있다.

[root@wjlee /root]# find /* > DNS2
[root@wjlee /root]# diff DNS1 DNS2 > ISC-BIND-DNS- Installed

3. 설치하기

·Step1)
다운로드 받은 패키지를 아래와 같은 명령으로 /var/tmp 디렉 토리로 옮기고 압축을 푼다.

[root@wjlee /root]# cp bind- version.tar.gz
[root@wjlee /root]# cd /var/tmp
[root@wjlee tmp]# tar xzpf bind-version.tar.gz

·Step2)
설치할 패키지가 원본임을 확인하기 위하여 PGP 공개키를 구 하여 체크한다.(악의적인 의도로 수정된 패키지를 설치하지 않기 위함이다.)
PGP 공개키는 http://www.isc.org 에서 구할 수 있다.

·Step3)
ISC BIND & DNS 를 운영할 user 를 생성한다. 보안상의 이유로 root로 운영하는 것은 바람직하지 못하다.

# useradd -c “Named” -u 25 - s /bin/false -d
  /var/named named 2>/dev/null || :

위와 같은 명령은 패스워드와 쉘 환경을 가지지 않은 단지 uid 와 gid 만을 가진 named 라는 유저를 생성한 다.

·Step4)
아래와 같은 명령으로 소스 패키지가 압축 해제된 디렉토리 로 이동한다.

# cd bind-9.1.1rc3/

Step4.1)
dighost.c 파일의 수정 : reverse function 에 대한 빠 진 정보의 수정

#vi +224 bin/dig/dighost.c (변경전) if (n ==0) { return (DNS_R_BADDOTTEDQUAD); } for (i = n-1; i >= 0; i--) { sprintf(working, MXNAME/8, “%d.”,adrs[i]); (변경후) if (n ==0) { return (DNS_R_BADDOTTEDQUAD); } reverse[0] = 0; for (i = n-1; i >= 0; i--) { sprintf(working, MXNAME/8, “%d.”,adrs[i]);

Step4.2)
glovals.h 파일의 수정 : named.pid 와 lwesd.pid 파일 의 위치 정보를 변경한다.

#vi +101 bin/named/include/named/globals.h (변경전) “/run/named.pid”); (변경후) “/run/named/named.pid”); (변경전) “/run/lwresd.pid”); (변경후) “/run/named/lwresd.pid”);

·Step5)
설치시 최적화하기 위하여 설정스크립트 구동 및 기타 환경 의 구축.
압축이 해제된 디렉토리 /var/tmp/bind-9.1.2 로 이동하여 쉘 상에서 다음과 같이 명령을 준다.

  [root@wjlee bind- 9.1.2]# CFLAGS=”-O3 -
    funroll-loops -fomit-frame- pointer” \
  ./configure \
  --prefix=/usr \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --mandir=/usr/share/man \
  --with-openssl=/usr/include/openssl \
  --with-libtool \
  --disable-ipv6

·Step6)
위의 과정을 수행했다면 install 을 위한 준비가 끝났다.

아래와 같은 명령으로 install 을 진행한 다.

·Step7)
- 설정파일 만들기 -
기본적으로 make install 에 의하여 생성되는 설정 파일은 없 다. named.conf 나 /var/named 에 들어갈 mapping (zone) 파일들 은 예제소스를 복사하여 적절한 방식으로 설정해주어야 한다.
예제 소스는 /var/tmp/bind-9.1.2/bin/tests/ system 디렉토 리에 있으며 아래와 같은 파일들을 구성해 주면 된다. 설정에 대 한 부분은 앞에서 밝힌 바와 같이 다루지 않음을 다시 한번 양해를 구한 다.

1) 구성해야 되는 설정파일은 다음과 같다.
/etc/named.conf
: /var/tmp/bind-9.1.2/bin/tests/system
디렉토리에서의 예제나 원문 또는 다른 참고서적을 참고 하기 바란다.

/var/named 의 zone file
/etc/logrotate.d/named
/etc/sysconfig/named
/etc/rc.d/init.d/named

/etc/named.conf와 /var/named 의 zone file의 경우는 /var/tmp/bind-9.1.2/bin/tests/system 디렉토리 에서의 예제나 원문 또는 다른 참고서적을 참고 하기 바란다.
단, 위 의 /etc/logrotate.d/named, /etc/sysconfig/named, /etc/rc.d/init.d/named 는 여기서 간단히 다룰 것이다.

2) /etc/logrotate.d/named
먼저 touch /etc/logrotate.d/named 를 하여 파일을 생성 한다. 그리고 아래와 같이 편집기로 열어 작성한다.

/var/log/named.log { missingok postrotate /bin/kill -HUP `cat /var/named.pid 2> /dev/null` 2> /dev/null || true endscript }

3) /etc/sysconfig/named
역시 위와 동일한 방법으로 파일을 생성하고 아래와 같 이 열어서 편집한다. 이는 이후 chroot jail 을 구성할 때 사용되어 질 것이므로 생성 후 아래와 같이 주석(#) 처리와 몇 가지 설정사항을 기록하도록 한다.

# Currently. you can use the following options: # ROOTDIR = “ ” # OPTIONS = “ ”

4) /etc/rc.d/init.d/named
이 파일은 chroot jail 에서 생성할 것이다.



Ⅲ. Security
1. chroot jail 을 이용한 ISC BIND & DNS 의 운영

1) chroot jail 의 개념
실제로 ISC BIND & DNS은 매우 거대하고 복잡한 프로그램 이므로 exploit에 의해 공격당할 수 있는 버그에 대한 부분을 염두 에 두어야 한다. 즉, root 유저로서가 아닌 특수한 user(앞에서 named user를 생성해 보았다)에 의한 운영이 바람직하며 chroot jail 에 의 한 운영도 또한 권할만 하다. chroot jail의 개념은 최상위 디렉 토리인 / (root 디렉토리) 를 속이는 것이다.
간략한 디렉토리상의 개념은 아래와 같다.

/ -+- /bin |- /boot |- /dev |- /etc |- /home |- /chroot - /named -+- /dev | & nbsp; | /etc | | /lib | | /usr | |+- /var . . .

위의 디렉토리 트리를 예로 들어서 설명하 면 /chroot 디렉토리가 / 처럼 작동하여 named user 의 권한으 로 접근했을 때 /chroot 디렉토리를 벗어날 수 없게 된다.

2) chroot jail 을 구성하기

·Step1)
chroot jail 을 구성하기 위한 환경의 조성

[root@wjlee /]# mkdir - p /chroot/named
[root@wjlee /]# mkdir -p /chroot/named/etc
[root@wjlee /]# mkdir -p /chroot/named/var/run/named
[root@wjlee /]# mkdir -p /chroot/named/var/named
[root@wjlee /]# chown -R named.named /chroot/named/var/run/named/
[root@wjlee /]# chown -R named.named /chroot/named/var/named/

·Step2)
설정파일을 구성한 디렉토리로 이동시킨다.

[root@wjlee /]# mv /etc/named.conf /chroot/named/etc/
[root@wjlee /]# cd /var/named; mv * /chroot/named/var/named/
[root@wjlee /]# chown named.named /chroot/named/etc/named.conf
[root@wjlee /]# chown -R named.named /chroot/named/var/named/*

·Step3)
chroot jail에 /etc/localtime 파일을 복사한다. (log 파일 을 생성하기 위해서는 local time에 대한 정보가 필요)

[root@wjlee /]# cp /etc/localtime /chroot/named/etc/

·Step4)
설정파일(named.conf)의 변경을 불가능하게 만든다.
[root@wjlee /]# cd /chroot/named/etc/
[root@wjlee etc]# chattr +inamed.conf

- 참고 +i 옵션은 named.conf 를 삭제나 변경이 불가능하게 만든다. 실제로 chattr -i named.conf 를 수행하 기 전에는 root 유저로도 삭제가 되지 않는다.

·Step5)
chroot jail 을 사용하기 전의 mapping 파일들이 있었던 디렉 토리들을 삭제한다.

[root@wjlee /]# rm -rf /var/named/
[root@wjlee /]# rm -rf /var/run/named/

·Step6)
/etc/sysconfig/named 파일의 수정

  (변경전)
  #Curently, you can use the following options:
  #ROOTDIR=””
  #OPTIONS=””

  (변경후)
  ROOTDIR=”/chroot/named/”

·Step7)
chroot 환경의 테스트

- ISC BIND & DNS 를 아래와 같은 명 령을 사용하여 시작한다.

[root@wjlee /]# /etc/rc.d/init.d/named start

- 에러없이 실행되었다면 ps aux | grep named 를 쉘에 입력하여 결과를 확인한다.

4278 ?  S  0:00 named -u named -t /chroot/named/
4279 ?  S  0:00 named -u named - t /chroot/named/
4280 ?  S  0:00 named -u named - t /chroot/named/
4281 ?  S  0:00 named -u named - t /chroot/named/
4282 ?  S  0:00 named -u named - t /chroot/named/

- 위에서 나온 프로세스 ID를 이용하 여 /proc/PROCESS_ID/root/ 디렉토리를
  열어봄으로서 더욱더 확실 하게 확인할 수 있다.

[root@wjlee /]# ls - al /proc/4278/root/
total 4
drwxrwxr-x  4  root  root  1024  May 18 23:44.
drwxrwxr-x  4  root  root  1024  May 18 23:44..
drwxrwxr-x  4  root  root  1024  May 18 23:44 etc
drwxrwxr-x  4  root  root  1024  May 18 23:44 var


Ⅳ. Optimizing ISC BIND & DNS - lwresd 의 사용
1. lwresd 사용

Bind 의 새로운 버전인 Bind9 의 특징 중 에 하나는 lwresd 라는 daemon 으로서 실행할 수 있다는 점이다. lwresd daemon(원래는 Caching-Only Name Server 이다) 은 lightweight resolver library를 사용하여 DNS protocol 보다 부하가 적게 걸리는 프로토콜을 사용한다.
여기서는 chroot 환경에서 lwresd 를 운영하는 법을 알아볼 것이다.

·Step1)
만일 firewall 을 사용하고 있다면 lwresd 는 port 921 을 통 한 UDP protocal을 사용하므로 firewall 에 이 부분에 대한 규칙 을 추가하는 것이 필요하다. firewall 마다 다르겠지만 이 부분 에 대한 규칙을 아래와 같이 추가하면 된다.(input chain 에서 udp 프 로토콜에 의한 921 포트로의 접근을 ACCEPT 하면 된다.) 만일 kernel 2.4 를 사용하면서 iptable 을 사용한다면 마찬가지로 iptable 을 이용하여 이러한 규칙을 추가하면 된다.

여기서는 Redhat 기준의 firewall 설정파 일에서의 예를 다루겠다.

/etc/rc.d/init.d/firewall 파일을 열어 다음과 같이 추가한다.

# LWRESD server (921) # ------------------- # A lightweight resolver library for Caching-Only Name Server iptables -A INPUT -i $EXTERNAL _INTERFACE -p udp \ -- source-port $UNPRIVPORTS \ -d $IPADDR --destination-port 921 \ -j ACCEPT iptables -A OUTPUT -o \ $EXTERNAL_INTERFACE -p udp \ - s $IPADDR --source-port 921 \ -- destination-port $UNPRIVPORTS \ -j ACCEPT

·Step2)
기본적으로 lwresd deamon은 local loopback (127.0.0.1)에서 의 요구를 기다리고 있으므로 이를 시스템의 External interface 로부터의 요구를 기다리도록 해주어야 한다.

lwserver 207.37.78.2

·Step3)
설정한 resolv.conf 파일을 chroot jail 환경에 맞추기 위하 여 /chroot/etc 로 카피한다.

[root@wjlee /]# cp /etc/resolv.conf/chroot/named/etc/

·Step4)
시스템에 lwresd 를 초기화하기 위한 스크립트(Redhat 의 경 우 /etc/rc.d/init.d/lwresd)를 작성하여 저장한다.

#!/bin/bash # # lwresd This shell script takes care of starting and stopping lwresd \ # (The lightweight resolver library) # chkconfig: - 55 45 # description : lwresd is essentially a Caching- # Only Named Server that answers requests # using the lightweight resolver protocol rather # than the DNS protocol. # probe : true # Source function library . /etc/rc.d/init.d/functions # Source networking configuration . /etc/sysconfig/network # Check that networking is up [ “${NETWORKING}” = “no” ] && exit 0 [ -f /etc/sysconfig/named ] && . /etc/sysconfig/named [ -f /usr/sbin/lwresd ] || exit 0 [ -f “${ROOTDIR}”/etc/resolv.conf ] || exit 0 RETVAL=0 start() { # Start daemons echo -n “Starting lwresd: “ if [ -n “${ROOTDIR}” -a “x${ROOTDIR}” & nbsp; != “x/” ]; then OPTIONS= “${OPTIONS} -t ${ROOTDIR}” fi daemon lwresd -u named ${OPTIONS} RETVAL = $? [$RETVAL -eq 0] && touch /var/lock/subsys/lwresd echo return $RETVAL } stop() { # Stop daemons echo -n “Sutting down lwresd: “ killproc lwresd RETVAL = $? [$RETVAL -eq 0] && rm -f /var/lock/subsys/lwresd echo return $RETVAL } restart() { stop start } # See how we were called. case “$1” in start) & nbsp; start & nbsp; ;; stop) & nbsp; stop & nbsp; ;; restart) & nbsp; resart & nbsp; ;; *) & nbsp; echo “Usage: lwresd {start|stop|resart}” & nbsp; exit 1 esac exit $?

·Step5)
작성한 /etc/rc.d/init.d/lwresd 의 권한 설정 및 System 의 부트시 자동으로 실행되도록 하기.

[root@wjlee /]# chmod 700 /etc/rc.d/init.d/lwresd
[root@wjlee /]# chown 0.0 /etc/rc.d/init.d/lwresd

rc.d 디렉토리에 심볼릭 링크 생성 이후 런레벨 2, 3, 4, 5에서 부트시 실행되도록 하는 과정이다.

[root@wjlee /]# chkconifg --add lwresd
[root@wjlee /]# chkconfig --level 2345 lwresd on

·Step6)
마지막으로 기존의 named 를 부트시 작동하지 않도록 해주어 야 한다.

[root@wjlee /]# chkconfig --del named
[root@wjlee /]# chkconfig --level 2345 named off
[root@wjlee /]# rm -f /etc/rc.d/init.d/named

·Step7)
lwresd daemon 을 실행한다.

[root@wjlee /] # /etc/rc.d/init.d/lwresd start

댓글목록

등록된 댓글이 없습니다.

1,139 (14/23P)

Search

Copyright © Cmd 명령어 18.222.163.134