DNSSEC Setup HOWTO (DNS 보안 설정 매뉴얼)

DNSSEC 설치 설명서

  • 작성자: 김재연 jaeyounkim_gmail_com.png
  • 변경일자
    • 2012년 1월 3일 (Ubuntu 환경에 맞추어 내용 수정)
    • 2010년 6월 19일 (CentOS 환경 기준으로 작성)

BIND 소스 컴파일 설치

OpenSSL 설치

wget http://www.openssl.org/source/openssl-1.0.0f.tar.gz
tar xvzf openssl-1.0.0f.tar.gz
cd openssl-1.0.0a
./config
make
make test
make install

apt-get install openssl libssl-dev

named 이용자 계정 및 그룹 생성

groupadd -g 53 bind
useradd -c "BIND Admin" -d /dev/null -g bind -u 53 -s /usr/sbin/nologin bind

BIND 설치 디렉토리 설정

mkdir -m 750 /BIND
mkdir -m 750 /BIND/data
mkdir -m 750 /BIND/etc
mkdir -m 750 /BIND/src
mkdir -m 750 /BIND/var
mkdir -m 750 /BIND/var/key
chown bind:bind /BIND

소스코드 다운로드 및 컴파일

cd /BIND/src
wget http://ftp.isc.org/isc/bind9/9.8.1-P1/bind-9.8.1-P1.tar.gz
tar xvzf bind-9.8.1-P1.tar.gz 
cd /BIND/src/bind-9.8.1-P1 
./configure --enable-threads --localstatedir=/BIND/var --sysconfdir=/BIND/etc 
make
make test
make install
chown bind:bind -R /BIND

rndc 설정 파일 생성

rndc-confgen -a

환경 설정 파일 생성

/BIND/etc/ named.conf 파일 등 저장
/BIND/var/ 존 파일 등 저장
/BIND/var/key 키 파일 저장

자동 구동 스크립트

/etc/init.d/named 라는 이름으로 아래 내용 저장

#!/bin/sh

# /etc/init.d/named
# description: BIND
# Start/Stop/Status/Reload/Restart BIND
# processname: named

case $1 in
    'start' )
        echo "Starting " $0
        /usr/local/sbin/named -4 -u bind
        ;;
    'stop' )
        echo "Stopping " $0
        /usr/local/sbin/rndc stop
        ;;
    'status' )
        /usr/local/sbin/rndc status
        ;;
    'reload' )
        /usr/local/sbin/rndc reload
        ;;
    'restart' )
        echo "Restarting " $0
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|status|reload|restart}"
        exit 1
        ;;
esac
exit 0
chmod 744 /etc/init.d/named
chown root:root /etc/init.d/named
update-rc.d named defaults

BIND 실행/중지/재시작

  • 실행
    • /usr/local/bind/sbin/named -4 -u bind (-4 옵션 사용 시 IPv4만 지원한다. IPv6를 전혀 사용하지 않는 경우 지정한다.)
    • service named start
  • 중지
    • service named stop
  • 재시작
    • service named restart

DNSSEC 설정 및 적용

각각의 도메인 존에 대해 Zone Signing Key (ZSK)와 Key Signing Key (KSK)를 생성한다.

  • Zone Signing Key (ZSK)
    • 존의 모든 RR 를 서명한다.
  • Key Signing Key (KSK)
    • ZSK를 서명하는데 사용한다.
    • 존의 Secure Entry Point (SEP) 키로 사용된다.

Key-Signing Key (KSK) 생성

dnssec-keygen -r /dev/urandom -a NSEC3RSASHA1 -b 2048 -n ZONE -f KSK [zonename]

예제)
dnssec-keygen -r /dev/urandom -a NSEC3RSASHA1 -b 1024 -n ZONE -f KSK dnslab.us

  • 참고
    • 보안 강화를 위해서는 /dev/urandom 대신에 /dev/random 사용이 권장된다. /dev/random은 난수 발생에 필요한 entropy가 충분히 모아진 후 난수를 생성한다.
    • BIND v9.6 이상부터 NSEC3RSASHA1 지원

아래와 같은 공개키와 사설키 2개 파일이 생성된다.

K<zonename>+<algorithm>+<id>.key
K<zonename>+<algorithm>+<id>.private

서명 알고리즘(Algorithm): 서명에 사용된 공개키 암호화 방식 알고리즘 코드 (5: RSASHA1, 7: NSEC3RSASHA1)

예제)
Kdnslab.us.+007+27508.key
Kdnslab.us.+007+27508.private

Zone-Signing Key (ZSK) 생성

dnsseckeygen -r /dev/urandom -a NSEC3RSASHA1 -b 1024 -n ZONE [zonename]

예제)
dnssec-keygen -r /dev/urandom -a NSEC3RSASHA1 -b 1024 -n ZONE dnslab.us

아래와 같은 2개 파일이 생성된다.
K<zonename>+<alg>+<id>.key
K<zonename>+<alg>+<id>.private

예제)
Kdnslab.us.+007+06612.key
Kdnslab.us.+007+06612.private

타이밍 옵션) 필요에 따라 설정한다.

-P date/[+-]offset/none: set key publication date (default: now)
-A date/[+-]offset/none: set key activation date (default: now)
-R date/[+-]offset/none: set key revocation date
-I date/[+-]offset/none: set key inactivation date
-D date/[+-]offset/none: set key deletion date
-G: generate key only; do not set -P or -A
-C: generate a backward-compatible key, omitting all dates
-S <key>: generate a successor to an existing key
-i <interval>: prepublication interval for successor key (default: 30 days)

서명 파일을 Key 디렉토리로 이동

mv /BIND/var/*.key /BIND/var/key
mv /BIND/var/*.private /BIND/var/key

존 파일에 KSK와 ZSK 공개 키 추가

존 파일 맨 끝에 $include 구문을 추가하거나 또는 cat 명령어를 실행하여 존 파일 맨 끝에 추가

  • $INCLUDE 사용
; zone-signing key    
$INCLUDE /BIND/var/key/Kcslab.net.+007+33017.key
; key-signing key
$INCLUDE /BIND/var/key/Kcslab.net.+007+48570.key
  • cat 명령 사용
cat K<zonename>+*.key >> zonefile

존 파일 서명

dnssec-signzone -l [lookasidezone] -r /dev/urandom [-o zonename] [-N INCREMENT] [-k KSKfile] zonefile [ZSKfile]

예제)
서명 명령어 실행 결과 RRSIG, NSEC & DNSKEY RR이 추가된 서명된 존 파일과 보안 위임 설정용 DS RR 파일(dsset-dnslab.us.)이 생성된다.

-S 옵션을 줄 경우 지정한 Key 디렉토리 (/BIND/var/key)에서 자동으로 키 파일들을 자동으로 읽어와서 서명을 하게 된다.

# dnssec-signzone -r /dev/urandom -K /BIND/var/key -o dnslab.us -S dnslab.us.zone.db

Verifying the zone using the following algorithms: RSASHA1.
Zone signing complete:
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
                   ZSKs: 1 active, 0 stand-by, 0 revoked
dnslab.us.zone.db.signed

named.conf 설정 변경

zonefile 파일 이름을 zonefile.signed 으로 변경한다.

; 변경 전
zone "dnslab.us" IN { 
file "dnslab.us.zone.db";
};
; 변경 후
zone "dnslab.us" IN { 
file "dnslab.us.zone.db.signed";
};

DNSEC 설정 적용

service named restart

dig 프로그램으로 DNSSEC 적용 내용 확인

dig @localhost dnslab.us soa +dnssec +multiline

레지스트라 설정 (Godaddy.com 기준)

레지스트라에 도메인 존 DNSKEY 레코드를 업로드 해야 한다. (KSK 공개키)

/BIND/var/dsset-cslab.net. 파일을 열어 첫번째 라인을 복사한다.

  • 예제
dnslab.us. IN DS 48570 7 1 6C4A7E687E2B4BD8C149475D9EBE3E0B111D6F73
  • Godaddy에 업로드 전에 TTL 값(3600)을 추가해 준다.
dnslab.us. 3600 IN DS 48570 7 1 6C4A7E687E2B4BD8C149475D9EBE3E0B111D6F73
  • 수정한 텍스트를 Godaddy 관리툴에 있는 Add DS Records 메뉴에서 추가한다.
godaddy_add_ds_records.jpg

DNSSEC 서명 검증 작동 여부 확인

DNSSEC 작동 여부 확인을 위해서는 DNSSEC 기능이 활성화된 Recursive DNS로 질의를 해야만 한다.

Firrefox (불여우) 웹브라우저에서 DNSSEC 적용 도메인 작동 여부 확인

  • 작동 확인
firefox_bar_en.jpg
초록색 바탕 열쇠 아이콘이 주소창에 표시되면 DNSSEC 서명 검증이 성공적으로 완료된 것을 의미한다.

(참고) DNSSEC 지원 도메인 목록
icann.org
afilias.info
dnsviz.net
cslab.net

  • DNSSEC Resolver 설정
firefox_pref_en.jpg

Addon 설정에서 DNSSEC을 지원하는 Resolver 를 지정해 주어야 한다.

(참고) DNSSEC Validating Resolver 목록
149.20.64.20 (OARC)
149.20.64.21 (OARC)
1.18.118.118 (한국인터넷진흥원)

DNS visualization tool로 DNSSEC 동작 여부 확인

http://dnsviz.net/

예제) http://dnsviz.net/d/icann.org/dnssec/

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License