DNSSEC은 공개키 암호화방식의 전자서명 메커니즘을 DNS 체계에 도입하여 적용하는 방법으로써 DNS의 "데이터 위-변조" 취약점을 보강하여 보안 안정성을 대폭 강화하였습니다.
공개키 암호화방식의 전자서명은 일반적으로 아래 개념도와 같은 방식으로 동작합니다.
<공개키 암호화 개념>
o A는 개인키 및 공개키로 구성된 서명용 키를 생성
o A의 공개키는 인터넷 일반에 공개하여 배포
o A는 B에게 송부할 원본데이터에 대해 서명처리(signing)하여 서명(signature) 데이터를 산출
o A는 "원본데이터"에 "서명" 데이터를 부가하여 인터넷 경유하여 B에게 전송
o B는 A로부터 "원본데이터"와 "서명" 데이터를 수신
o B는 A의 공개키를 조회하여 파악
o B는 A의 공개키를 사용, "원본데이터", "서명" 대상의 서명검증(signature validation) 수행
o 서명검증이 정상이면, B가 A로부터 수신한 "원본데이터"에 중간에 위-변조되지 않았음을 확신
DNSSEC은 이와 같은 전자서명과 서명검증 절차를 지원하기 위해 RRSIG, DNSKEY, NSEC/NSEC3, DS의 4가지 신규 리소스 레코드를 추가 정의하였습니다.
o A는 개인키 및 공개키로 구성된 서명용 키를 생성
o A의 공개키는 인터넷 일반에 공개하여 배포
o A는 B에게 송부할 원본데이터에 대해 서명처리(signing)하여 서명(signature) 데이터를 산출
o A는 "원본데이터"에 "서명" 데이터를 부가하여 인터넷 경유하여 B에게 전송
o B는 A로부터 "원본데이터"와 "서명" 데이터를 수신
o B는 A의 공개키를 조회하여 파악
o B는 A의 공개키를 사용, "원본데이터", "서명" 대상의 서명검증(signature validation) 수행
o 서명검증이 정상이면, B가 A로부터 수신한 "원본데이터"에 중간에 위-변조되지 않았음을 확신
DNSSEC은 이와 같은 전자서명과 서명검증 절차를 지원하기 위해 RRSIG, DNSKEY, NSEC/NSEC3, DS의 4가지 신규 리소스 레코드를 추가 정의하였습니다.
리소스 레코드(RR) | 개요 |
---|---|
DNSKEY | - 도메인 존의 공개키 데이터를 저장하여 제공하기 위한 RR - 존은 개인키와 공개키 쌍을 가지고 있으며 개인키는 안전한 장소에 따로 보관되며, 개인키와 쌍을 이루는 공개키는 DNSKEY RR 의 형태로 명시되어 질의응답을 통해 배포됨 |
RRSIG | - 존 안에 있는 RRSet에 대한 개인 키의 전자서명한 결과값을 갖는 RR - RRSIG는 DNS 응답 메시지에 전자서명 대상 RR과 함께 포함되어 전달 |
DS | - DNS 고유의 위임체계에 따라 보안 측면의 인증된 위임체계를 구성하기 위한 데이터를 저장하는 RR - 하위 자식 도메인 존의 KSK를 확증할 수 있는 수단 제공 - 부모 도메인과 자식 도메인 간에 인증사슬 형성 |
NSEC / NSEC3 | - 'DNS 데이터 부재 인증'을 위해 정의된 RR - 특정 리소스 레코드가 존재하지 않음을 전자 서명을 통해 인증 할 수 있는 메커니즘을 제공 - NSEC의 존목록화 문제를 해결하기 위해 NSEC3 레코드 추가 정의됨 |
공개키 암호화방식의 전자서명 메커니즘과 비교하여 DNSSEC의 각 리소스레코드는 다음과 같은 역할을 담당합니다.
공개키 암호화방식의 전자서명 구성 요소 |
DNSSEC 리소스 레코드 |
비고 |
---|---|---|
A의 공개키 | DNSKEY | - 공개키는 일반에 공개 배포 - DNSKEY는 존의 공개키를 포함 |
원본데이터 | 일반 DNS레코드 및 NSEC/NSEC3, DS |
- 기존 A 레코드등이 원본데이터 해당 - NSEC/NSEC3, DS 레코드도 원본데이터 해당 - DNSKEY도 DNS질의응답과정에서 원본데이터 해당 |
서명 데이터 | RRSIG | - RRSIG에 서명데이터 포함 - RRSIG은 서명검증에 필요한 정보포함 |
기존 DNS 체계에 DNSSEC을 적용하였을 때, 기본적인 DNS 구조나 동작 환경은 변화되지 않습니다. 다만 전자서명 메커니즘에 필요한 RRSIG, DNSKEY, NSEC/NSEC3, DS의 리소스 레코드들이 추가되어 처리됩니다.
RRSIG(Resource Record Signature)은 도메인 네임 시스템의 각 리소스 레코드 데이터에 대한 전자서명 데이터를 저장하기 위한 리소스 레코드입니다. RRSIG은 서명 데이터와 함께 전자서명의 검증처리에 필요한 여러 가지 정보 필드를 함께 정의하고 있습니다.
<A RR에 대한 서명 결과값을 저장하는 RRSIG RR내용 예>
DNSSEC이 적용된 DNS 응답 메시지는 응답 대상 리소스 레코드와 함께 이 레코드에 대한 서명정보를 담은 RRSIG 리소스 레코드를 추가하여 응답됩니다.
RRSIG 리소스 레코드의 전자서명 데이터 생성에 사용된 서명키의 공개키인 DNSKEY 리소스 레코드를 지정하는
정보가 RRSIG 리소스 레코드에 포함되어 있습니다. 전자서명 데이터는 서명키의 공개키인 DNSKEY 리소스 레코드를 사용한 서명검증 처리에 의해 DNS 응답 레코드 데이터의 위조-변조를 검증하게 됩니다.
DNSKEY(DNS Public Key)는 도메인 존(zone)의 공개키(public key) 데이터를 저장하여 제공하기 위한 리소스 레코드입니다. RRSIG 리소스 레코드에서 제공되는 전자서명에 대한 서명검증 절차는 이 서명에 사용된 개인키(private key)에 상응하는 공개키(public key)를 필요로 합니다. 이 공개키의 소유자는 도메인 존(zone)이며, 도메인 존(zone)의 공개키(public key)는 DNSKEY 리소스 레코드에 저장되어 존 파일에 설정되며, DNS 질의응답을 통해 공개 배포됩니다.
<DNSKEY RR내용 예>
일반적으로 하나의 도메인 존에는 두 가지 서명키가 사용됩니다.
첫 번째는 도메인 존의 모든 리소스 레코드 각각을 서명하기 위한 용도의 서명키로써, "존 서명키" 또는 "ZSK(Zone Singing Key)"라고 합니다.
두 번째는 DNSKEY 리소스 레코드 자체를 서명하기 위한 용도의 서명키로써, "키 서명키" 또는 "KSK(Key Signing Key)"라고 합니다.
DS(Delegation Signer)은 DNS 고유의 기존 위임체계에 부가하여 "보안측면의 인증된 위임체계"를 구성하기 위한 데이터를 저장하기 위한 리소스 레코드입니다.
DS 레코드에 저장되는 데이터는 자식 도메인 존의 2가지 DNSKEY 레코드 중에서 "키 서명키(KSK)"의 DNSKEY 레코드에 대한 다이제스트 데이터입니다. DS 레코드의 다이제스트 값을 사용하여 부모 도메인 존이 자식
도메인 존의 "키 서명키(KSK)"를 보안 인증하고 이를 검증할 수 있는 수단을 제공함으로써, 이를 통해 부모 도메인과 자식 도메인 간에 보안측면의 "인증사슬(authentication chain)"을 형성하게 됩니다.
존이 제공하는 DS 리소스 레코드를 부모 도메인 존에 설정하고, DS 리소스 레코드에 대해 부모 도메인 존의 "존 서명키(ZSK)"로 서명 처리하여 RRSIG 레코드를 설정함으로써, 전자서명 검증에 의한 데이터 무결성 보장을 제공합니다.
자식존의 DS 레코드가 부모존에도 똑같이 존재하며, 이 DS 레코드로 자식존과 부모존 사이에 인증사슬이 형성됩니다.
<DS RR 내용 예>
DS 레코드 값은 자식 도메인 존 파일을 서명 처리할 때 자동으로 산출되어 파일로 저장됩니다. BIND DNS 경우, "dsset-"의 형식을 갖는 파일명으로 저장됩니다.
NSEC(Next Secure)은 DNSSEC이 제공하는 보안기능 중 "DNS 데이터 부재"의 인증을 위해 정의된 리소스 레코드입니다. 질의 대상인 리소스 레코드가 실제로 존재하지 않음을 서명검증을 통해 인증할 수 있는 방법을 제공하기 위한 리소스 레코드입니다. 어떤 리소스 레코드가 도메인 존 내에 존재하지 않는데도 불구하고 공격자가 마치 이 리소스 레코드가 존재하는 것처럼 위장하여 공격을 시도하는 경우를 차단하기 위한 것입니다.
NSEC 레코드는 순차적으로 연결되어 있습니다. N번째 레코드에서 N+1번째 레코드의 도메인 이름이 지정되어 있고, 마지막 레코드에는 첫번째 레코드의 도메인 이름이 지정되어 있습니다.
<NSEC RR 내용 예>
NSEC는 "DNS 데이터 부재"의 인증을 제공하기 위한 목적으로 정의되었지만, 이를 악용하면 도메인 존 내에 있는 모든 도메인 네임 리스트와 이 네임에 설정된 리소스 레코드 종류를 쉽게 파악해 낼 수 있게 하는 문제를 가지고 있는데, 이러한 문제를 "존 목록화 문제"라고 합니다.
그리고 NSEC 리소스 레코드는 도메인 존 내에 있는 모든 레코드들에 대해 논리적 체인을 형성하여 존재하지 않는 리소스 레코드를 쉽게 검출할 수 있도록 하는데, 이 메커니즘은 도메인 존에 도메인 위임정보 리소스 레코드 변동이 수시로 발생하는 최상위도메인(TLD) 존에서 변동이 발생할 때마다 막대한 재서명 처리작업을 유발시켜 "서명비용 과다 문제"을 발생시키는 문제점을 가지고 있었습니다.
NSEC3는 NSEC 리소스 레코드 적용 경우 발생하는 "존 목록화 문제"와 "서명비용 과다 문제"를 해소하기 위해 추가 정의된 리소스 레코드입니다. NSEC3 리소스 레코드는 "존 목록화 문제"를 방지하기 위해 NSEC 리소스 레코드 대신 사용할 수 있습니다.
NSEC3 리소스 레코드는 도메인 네임 정보를 해쉬(hash)처리하여 쉽게 알아볼 수 없는 형태로 "DNS 데이터 부재"의 인증기능을 제공합니다.
NSEC3 레코드는 NSEC 레코드와 마찬가지로 레코드가 순차적으로 연결되어 있습니다. N번째 레코드에서 N+1번째 레코드의 서명값이 포함된 도메인 이름이 지정되어 있고, 마지막 레코드에는 첫번째 레코드의 서명된 도메인 이름이 지정되어 있습니다.
NSEC3 리소스 레코드를 사용하는 경우, 서명처리 과정에서 NSEC3PARAM 리소스 레코드가 자동으로 산출되어 추가 설정됩니다. NSEC3PARAM 리소스 레코드는 NSEC3 리소스 레코드의 도메인네임 부분을 어떤 방식으로 해쉬 처리할 것인지를 지정하는 인자값(parameter)을 설정하여, 매스터 및 슬레이브 네임서버, 캐시 DNS서버에 알려주는 역할을 합니다.
도메인 존에 DNSSEC 서명적용이 되어있을 때, DNS 질의응답 과정에서의 서명검증은 캐시 DNS서버에서 수행됩니다.
DNS 도메인은 루트 존으로부터 최종단 도메인까지 트리구조로 구성됩니다. DNSSEC 서명적용이 되면, 기존의 트리구조 외에 DNSSEC DS 레코드와 각 존의 DNSKEY 레코드의 인증관계에 의해 "인증사슬(authentication chain)"이라 불리는 새로운 보안측면의 트리구조가 추가로 구성됩니다. "인증사슬"은 최상위 도메인인 루트 존까지 이어지게 됩니다.
캐시 DNS서버의 서명검증은 아래와 같은 형태로 수행됩니다.
권한 DNS서버 영역에서 각 레벨별 존은 상위 존과 서명검증을 수행합니다.
도메인 test.go.kr. 를 예로들어, test.co.kr 은 .co.kr 존과 서명검증을 수행하고, .co.kr 존은 .kr 존과 서명검증을하고, .kr 존은 ROOT 존과 서명검증 수행합니다.
각각의 서명검증은 인증사슬로 연결되게 되는데, test.co.kr 과 .co.kr. 존의 서명검증 결과값이 상위 존과의 서명검증에 사용됩니다.
캐시 DNS 서버 영역에서의 서명검증 흐름을 살펴보겠습니다.
<캐시 DNS서버의 서명검증 흐름>
캐시 DNS서버에는 루트 도메인 존의 키 서명키(KSK) DNSKEY 레코드의 공개키 데이터에 해당하는 "신뢰앵커(Trust Anchor)"를 반드시 설정합니다. "신뢰앵커"는 DNS 질의응답에서 수신된 서명처리된 DNS 데이터에 대한 서명검증에 있어서 출발점이 됩니다. "신뢰앵커"는 캐시 DNS서버 관리자에 의해 직접 설정되며, 이름처럼 데이터 무결성에 대한 "신뢰성"을 확신할 수 있는 기본 근거가 됩니다.
캐시 DNS서버는 루트 도메인 존부터 최종 검증대상인 www.test.co.kr의 A 레코드 데이터까지 순차적으로 서명 검증하여 모두 이상이 없음을 확인한 연후에 이 데이터를 비로소 신뢰하여 처리하게 됩니다.
권한 DNS서버에 설정되는 DNSSEC 서명된 도메인 존 구성 체계와 캐시 DNS서버의 서명검증에 의한 "DNS 데이터의 위-변조 방지" 동작을 일상에서 이용하고 있는 "인감증명" 체계에 비유한다면, 아래 그림과 같습니다.
DNSSEC 서명검증 체계 | 인감증명 체계 |
---|---|
도메인 존(bank.kr)은 서명키 소유 | 개인은 자신만이 사용하는 인감도장 소유 |
www.bank.kr의 IP주소 서명처리 응답 | 주요 계약내용에 인감도장 사용 날인 - DNSSEC의 RRSIG은 계약서의 찍힌 인감도장의 "날인"에 해당 |
<인터넷뱅킹 사이트의 서명검증 예>
NSEC3 리소스 레코드를 사용하는 경우, 서명처리 과정에서 NSEC3PARAM 리소스 레코드가 자동으로 산출되어 추가 설정됩니다. NSEC3PARAM 리소스 레코드는 NSEC3 리소스 레코드의 도메인네임 부분을 어떤 방식으로 해쉬 처리할 것인지를 지정하는 인자값(parameter)을 설정하여, 매스터 및 슬레이브 네임서버, 캐시 DNS서버에 알려주는 역할을 합니다.
결과 분류 | 캐시 DNS서버 | 비고 | ||
---|---|---|---|---|
신뢰앵커 설정 |
DS 인증 신뢰사슬 구성 |
서명검증 정상여부 |
||
Secure | 설정 | 정상 | 정상 | - DNSSEC 서명적용 도메인인 경우 - 서명검증 결과 정상, 데이터 무결성 확인 - 호스트에 서명검증 된 데이터로 응답처리 |
Insecure | 설정 | 오류 | - | - DNSSEC 서명 미적용 도메인인 경우 - 상위 도메인은 서명되어 있는 상태 - 호스트에는 해당 데이터로 정상적 응답처리 |
Bogus | 설정 | 정상 | 오류 | - DNSSEC 서명적용 도메인인 경우 - 서명검증 오류 결과 발생 - DNS 응답 데이터의 데이터 위-변조 판단 - 호스트에 SERVFAIL 에러응답으로 응답처리 - 위-변조 판정 데이터는 호스트에 전달하지 않음 |
Indeterminate | 미설정 | - | - | - 캐시 DNS서버의 서명검증기능 비활성화 상태 - 일반 캐시 DNS서버와 동일한 처리동작 수행 |
Indeterminate 결과 경우는, DNSSEC을 구현한 캐시 DNS서버라 할지라도 신뢰앵커 설정이 되어 있지 않은 경우에 해당합니다. 신뢰앵커 설정이 없으면 서명검증 수행이 불가능하기 때문에 서명검증을 수행하지 않고, 서명검증 없이 일반적인 DNS 질의응답 처리절차를 수행하게 됩니다. 이 캐시 DNS서버로부터 수신하는 DNS 응답 데이터는 위-변조되어 있을 가능성을 배제할 수 없습니다.
4가지 유형의 결과 중 Secure와 Bogus는 서명검증을 수행하는 캐시 DNS서버인 경우로써, 질의된 도메인이 DNSSEC 서명 적용되어 있는 경우에 해당합니다.
Secure 결과 경우는 서명검증 수행에 있어 오류가 없이 검증이 완료된 경우로써 호스트는 서명검증에 의해 검증된 안전한 데이터를 응답으로 수신하게 됩니다.
Bogus 결과 경우는 서명검증 과정 중에 DNS 데이터와 RRSIG 서명데이터에 의한 검증에서 에러가 발생한 경우로써 최종적으로 검증에 실패한 경우에 해당합니다. 이 경우, 캐시 DNS서버는 검증실패한 DNS 데이터를 위-변조된 데이터로 판단하고, 캐시 메모리에 위-변조 데이터로 표시하여 저장합니다. 호스트로는 응답 데이터가 비어있는 DNS 에러응답 메시지로 응답처리 함으로써, 호스트가 위-변조된 데이터에 따라 인터넷 접속을 시도하게 되는 사태를 방지합니다.
4가지 유형의 결과 중 Insecure는 서명검증을 수행하는 캐시 DNS서버인 경우로써, 질의된 도메인이 아직 DNSSEC 서명적용이 되어 있지 않은 경우에 해당합니다. 상위 부모 도메인 존까지는 서명되어 있지만 이 도메인 존은 서명적용 되어 있지 않으므로, 캐시 DNS서버는 서명검증 절차를 중단하고 호스트에게는 확인되지 않은 상태의 DNS 데이터로 응답처리 합니다. 질의대상 도메인 존이 서명되어 있지 않으므로 이 도메인에 대한 응답 데이터는 공격자에 의해 위-변조가 발생하여도 위-변조 여부를 검출할 방법이 없습니다.