1. DNS
1.1. What is DNS?
DNS (Domain Name System)는 인터넷에서 가장 중요한 구성 요소입니다. 우리가 웹 브라우저에 "google.com"을 입력하면, DNS 서버는 "google.com"에 해당하는 IP 주소 (예: 142.250.200.14)를 알려줍니다. DNS는 도메인 이름을 IP 주소로 변환하는 역할을 수행하며, 인터넷 통신의 핵심 기반을 제공합니다.
1.2. Types of DNS Attack
하지만 초기 DNS는 보안을 고려하지 않고 설계되어 다음과 같은 취약점을 가지고 있습니다.
- DNS 스푸핑 (DNS Spoofing): 공격자가 DNS 서버를 속여 가짜 IP 주소를 알려주도록 만들 수 있습니다. 공격자는 취약한 DNS 서버를 공격하거나, 응답을 가로채 위조된 응답을 전송하여 사용자를 악성 사이트로 유도할 수 있습니다.
- 캐시 포이즈닝 (Cache Poisoning): 공격자가 DNS 서버의 캐시에 잘못된 정보를 주입하여, 해당 DNS 서버를 사용하는 모든 사용자가 잘못된 IP 주소로 접속하도록 만들 수 있습니다. 공격자는 DNS 쿼리에 대한 위조된 응답을 빠르게 전송하여 DNS 서버의 캐시를 오염시킬 수 있습니다.
2. DNSSEC
DNSSEC (DNS Security Extensions)는 DNS 프로토콜의 보안 취약점을 해결하기 위해 설계된 확장 세트입니다. 기존 DNS는 응답의 진위 여부를 검증하는 메커니즘이 없어 스푸핑 공격에 취약했지만, DNSSEC는 디지털 서명을 통해 데이터 무결성 및 인증 기능을 제공하여 이러한 위협을 완화합니다.
3. DNSSEC 동작방식
3.1. 웹사이트 접속 시도: A 레코드와 RRSIG 레코드
사용자가 웹 브라우저에 "http://www.example.com"을 입력하여 접속을 시도하면, 시스템은 가장 먼저 해당 도메인의 IP 주소를 확인하기 위해 DNS 질의를 수행합니다. DNSSEC가 적용된 환경에서는 DNS 서버로부터 "http://www.example.com"의 IP 주소를 담고 있는 A 레코드와 함께 RRSIG 레코드를 응답받습니다.
RRSIG 레코드는 데이터의 위변조 방지를 위한 디지털 서명에 해당합니다. 이는 "example.com" 영역에서 해당 A 레코드 정보가 생성되었으며, 전송 과정에서 무단 변경이 이루어지지 않았음을 보증하는 역할을 수행합니다. RRSIG 레코드의 존재는 IP 주소 정보의 신뢰성을 확보하는 첫 번째 단계입니다.
3.2. RRSIG 레코드 검증: DNSKEY 레코드 (ZSK)
RRSIG 레코드의 유효성을 검증하기 위해서는 DNSKEY 레코드가 필요합니다. DNSKEY 레코드는 해당 DNS 영역의 공개 키를 담고 있는 저장소 역할을 합니다. RRSIG 레코드는 영역 서명 키 (ZSK)라는 개인 키로 생성되며, DNSKEY 레코드에는 이에 상응하는 공개 ZSK가 포함되어 있습니다.
시스템은 DNSKEY 레코드에서 공개 ZSK를 추출하여, 수신한 A 레코드와 RRSIG 레코드의 서명을 검증합니다. 이는 RRSIG 레코드가 실제로 "example.com" 영역에서 생성된 유효한 서명인지 확인하는 과정입니다. 검증이 성공적으로 완료되면, RRSIG 레코드의 신뢰성이 확보되고, 결과적으로 A 레코드 정보 또한 무결성이 보장된 것으로 간주할 수 있습니다.
3.3. DNSKEY 레코드의 진위성 확인: DNSKEY 레코드 (KSK)와 RRSIG 레코드 (DNSKEY)
A 레코드 정보의 신뢰성은 확보되었으나, DNSKEY 레코드 자체의 진위성 또한 검증되어야 합니다. 만약 공격자가 위조된 DNSKEY 레코드를 시스템에 제공할 경우, 잘못된 공개 키를 이용한 RRSIG 검증을 통해 시스템이 속을 수 있습니다.
DNSSEC는 DNSKEY 레코드 자체의 보안을 강화하기 위해 키 서명 키 (KSK)를 사용합니다. DNSKEY 레코드는 KSK 개인 키로 서명되며, RRSIG 레코드 (DNSKEY)가 함께 제공되어 DNSKEY 레코드의 무결성을 보증합니다. DNSKEY 레코드에는 KSK의 공개 키 또한 포함되어 있습니다.
시스템은 DNSKEY 레코드 내의 공개 KSK를 이용하여, DNSKEY 레코드와 함께 수신한 RRSIG 레코드 (DNSKEY)의 서명을 검증합니다. 이 과정은 DNSKEY 레코드 자체가 위변조되지 않은, "example.com" 영역에서 제공하는 정당한 정보임을 확인하는 단계입니다. 검증 성공 시, DNSKEY 레코드의 신뢰성이 확보됩니다.
3.4. 상위 영역의 보증: DS 레코드
DNSKEY 레코드의 진위성이 확인되었으나, "example.com" 영역이 실제로 상위 영역인 ".com"의 관리 하에 있는 정당한 도메인인지 확인하는 과정이 필요합니다. 이는 도메인 등록 기관과 같은 상위 기관의 보증을 통해 확인할 수 있습니다.
이러한 보증 역할을 수행하는 것이 DS 레코드 (Delegation Signer Record)입니다. ".com" 영역은 "example.com" 영역의 DNSKEY 레코드 (특히 KSK 공개 키)의 해시 값을 DS 레코드에 기록하여 관리합니다. 시스템은 ".com" 영역에 DS 레코드를 질의하여 획득하고, 획득한 DS 레코드 내의 해시 값과 이전에 검증한 "example.com" DNSKEY 레코드의 KSK 해시 값을 비교합니다. 해시 값이 일치하는 경우, ".com" 영역이 "example.com" 도메인과 해당 DNSKEY 레코드를 보증하는 것으로 간주할 수 있습니다.
3.5. 최상위 기관의 신뢰: 신뢰 앵커 (Trust Anchor)
".com" 영역의 DS 레코드를 통해 "example.com" 영역의 DNSKEY 레코드에 대한 신뢰가 확립되었지만, 최상위 영역인 ".com" 자체의 신뢰성은 어떻게 확보할 수 있을까요? ".com" 영역 또한 최상위 루트 영역 (".")의 관리 하에 있으며, 루트 영역은 DS 레코드를 통해 하위 영역을 보증하고, DNSKEY 레코드를 통해 자체 보안 키를 관리합니다.
최상위 루트 영역의 신뢰성은 신뢰 앵커 (Trust Anchor)를 통해 확보됩니다. 신뢰 앵커는 DNSSEC 검증 체인의 시작점으로, 시스템은 최상위 루트 영역 (".")의 DNSKEY 레코드 (특히 KSK 공개 키)를 신뢰 앵커로 사전 설정합니다. 이는 최상위 기관의 공개 키에 대한 절대적인 신뢰를 기반으로 DNSSEC 검증 프로세스가 시작됨을 의미합니다.
시스템은 사전 설정된 신뢰 앵커를 이용하여 루트 영역의 DNSKEY 레코드를 검증합니다. 루트 영역 DNSKEY 레코드의 진위성이 확인되면, 루트 영역이 보증하는 ".com" 영역, ".com" 영역이 보증하는 "example.com" 영역으로 신뢰가 연쇄적으로 확장됩니다. 최종적으로 "example.com" 영역이 제공하는 A 레코드 정보까지 신뢰성을 확보하게 됩니다.
신뢰 체인의 완성
DNSSEC은 A 레코드 → RRSIG → DNSKEY (ZSK) → DNSKEY RRSIG → DNSKEY (KSK) → DS 레코드 → 상위 영역 DNSKEY → ... → 루트 영역 DNSKEY → 신뢰 앵커 순으로 신뢰를 상향식으로 구축하는 구조를 가집니다. 하위 단계 정보부터 시작하여, 점진적으로 상위 기관의 보증을 통해 최종적으로 최상위 기관의 신뢰까지 확보하는 과정을 통해 인터넷 정보의 무결성을 보장하는 체계를 확립합니다. 이것이 DNSSEC의 핵심적인 동작 원리입니다.
참고
https://www.cloudflare.com/ko-kr/learning/dns/dnssec/how-dnssec-works/