DNSSEC 구성하기 (Debian Linux)

Asher·2024년 12월 10일

구성하기 전에...

구성하기 전에 우리가 사용할 배포판은 Debian Linux 12.5 이다. Linux 설정과 관련된 자료들을 보면 대부분 CentOS나 Ubuntu가 대다수이다. 이러한 점을 생각해보면, "Debian Linux에 대한 자료들은 얼마 없는거 같은데?" 라는 생각에 이 배포판을 사용하게 되었다.
(사실 이건 둘째치고 내가 사용하는 배포판이 Debian 이기 때문에 이거 사용함 ㅋㅋ)

일단 토폴로지 먼저~


간단하게 왼쪽 서버는 PUBROOT, 오른쪽 서버는 PUBSRV 라고 가정하자

설치해야할 패키지

apt install vim bind9 -y

이 패키지는 둘 다 동일하게 설치하면 된다.
여기서 주의할 점!! -> 여기서 하는 실습은 root, 즉 관리자로 로그인했을 때를 가정하고 하는 실습이므로 그냥 사용자로 하고 있다면 앞에 sudo를 꼭 붙여야함!!

네트워크 설정

PUBROOT -> 1.1.1.100/24
PUBSRV -> 1.1.1.1/24

bind9 설정 (DNSSEC 전)

PUBROOT
-> /etc/bind/named.conf

zone "." {
	type master;
    file "root-zone";
};
zone "net" {
	type master;
    file "net-zone";
};

이 zone 설정은 다르게 해도 된다. (예를 들어 net을 com으로 바꾸는 것)
-> /etc/bind/named.conf.options

dnssec-validation no; # 이건 21번 줄에서 변경
allow-query { any; }; # 이건 22번 줄에 추가

-> /var/cache/bind/root-zone

...
@ 	IN	NOA	root.
root.	IN	A	1.1.1.100
net.	IN	A	1.1.1.100

-> /var/cache/bind/net-zone

...
@	IN	NOA	net.
net.	IN	A	1.1.1.100
public.net.	IN	A	1.1.1.1

PUBSRV
-> /etc/bind/named.conf

zone "public.net" {
	type master;
    file "pub-zone";
};
zone "." {
	type hint;
    file "/usr/share/dns/root.hints";
};

-> /etc/bind/named.conf.options

dnssec-validation no;
allow-query { any; };

-> /usr/share/dns/root.hints

A.ROOT-SERVERS.NET	IN	A	1.1.1.100	# 수정해서 사용

-> /var/cache/bind/pub-zone

...
@	IN	NOA	public.net.
public.net.	IN	A	1.1.1.1

모든 설정 후에는 패키지 재시작을 해줘야 저장된 내용들이 적용된다.

systemctl restart bind9

DNSSEC 설정

PUBSRV
DNSSEC을 사용하려면 우선 KSK, ZSK 키 파일을 생성해야한다. 그래서 이 키 들을 저장할 디렉토리를 하나 만들어야한다.

mkdir /var/cache/bind/keys
cd /var/cache/bind/keys

dnssec-keygen -a ECDSAP256SHA256 -f KSK public.net
dnssec-keygen -a ECDSAP256SHA256 public.net

DNSSEC을 구성하기 전에 했던 bind9 설정을 수정해야 한다.
-> /etc/bind/named.conf.options

dnssec-validation yes;

-> /etc/bind/named.conf

zone "public.net" {
	type master;
    file "pub-zone";
    inline-signing yes;
    dnssec-policy default;
    key-directory "/var/cache/bind/keys";
};

DNSSEC 키를 다른 서버의 폴더에 전송하기 위해서는 권한이 필요하다.

chown bind:bind -R /var/cache/bind
systemctl restart bind9

SSH

PUBROOT
DNSSEC 키를 받기 위해 scp 명령어를 사용하는 데, 이를 위해 root로 ssh 접속이 가능하도록 한다.

apt install ssh -y

-> /etc/ssh/sshd_config

PermitRootLogin yes;	# 33번 줄 수정
systemctl restart ssh

다시 DNSSEC으로 돌아가서

dig @127.0.0.1 dnskey public.net | dnssec-dsfromkey -f - public.net > /root/ds-pub
scp /root/ds-pub root@1.1.1.100:/root

PUBROOT
key를 복사해서 보내는 과정을 제외한 나머지 PUBSRV의 과정을 똑같이 따라한다.

mkdir /var/cache/bind/keys
cd /var/cache/bind/keys

dnssec-keygen -a ECDSAP256SHA256 -f KSK .
dnssec-keygen -a ECDSAP256SHA256 .
dnssec-keygen -a ECDSAP256SHA256 -f KSK net
dnssec-keygen -a ECDSAP256SHA256 net

-> /etc/bind/named.conf.options

dnssec-validation yes;
recursion no;

-> /etc/bind/named.conf

zone "." {
	type master;
    file "root-zone";
    inline-signing yes;
    dnssec-policy default;
    key-directory "/var/cache/bind/keys";
};
zone "net" {
	type master;
    file "net-zone";
    inline-signing yes;
    dnssec-policy default;
    key-directory "/var/cache/bind/keys";
};
chown bind:bind -R /var/cache/bind
systemctl restart bind9

root-zone과 net-zone 에 DS 레코드를 추가한다.

dig @127.0.0.1 dnskey net | dnssec-dsfromkey -f - net >> /var/cache/bind/root-zone
cat /root/ds-pub >> /var/cache/bind/net-zone
systemctl restart bind9

PUBSRV
이제 bind9 options file에 DNSKEY를 추가해준다.

dig @1.1.1.100 . dnskey +multi +norec >> /etc/bind/named.conf.options

이렇게 추가하면 DNSKEY 이외에 나머지 것들이 나오기 때문에, 올바르게 수정하고 bind9 재시작한다.
-> /etc/bind/named.conf.options
(수정하면 이렇게 나옴)

systemctl restart bind9

결과 확인

dig +dnssec +multiline public.net | more

내용 중에 flags에는 ad, 아래 부분에 RRSIG 가 있으면 정상적으로 DNSSEC이 된 것이다.

부가설명

위에 나와있진 않지만 zone 파일의 ttl 값을 86400으로 수정해야함
너무 크면 dnssec에서 키의 유효성 검증에 문제가 생겨 dnskey를 생성할 수 없음

profile
네트워크 + 일상 공유 블로그

0개의 댓글