CHRooted DNS/bind-9.2.0 for FreeBSD 4.5
H.S. Mok
hsmok@sv.co.kr
2002/1/21
수정: 2002/4/30
버전
FreeBSD 4.5
bind 9.2.0
1. Domain Name System(DNS) 관련 문서
RFC 문서(http://www.ietf.org/rfc.html)
- RFC-1033: DOMAIN ADMINISTRATORS OPERATIONS GUIDE
- RFC-1034: DOMAIN NAMES - CONCEPTS AND FACILITIES
- RFC-1035: Domain Names - Implementation and Specification
2. CHRooted DNS/BIND?
CHRooted DNS/BIND는 bind를 '/somewhere/bind'등의 디렉토리를 chrooted 되게 설치해서 bind로 하여금 그 디렉토리를 루트 디렉토리로 인식하게 해서 chroot 디렉토리 외의 디렉토리는 접근하지 못하게 한다. 만약 bind가 악의의 사용자에 의해 공격 당하더라도 bind 디렉토리 밖으로 접근하지 못하게 한다. 또한 bind를 root가 아닌 nobody 또는 bind 권한으로 실행 시켜서 보다 안전한 DNS 서비스가 가능해진다.
3. 설치 준비
FreeBSD 4.4 시스템은 bind 8.2.4 버전이 /usr 에 설치되어 있다. bind 8.2.2p7이전 버전 사용자라면 보안버그가 발견 되었기 때문에 반드시 최신버전으로 업그레이드 해야된다. 현재 최신 버전은 bind 8.3.0, bind 9.2.0 이다. 포트에서는 bind 8.2.5, bind 9.1.3이 지원된다. FreeBSD 포트 버전이 최신 버전보다 낮아서 소스를 다운받아 설치 하고자 한다. http 나 ftp로 bind-9.2.0.tar.gz 파일을 컴파일할 디렉토리로 다운로드 받느다.
4. 설치
configure
- --prefix=/usr/local
bind가 설치 될 디렉토리를 지정할 때 사용하고 기본값은 /usr/local 이다.
- --sysconfdir=/usr/local/bind9/etc
설정파일(named.conf)이 설치될 디렉토리를 변경한다. 기본값은 이전 버전과 호환을 문제로 /etc 이다. prefix를 지정했다면 $prefix/etc가 된다.
- --localstatedir=/usr/local/bind9/var
run/named.pid의 상위 디렉토리이고 기본값은 /var 이다. prefix를 지정했다면 $prefix/var가 된다.
- --enable-openssl=/usr
bind9에서 제공하는 DNSSEC을 지원하게 한다. DNSSEC은 OpenSSL 0.9.5a 이상의 버전이 필요하다. FreeBSD 4.4 시스템에는 "/usr"에 OpenSSL 0.9.6 이 설치되어 있다. OpenSSL의 버전 확인은 다음과 같이한다.
# /usr/bin/openssl version OpenSSL 0.9.6 24 Sep 2000
- --enable-threads
멀티스레드를 지원하기 위한 옵션이고, 멀티 프로세서 시스템에서 성능의 향상이 있다.
- --with-kame=/somewhere
IPv6 지원에 대한 옵션이다. 시스템에 IPv6가 기본적으로 지원 되면 설치시 자동으로 인식한다.
- --help
좀더 자세한 configure의 도움말을 보여준다.
FreeBSD 4.4 시스템은 기본적으로 bind 8.2.4 버전이 /usr에 설치 되어 있다. 새로운 버전을 /usr 에 설치해서 이전 버전을 덮어 쓴다. prefix를 지정하게 되면 sysconfdir과 localstatedir이 $prefix/etc, $prefix/var로 되므로 시스템에 맞게 추가적으로 지정해주는 것이 좋다. 컴파일과 설치가 끝나면 새로운 버전으로 dns 서버를 운영할 수 있다. chroot 서비스를 원하지 않는 다면 여기까지 설치하면 된다.
# fetch ftp://ftp.isc.org/isc/bind9/9.2.0/bind-9.2.0.tar.gz
# tar xvzf bind-9.2.0.tar.gz
# cd bind-9.2.0
# ./configure --prefix=/usr --sysconfdir=/etc/namedb --localstatedir=/var
# make
# make install
# mv /usr/sbin/nslookup /usr/sbin/nslookup.old
# ln -s /usr/bin/nslookup /usr/sbin/nslookup
5. chroot 설정
chroot 디레토리와 서브디렉토리를 만든다. dev 서브디렉토리에는 null 디바이스와 random 디바이스를 만든다. etc 서브디렉토리는 bind 설정파일(named.conf)과 localtime을 위한 것이다. 로커타임은 sysinstll 메뉴나 tzsetup 명령으로 타임존을 설정하면 /etc/localtime 이 생기므로 복사해서 쓰면 되고, /usr/share/zoneinfo/Asia/Seoul 타임존 파일을 복사해서 쓴다. sbin 서브디렉토리에는 /usr/sbin/named 바이너리를 복사하고 strip 으로 심볼릭을 삭제해준다.
# mkdir /usr/local/bind
# cd /usr/local/bind
# mkdir -p dev etc/namedb sbin var/run var/log
#
# mknod dev/null c 2 2
# mknod dev/random c 2 3
# chmod a+w dev
#
# cp /etc/localtime etc/localtime
# cp /usr/sbin/named sbin/named
# strip sbin/named
#
# chown -R bind.bind etc/namedb var/run var/log
네임서버의 로그를 설정하기 위해서는 로그파일을 만들어 준다.
# touch var/log/named.log
# chown bind.bind var/log/named.log
6. Name Server 설정
Caching-only Nameserver 설정
cache only server는 Caching Name Server 또는 Recursive Server 라고 하며 클라이언트에 대한 recursive rookup만을 수행한다. 즉 인터넷 도메인 네임 영역을 등록하고 관리하지 않는다. 예를 들어 윈도우 사용자가 네트워크 환경에서 dns server ip를 caching server ip 주소로 설정한 경우 사용자 브라우저에서 www.sv.co.kr 이라는 도메인을 요청하면 도메인네임에 대한 IP 주소 전달해 주어 사용자가 원하는 웹 페이지를 찾아 갈 수 있게 해주는 역할을 한다.
필요한 파일은 etc/namedb/named.conf, etc/namedb/localhost.rev, etc/namedb/named.root 이고 설정 예는 다음과 같다.
- etc/namedb/named.conf
// etc/named.conf -----------------------------------------------------------
//
acl "my_net" { localhost; 192.168.1.0/24; 192.168.2.5/28; };
options {
directory "/etc/namedb"; // 도메인 영역파일 위치
pid-file "/var/run/named.pid"; // named pid 파일 위치
allow-query { "my_net"; }; // acl에서 정의한 허용 리스트
};
zone "." { type hint; file "named.root"; };
zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; notify no; };
// --------------------------------------------------------------------------
- etc/namedb/localhost.rev
- TTL: 타 네임서버가 이 zone 데이터를 가지고 갔을 경우 가져간 데이터의 유효기간을 정한다.(초)
- Serial: zone 파일 수정시 이번호를 날짜 기준 증가 시켜준다. slave 서버에서는 serial의 변경 여부를 이 번호를 참조하고 zone 백업을 업데이트 한다.
- Refresh: slave server가 primary의 수정 여부를 검사하는 주기(초)
- Retry: slave server가 masert server와 연결이 않될 경우 재시도 주기(초)
- Expire: master server와 설정 기간동안 연결 않될 때 zone 백업 카피의 무효화 한다.
- Minimum: 타 네임서버가 이 zone 데이터를 가지고 갔을 경우 가져간 데이터의 유효기간을 정한다. TTL값이 명시 되지 않았을 때 이 값을 가진다. 설정을 0으로 했을 때 캐싱 하지 않도록 한다.
// etc/namedb/localhost.rev -o------------------------------------------------------
//
$TTL 3600
@ IN SOA ns.sv.co.kr. root.ns.sv.co.kr. (
2002012201 ; Serial
3600 ; Refresh ( 1 hour)
900 ; Retry ( 15 min )
3600000 ; Expire (1000 hours)
3600 ) ; Minimum ( 1 hour)
IN NS ns.sv.co.kr.
1 IN PTR localhost.sv.co.kr.
// --------------------------------------------------------------------------
- etc/namedb/named.root
이 파일은 루트 네임서버의 정보를 가지고 있는 파일이다. 직접 만드는 것이 아니라 /etc/namedb/named.root 에 존재하며 이 파일을 필요한 곳으로 복사해서 쓴다. 직접 internic(ftp://rs.internic.net/domain/named.root) 에서 다운로드해도 된다.
# cp /etc/namedb/named.root /usr/local/bind/namedb/.
또는
# cd /usr/local/bind/etc/namedb
# fetch ftp://rs.internic.net/domain/named.root
Authoritative Nameserver 설정
도메인 영역에 대한 서비스를 수행하는 네임서버를 말한다.
Authoritative Server에 필요한 파일
- etc/namedb/named.conf
// etc/namedb/named.conf -----------------------------------------------------------
//
options {
directory "/etc/namedb"; // 도메인 영역파일 위치
pid-file "/var/run/named.pid"; // named pid 파일 위치
allow-query { any; }; // 쿼리 허용
allow-transfer { 192.168.1.2 }; // secondary name server
//recursion no; // recursive 서비스를 사용 않할 때
//auth-nxdomain yes; // 네트웍에 오래된 DNS가 있을 경우
};
logging {
channel bind_log { file "/var/log/named.log"; severity info; };
category xfer-out { bind_log; };
category default { bind_log; }; // 기본 로그를 bind_log로 출력
//category default { default_syslog; }; // 기본 로그를 시스템의 syslog로 출력
};
zone "." { type hint; file "named.root"; };
zone "0.0.127.in-addr.arpa" { type master; file "localhost.rev"; notify no; };
zone "1.168.192.in-addr.arpa" { type master; file "1.168.192.rev"; notify no; };
zone "systemadmin.co.kr" { // master 영역 설정 예
type master;
file "systemadmin.co.kr.db";
};
zone "sv.co.kr" { // slave 영역 설정 예
type slave;
file "sv.co.kr.bk";
masters { 192.168.4.12; }; // master server IP
};
// --------------------------------------------------------------------------
- etc/namedb/localhost.rev
caching server의 localhost.rev와 같음.
- etc/namedb/1.1678.192.rev
리버드 도메인영역은 전산원에 리버스도메인이 등록되어야 정상적으로 작동한다. 전산원에 등록되지 않더라도 ISP업체에 해당 아이피 주소의 리버스 영역을 매핑해 달라고 하면 된다.
$TTL 3600
@ IN SOA ns.systemadmin.co.kr. root.ns.systemadmin.co.kr. (
2002012201 ; Serial
3600 ; Refresh ( 1 hour)
900 ; Retry ( 15 min )
3600000 ; Expire (1000 hours)
3600 ) ; Minimum ( 1 hour)
IN NS ns.systemadmin.co.kr.
1 IN PTR ns.systemadmin.co.kr.
- etc/namedb/named.root
caching server의 named.root와 같음.
- etc/namedb/systemadmin.co.kr.db
$TTL 86400
@ IN SOA ns.systemadmin.co.kr. hsmok.systemadmin.co.kr. (
2002012201 ; Serial
3600 ; Refresh ( 1 hour )
900 ; Retry ( 15 min )
3600000 ; Expire (1000 hours)
3600 ) ; Minimum ( 1 hour )
IN NS ns.systemadmin.co.kr.
IN NS ns2.systemadmin.co.kr.
IN A 192.168.1.1
IN MX 10 mail
ns IN CNAME @
www IN CNAME @
ftp IN CNAME @
mail IN A 192.168.1.1
ns2 IN A 192.168.1.2
7. named 실행
bind 버전확인
# /usr/local/bind/sbin/named -v
BIND 9.2.0
#
chrooted 실행
/usr/local/bind/sbin/named -t /usr/local/bind -c /etc/namedb/named.conf -u bind
named 데몬 확인
ps 명령으로 named 데몬을 확인하면 bind 권한으로 실행되어 있을 것이다.
#
# ps aux | grep named
bind 84931 0.0 6.7 2372 1996 ?? Is 3:32PM \
0:00.24 /usr/local/bind/sbin/named -t /usr/local/bind \
-c /etc/namedb/named.conf -u bind
#
# cat var/run/named.pid
84931
로그확인
로그 메시지를 확인해 보면 다음과 같이 작동할 것이다. rndc와 127.0.0.1 커맨드 채널을 추가 할 수 없다는 에러가 나지만 이것은 rndc를 설정하면 된다. named.conf에서 rndc 키와 control을 설정하게 된다. rndc를 사용하지 않는다면 굳이 설정할 필요는 없다.
# cat /usr/local/bind/var/log/named.log
zone 0.0.127.in-addr.arpa/IN: loaded serial 2002012201
zone 1.168.192.in-addr.arpa/IN: loaded serial 2002012201
zone systemadmin.co.kr/IN: loaded serial 2002043001
running
zone systemadmin.co.kr/IN: sending notifies (serial 2002043001)
loading configuration from '/etc/namedb/named.conf'
no IPv6 interfaces found
none:0: open: /etc/namedb/rndc.key: file not found
couldn't add command channel 127.0.0.1#953: file not found
#
#
# cat /var/log/messages
....................
Apr 30 12:18:25 ns1 named[8114]: none:0: open: /etc/namedb/rndc.key: file not found
Apr 30 12:18:25 ns1 named[8114]: couldn't add command channel 127.0.0.1#953: file not found
named query 확인
dig 명령으로 설정된 도메인을 확인해 본다.
ns3# dig @localhost mail.systemadmin.co.kr
; <<>> DiG 9.2.0 <<>> @localhost mail.systemadmin.co.kr
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7082
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;mail.systemadmin.co.kr. IN A
;; ANSWER SECTION:
mail.systemadmin.co.kr. 86400 IN A 211.192.187.216
;; AUTHORITY SECTION:
systemadmin.co.kr. 86400 IN NS ns.systemadmin.co.kr.
systemadmin.co.kr. 86400 IN NS ns2.systemadmin.co.kr.
;; Query time: 12 msec
;; SERVER: 127.0.0.1#53(localhost)
;; WHEN: Tue Jan 22 16:21:14 2002
;; MSG SIZE rcvd: 82
시스템 시작시 자동 실행 설정
/etc/rc.conf 파일을 에디터로 열어 다음 내용을 추가한다.
named_enable="YES"
named_program="/usr/local/bind/sbin/named"
named_flags="-t /usr/local/bind -c /etc/named.conf -u nobody"
** rndc 설정**
rndc를 chrooted에서 설정하려면 문제점이 생긴다. rndc를 실행하게 되면 rndc.conf를 chrooted 가 아닌 /etc/named/에서 rndc.conf를 참조하게 되는데 이것은 별도로 심볼릭 링크를 걸거나 하는 방법으로 해결해야 한다.
rndc key 만들기
키는 공개키(*.key)와 개인키(*.private)가 만들어 진다. 공개키는 공개키 파일에서 "bind. IN KEY 0 2 157 " 뒷부분을 named.conf 파일에 넣어준다. 개인키는 개인키 파일에서 "Key: " 뒷 부분을 rndc.conf 파일에 넣어주게 된다.
# dnssec-keygen -a hmac-md5 -r /dev/urandom -b 512 -n user bind
Kbind.+157+29280
#
# ls -al
-rw------- 1 root wheel 111 Apr 30 12:31 Kbind.+157+29280.key
-rw------- 1 root wheel 145 Apr 30 12:31 Kbind.+157+29280.private
etc/namedb/named.conf 파일에 다음 부분을 추가한다.
key "rndc_key" {
algorithm hmac-md5;
secret "xPdYeSnIFS6+.......중간생략..........V0fEHGF3ll/uXJsA==";
};
controls {
//inet ::1 allow { ::1; } keys { "rndc_key"; };
inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc_key"; };
};
etc/namedb/rndc.conf 파일을 만든다.
options {
default-server localhost;
default-key "rndc_key";
};
server localhost { key "rndc_key"; };
key "rndc_key" {
algorithm hmac-md5;
secret "xPdYeSn.........중간생략............YZJV0fEHGF3ll/uXJsA==";
};
bind를 새로 시작한다.
rndc가 잘 설정되었다면 별 다른 에러 없이 작동한다. rndc 사용법에 대한 내용은 다음기회에...
# ln -s /usr/local/bind/etc/namedb/rndc.conf /etc/namedb/rndc.conf
# /usr/local/bind/sbin/named -t /usr/local/bind -c /etc/namedb/named.conf -u bind
#
# rndc reload
loading configuration from '/etc/namedb/named.conf'
|