DNSSEC는 DNS를 보호합니다. 본 문서는 DNS 확인에 영향을 주는 DNSSEC 문제를 감지하는 방법을 소개합니다.
Dig로 DNSSEC 테스트
Dig는 DNS 레코드의 이름 서버를 쿼리하는 명령줄 도구입니다. 예를 들어, dig는 DNS 확인자에 www.cloudflare.com의 IP 주소를 문의할 수 있습니다(옵션으로 +short을 사용하면 결과만 출력됩니다).
$ dig www.cloudflare.com +short 198.41.215.162 198.41.214.162
dig로 DNSSEC 레코드를 확인하세요. 아래 예에서 출력 마지막 줄은 RRSIG 레코드입니다. RRSIG는 레코드에 첨부된 DNSSEC 서명입니다. DNS 확인자는 RRSIG로 DNS 응답의 신뢰 여부를 결정합니다.
$ dig www.cloudflare.com +dnssec +short 198.41.214.162 198.41.215.162 A 13 3 300 20180927180434 20180925160434 35273 cloudflare.com. DYYZ/bhHSAIlpvu/HEUsxlzkC9NsswbCQ7dcfcuiNBrbhYV7k3AI8t46 QMnOlfhwT6jqsfN7ePV6Fwpym3B0pg==
Dig는 DNS 레코드를 확인하기 위해 사용되는 공개 키도 검색합니다. 도메인의 DNS 레코드는 모두 동일한 공개 키로 서명되어 있습니다. 따라서 하위 도메인의 공개 키가아니라 루트 도메인의 공개 키에 대해 쿼리해야 합니다.
$ dig DNSKEY cloudflare.com +short 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+ KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== 256 3 13 koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z 1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==
DNS 응답은 두 개의 레코드로 이루어져 있습니다.
- DNSKEY 레코드 256은 영역 서명 키로 불리는 공개 키로서 A, MX, CNAME, SRV 등의 DNS 레코드 서명을 확인할 때 사용됩니다.
- DNSKEY 레코드 257은 키 서명 키로서 DNSKEY, CDS, CDNSKEY 레코드의 서명을 확인할 때 사용됩니다.
dig에 +short 옵션을 사용하지 않는 경우, ad 플래그가 응답 헤더에 있으면 DNS 응답이 DNSSEC 인증을 받은 것입니다.
$ dig www.cloudflare.com [...] ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65326
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 [...] ;; QUESTION SECTION: ;www.cloudflare.com. IN A [...] ;; ANSWER SECTION: www.cloudflare.com. 15 IN A 198.41.215.162 www.cloudflare.com. 15 IN A 198.41.214.162
Dig로 DNSSEC 신뢰 체인 보기
도메인 서명(예: cloudflare.com)의 완전한 확인은 상위 레벨 도메인(예: .com)에서 키 서명 키를 확인하는 것이 포함됩니다. 이후 루트 서버 레벨에서.com의 키 서명 키를 확인하여 비슷한 확인 작업을 실행합니다. DNSSEC 루트 키는 DNS 클라이언트에 분산되어 신뢰 체인을 완성합니다.
DNSSEC가 활성화된 경우 등록 기관의 DNS에 DS 레코드가 필요합니다. DS 레코드에는 다양한 공개 키 서명 키는 물론 키에 대한 메타데이터가 포함됩니다.
dig를 사용하여 DS 레코드를 찾으세요.
$ dig +short DS cloudflare.com 2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9
+trace 옵션을 사용하면, dig는 응답이 cloudflare.com 이름 서버에서 반환됐는지, 아니면 .com 이름 서버에서 반환됐는지 확인합니다. 이 예에서 cloudflare.com의 DS 레코드는 e.gtld-servers.net이 반환했습니다.
$ dig DS cloudflare.com +trace [...] cloudflare.com. 86400 IN DS 2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9 [...] com. 172800 IN NS e.gtld-servers.net. [...] ;; Received 1213 bytes from 2001:502:1ca1::30#53(e.gtld-servers.net) in 37 ms
위 모든 단계를 수동으로 실행하는 것보다 더 간편한 방법은 DNSViz 온라인 도구를 사용하는 것입니다. 자세한 내용은 DNSViz를 사용한 DNSSEC 유효성 검사 문제 해결이나 DNSViz를 통한 cloudflare.com의 DNSSEC 결과 예를 참조하시기 바랍니다.
Dig로 DNSSEC 유효성 검사 문제 해결
등록 기관의 오래된 DNSSEC 레코드를 업데이트하거나 제거하지 않고 권한 있는 DNS 공급자를 변경하면, 문제가 발생합니다.
$ dig A brokendnssec.net @1.0.0.1 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 10663
+cd 옵션으로 dig를 실행하여 SERVFAIL 응답이 DNSSEC와 관련됐는지 확인하세요. +cd 옵션은 DNSSEC 유효성 검사 없이 DNS 결과를 제공합니다.
$ dig A brokendnssec.net @1.0.0.1 +dnssec +cd +short 104.20.49.61 104.20.48.61
위 예에서 +cd 옵션을 사용한 경우에는 올바른 DNS 응답을 수신하지만, DNSSEC를 사용하여 쿼리한 경우 SERVFAIL 응답을 수신한다면 DNSSEC가 잘못 구성된 것입니다.이 문제는 권한 있는 이름 서버가 변경됐지만 DS 레코드가 업데이트되지 않은 경우 종종 발생합니다. 공격자가 쿼리에 대한 응답을 조작하려 할 때도 이 문제가 발생할 수 있습니다.
DNSViz로 DNSSEC 유효성 검사 문제 해결
- http://dnsviz.net/으로 이동하세요.
- 텍스트 필드가 나타나면 도메인 이름을 입력하세요.
- DNSViz가 처음으로 사이트를 분석하는 경우, 표시된 분석 버튼을 클릭하세요.
- DNSViz가 사이트를 분석한 적이 있었다면, 표시되는 지금 업데이트 버튼을 클릭하세요.
DNSSEC가 없는 예
다음은 dnsviz.net에서 도시된, DNSSEC 없는 작업 도메인의 예입니다.
올바른 DNSSEC의 예
다음은 TLD 이름 서버와 cloudflare.com에 대한 권한 있는 이름 서버 사이에 작동하는 DNSSEC 레코드를 가진 도메인의 예입니다.
권한 있는 이름 서버에 대한 RRSIG 레코드가 없거나 잘못된 예
다음은 TLD 이름 서버가 게시한 DS 레코드와 일치하는 유효한 DNSKEY 레코드를 권한 있는 이름 서버가 제공하지 않은 경우 dnsviz.net이 잘못된 위임을 보여주는 예입니다.
다음 단계
DNSSEC 실행으로 문제가 발견된 경우, 도메인 등록 기관에 문의하여 DS 레코드가, 권한 있는 DNS 공급자가 지정한 무엇과 일치하는지 확인하세요. Cloudflare가 권한 있는 DNS 공급자인 경우에는 Cloudflare로 DNSSEC 구성 지침을 따르세요.