본문 바로가기
Linux/DNS server

DNSSEC

by aegypius 2020. 11. 30.
728x90
반응형

네임서버가 공격을 당하면....

  인터넷 상에서 내가 직접 운영하고 있는 네임서버(의 특정 도메인)에 공격이 들어올 확률은 거의 없지만, 네임서버를 open dns로 운영하고 있다면 DNS Amplification DDoS Attack(DNS 증폭공격)이 의심스러운 징후는 많이 발견될 것이다. 나의 도메인(내가 관리하는 도메인)이 아닌 외부도메인에 대한 dns 쿼리는 무시하도록 설정하는 것이 가장 깔끔하다고 생각한다. 이는 이전에 정리했던 글 (2020/02/12 - [Linux/DNS server] - 네임서버의 기본 보안 설정 - bind) 에서도 언급한적 있다.

 DNSSEC(Domain Name System Security Extension)는 특정 도메인에 대해서 위-변조된 가짜 정보를 저장하도록 cache dns 서버(캐시 네임서버)를 공격(dns cache poisoning attack)하는 것에 대비해서 만들어졌다. 자세한 내용은 아래의 링크를 참조하자.
xn--3e0bx5euxnjje69i70af08bea817g.xn--3e0b707e/jsp/resources/dns/dnssecInfo/dnssecInfo.jsp

  개인이 운영하는 웹사이트가 파밍(pharming)공격의 대상으로 선정되기도 쉽지는 않겠지만, 최근에 일부 호스팅 업체의 네임서버가 이러한 공격의 대상이 된 것은 사실이다.

개인적으로 혹은 소규모 서버를 자체적으로 운영하는 회사라면...

  DNSSEC가 필수는 아니라는 생각이다. 물론 안하는 것 보다는 적용하는 편이 그나마 안전하다는 것에는  동의한다. DNSSEC는 기존의 DNS에 보안기능을 추가한 것이며 설정 자체가 난해한 작업은 아니다. 구축방법이나 작동원리 또한 한국인터넷진흥원(KISA) 사이트에 잘 정리되어 있다.

xn--3e0bx5euxnjje69i70af08bea817g.xn--3e0b707e/jsp/resources/dns/dnssecInfo/dnssecPrinciple.jsp

xn--3e0bx5euxnjje69i70af08bea817g.xn--3e0b707e/jsp/resources/dns/dnssecInfo/dnssecBind.jsp

한번 설정해보자.

  DNSSEC는 기존의 DNS에 공개키 암호화 방식을 추가하여 보안을 강화한 것이므로, 기존에 운영중인 네임서버 설정이 제대로 되어 있다는 가정하에 몇가지 추가작업을 해주면 된다.

  (1) 별도의 디렉토리를 만들고 존 키(Key)를 생성하자.

  도메인 존의 키는 zone-signing key(ZSK)와 key-signing key(KSK) 두 개를 생성해야 한다. 생성된 키는 /var/named/key에 저장할 예정이므로 미리 디렉토리를 만들어 놓고, 해당 디렉토리로 이동한 후에 아래와 같이 키를 생성하자.

  도메인 존의  ZSK의 생성

# dnssec-keygen -a NSEC3RSASHA1 -r /dev/urandom -b 1024 -n ZONE mydomain.kr.

  도메인 존의 KSK의 생성

# dnssec-keygen -a NSEC3RSASHA1 -r /dev/urandom -b 2048 -n ZONE -f KSK mydomain.kr.

  위의 예에서 mydomain.kr은 실제 DNS에 설정되어 있는 도메인을 사용하면 된다. 사용한 옵션에 대한 대략적인 설명은 아래와 같다.

  -a : 암호화 알고리즘 지정 (기본값 : RSASHA1)
  -r : random-device 지정 (/dev/urandom, /dev/random)
  -b : key size (단위 : bit)
  -n : name type (기본값 : ZONE)
  -f : key-flag [KSK / REVOKE]

[root@localhost key]# ll
total 16
-rw-r--r-- 1 root named  611 Nov 29 06:50 Kmydomain.kr.+007+12378.key
-rw------- 1 root named 1779 Nov 29 06:50 Kmydomain.kr.+007+12378.private
-rw-r--r-- 1 root named  437 Nov 29 06:49 Kmydomain.kr.+007+38894.key
-rw------- 1 root named 1015 Nov 29 06:49 Kmydomain.kr.+007+38894.private
[root@localhost key]#


(2) 도메인의 존 파일에 공개키 파일(*.KEY)를 포함시키자.

  mydomain.kr의 존 파일(mydomain.kr.zone)에 ZSK와 KSK의 공개키 파일을 포함시키자. 가장 마지막에 다음의 두 줄을 추가하면 된다.

$INCLUDE /var/named/key/Kmydomain.kr.+007+12378.key
$INCLUDE /var/named/key/Kmydomain.kr.+007+38894.key


(3) 존 서명

  도메인(mydomain.kr)의 존 파일에 DNSSEC 서명(sign)을 처리하는 절차이며 아래와 같다.

# dnssec-signzone -S -K /var/named/key -3 96e920 -o mydomain.kr. mydomain.kr.zone

  -3 뒤의 6자리(96e920)는 임의의 숫자(16진수)이므로 0~9와 A~F사이의 문자(대소문자 구분없음)를 넣어주면 된다. 위의 명령이 실행된 후에 서명된 존 파일인 mydomain.kr.zone.signed라는 이름의 파일이 생성된다. 네임서버 설정파일(named.conf)의 zone 영역에서 기존파일(mydomain.kr.zone) 대신 새로 생성된 파일(mydomain.kr.zone.signed)를 지정해야 한다. 또한 설정파일(named.conf)의 option영역에서 dnssec-enable yes; 항목이 추가되어 있는지 다시한번 확인하자. 아래와 같다.

### /etc/named.conf의 일부
option {
        ~~~~
         dnssec-enable yes;
         dnssec-validation yes;
        ~~~~
};
### named.rfc1912.zones 파일의 일부
(named.rfc1912.zones이 아닌 관리자가 설정한 다른 이름의 파일일 수도 있다.
 네임서버에서 특정 도메인을 설정하는 부분)
 
 ~~~(중략)
 
 zone "mydomain.kr" IN {
         type master;
//       file "mydomain.kr.zone";
         file "mydomain.kr.zone.signed";
         key-directory "key";
         auto-dnssec maintain;
         update-policy local;
//       allow-update { none; };
};

~~~(중략)

  위와 같이 zone 파일은 기존의 것이 아닌 서명된 존 파일을 사용해야 한다.
  allow-update 구문과 update-policy 함께 사용할 수 없어서 기존의 설정을 주석처리(//) 하였다.

  문제는 dnssec-signzone 명령으로 기존의 존 파일에 서명작업을 수행하고 나면 서명된 존파일(~.signed)외에 DS레코드 데이터를 포함하고 있는 "dsset-mydomain.kr."라는 파일도 추가로 생성한다. 파일의 내용은 아래와 같은데.....

mydomain.kr.         IN DS 12378 7 1 8F689EA0FB90617E80624866DA7FEFA4613FC77D
mydomain.kr.         IN DS 12378 7 2 CB65C8278236179B96E97C49C25CEDB2FF7ABDEBF31F57396BB921C5 5C3549ED

  위의 DS레코드를 해당 도메인의 부모(상위) DNS의 존에 등록해야 한다. 즉, 도메인별 최상위 레지스트리에서 등록을 해줘야 한다는 것이다. 참고로 우리나라의 최상위 국가도메인의 레지스트리는 한국인터넷진흥원(KISA)이다. 아마도 도메인을 처음 등록할 때 이용했던 도메인 등록 대행사에 문의하는 것이 가장 수월해 보인다. 구글에서 잠깐 검색해보니 국내업체인 호스팅케이알의 경우에는 DNSSEC 설정에 대한 별도의 페이지가 마련되어 있다. (이 업체에서 웹호스팅이나 서버호스팅 등을 이용해본 경험이 없기에 더이상의 설명은 할 수 없지만..) 대게의 업체들은 DNSSEC 설정을 지원하고 있을 것이다. DNSSEC 설정이 반드시 필요한 상황이라면 도메인을 구매하기 전에 도메인 등록 대행업체와 먼저 상담해 볼 필요는 있을 것 같다.

  .....일단 DS레코드의 등록은 건너띄고 계속 진행하였다.

(4)검증을 위한 네임서버의 설정변경

  네임서버에 DNSSEC 서명검증 기능을 활성화하고 신뢰앵커(Trust Anchor) 데이터를 설정하는 절차이다. 이 설정을 통해서 네임서버가 DNSSEC 서명 검증을 수행하는 캐시 네임서버로 작동한다.

  신뢰 앵커 데이터는 아래와 같이 dig 명령으로 확인할 수 있다.

[root@localhost etc]# dig @f.root-servers.net . dnskey +multi +norec

; <<>> DiG 9.11.13-RedHat-9.11.13-6.el8_2.1 <<>> @f.root-servers.net . dnskey +multi +norec
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62458
;; flags: qr aa; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;.                      IN DNSKEY

;; ANSWER SECTION:
.                       172800 IN DNSKEY 256 3 8 (
                                AwEAAfC/6HLClwss6h7rPfoG2cliv4/SPJRd2HPEglRs
                                vKZRbPP2RLfiobeAkczcdqaD5q8loEt14lcTgDqwzOIS
                                Z3YvSVkM4JRMFwKzcjukKo5CsDVbMmhTD0C0yxWICRQ1
                                M+Y5/XkZAT7mt4cb3fWcN9xgyq1wEXQX+zdLQHrNEVQS
                                iL5SoA5cOtCSoQ45n8bKDXdw/0jjP9Rw1FVKsdzLVkQS
                                rVMm8k30WUkHm/SK/n/954KENkdQOA6Li2vO9nicQdeg
                                yAkDeNJCdPN/p3jEhCTQLyO4AlAmyaPcDHeeo7OXr/Vs
                                Yu4NTDde9hBuS0zx/rewD+BvSnmnNHNmH2FjUE8=
                                ) ; ZSK; alg = RSASHA256 ; key id = 26116
.                       172800 IN DNSKEY 257 3 8 (
                                AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTO
                                iW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN
                                7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5
                                LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8
                                efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7
                                pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLY
                                A4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws
                                9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU=
                                ) ; KSK; alg = RSASHA256 ; key id = 20326

;; Query time: 135 msec
;; SERVER: 2001:500:2f::f#53(2001:500:2f::f)
;; WHEN: Mon Nov 30 09:10:49 UTC 2020
;; MSG SIZE  rcvd: 578

[root@localhost etc]#

  위에서 flag값이 257인 DNSKEY 레코드 값(KSK의 DNSKEY)을 복사하여 named.conf에 설정해야 한다. 아래와 같다.

zone "." IN {
        type hint;
        file "named.ca";
};

managed-keys {
     "." initial-key 257 3 8
         "AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTO
          iW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN
          7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5
          LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8
          efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7
          pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLY
          A4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws
          9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU=";
};


include "/etc/named.rfc1912.zones";

  DNSSEC가 정상적으로 작동하는지 검증할 수 있는 사이트가 몇 군데 있다. 

dnssec-analyzer.verisignlabs.com

dnsviz.net

  위의 verisign에서 테스트해본 결과는 아래와 같이 나온다.

  역시나 상위 DNS에서 DS레코드의 등록을 생략했기 때문에 No DS records found 오류메시지가 보인다. 아직 2차 네임서버를 설정하지 않았기에 2차 네임서버가 Unkonwn host라고 경고메시지를 보여주고 있다.

  내가 kr도메인을 등록했던 도메인 등록 대행사의 홈페이지에는 DNSSEC에 대한 안내가 없으며, 별도의 문의도 하지 않았다. 나중에라도 그 필요성이 절실해지면 어떻게 해서든지 제대로 설정을 마칠것 같다.

  서브도메인을 추가로 등록해야 하는 등의 네임서버의 설정을 수정해야 하는 상황이 발생한다면...(서명하기 이전의) 기존의 ZONE 파일을 수정한 후에 dnssec-singzone부터 다시 설정해야 한다.

728x90
반응형

댓글