참고문헌
Securing and Optimizing Linux: DNS and BIND
Author’s: Gerhard Mourani (gmourani@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
/var/tmp/
[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
|
| /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}” !=
“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)
start
;;
stop)
stop
;;
restart)
resart
;;
*)
echo
“Usage: lwresd {start|stop|resart}”
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
마치며
이상으로 ISC BIND & DNS를 이용한 초기
설치와 간단한 보안 및 최적화 방법에 대해서 알아보았다.
다음 호에서는 ISC BIND 에서 제공하고 있는 TSIG 등을 이용한 zone
file transfer 및 제공되어지는 유틸리티에 의한 보안을 다룰 것이다.
▲ top
|