정보보안 - DNS(Domain Name System)
DNS (Domain Name System)
- 개요
- DNS 는 프로토콜이라기 보다는 인터넷 네임체계를 규정하는 거대한 시스템
www.google.com
: 사람은 문자형태로 입력192.168.0.1
: 컴퓨터가 알아볼 수 있는 형태- DNS : 사람과 컴퓨터가 알아볼 수 있는 형태로 변환해주는 체계
- DNS 는 프로토콜이라기 보다는 인터넷 네임체계를 규정하는 거대한 시스템
- 과정
- User -> DNS Client PC WebServer
- User : 네임 입력
- User DNS -> Client PC WebServer
- DNS 역할
- DNS : 네임 요청처리
- DNS : 주소 변환
- User DNS Client PC -> WebServer
- Client PC : 자원요청
- WebServer : 요청처리
- User DNS Client PC <- WebServer
- WebServer : 응답생성
- Client PC : 응답처리
- User : 자원접근
- User -> DNS Client PC WebServer
- 기능
- 네임 공간 정의 (네임구조)
- 계층구조 예시 :
www.google.com
(계층구조)com
: 최상위 도메인 (TLDs) 공간google
: 2단계 도메인
- 루트서버 (전 세계 13개정도가 있음)
- 도메인에 대한 정보를 가지고 있지 않음
- 자신의 권한을 다른 서버들에게 위임, 서버만 참조
.com
: TLDs.google
: 2단계 도메인.naver
: 2단계 도메인blog
: 하위도메인cafe
: 하위도메인mail
: 하위도메인
.edu
: TLDs.skku
: 2단계 도메인
.net
: TLDs.daum
: 2단계 도메인
- DNS 서버
- 도메인을 담당하는 호스트
- 저장되는 데이터
- 자원 레코드 (Resource Record, RR)
www.google.com = 192.168.xx.xx
- 마스터 파일 (Zone 파일)
- 도메인에 대한 정보를 가지고 있음
- RR(복수개) 들을 관리
- RR의 추가, 변경, 삭제
music.google.com = 192.168.xx.xx
- 자원 레코드 (Resource Record, RR)
- Zone : 도메인을 관리하는 단위 (영역)
- DNS 서버(네임서버) 하나가 책임이나 권한을 가지는 영역
- 도메인은 위임을 통해 관리가 가능한 단위로 분할 가능
- 자원 레코드 (Resource Record, RR)
- DNS 서버는 모든 데이터를 RR로 정의해서 저장
- 네임 (0~32)
- 도메인 혹은 Zone Name
-
유형(Type) (0~16) 클래스 (16~32) - 유형(Type)
-
유형값 문자코드 RR유형 -
1 A 주소 (IPv4) -
28 AAAA 주소 (IPv6) -
2 NS 네임서버 (이름) -
5 CNAME 정규네임 (Canonical) -
6 SoA 권한개시정보 (DNS Zone 정보) - 모든 Zone 은 하나의 SoA 레코드를 가지고 있음
-
12 PTR 포인터 (다른 위치를 가리킴, 역방향 변환 이용) -
15 MX 메일 교환 (도메인으로 들어오는 이메일 처리를 위한 장비 이름 명시) -
16 TXT 문자열
-
- 클래스
-
1 IN (Internet, 가장많이 사용) -
2 Unassigned (할당되지 않음) -
3 CH (Chaos) -
4 HS (Hesiod)
-
- 유형(Type)
- 유지시간 (0~32)
- 레코드를 읽은 장비가 캐시에 얼마동안 정보를 유지해야 하는지 명시
- 데이터 길이 (0~32)
- 자원에 대한 데이터 크기
- 데이터 (0~32)
- 실제 데이터
이름 : www.google.com 유형 : 1 TTL (Time To Live) : Size : 호스트 : 192.168.170.10 ...
- 실제 데이터
- 네임 (0~32)
- DNS 서버는 모든 데이터를 RR로 정의해서 저장
- DNS 서버
- Master
- Slave
- DNS 메시지 구조
- 사용자가 DNS 서버에 질의했을 때 받는 메시지
- Header (12 Bytes)
- 메시지 유형 설명
- Question (가변)
- 질의 정보
- Answer (가변)
- 질문에 대한 답변 RR
- Authority (가변)
- 권한 네임서버를 가리키는 하나 이상의 RR 포함
- Additional (가변)
- 질의와 관련된 부가정보를 나타내는 하나 이상의 RR
- Header (12 Bytes)
- 사용자가 DNS 서버에 질의했을 때 받는 메시지
- 계층구조 예시 :
- 네임 등록
- IP 주소 (예:192.168.0.10) 에 웹서버를 구축한 경우
- 이름
www.abc.com
으로 접근시키기 위해서 네임 등록 abc.com
도메인 공간 안에서는 마음대로 등록 가능cafe.abc.com
blog.abc.com
- …
- 이름
- IP 주소 (예:192.168.0.10) 에 웹서버를 구축한 경우
- 네임 변환
- 사용자가
www.abc.com
으로 접근했을 경우- IP 주소 192.168.0.10 으로 변환시켜줌
- DNS 네임 변환 과정
- DNS => Client / Server 가 존재
- 주소 => 이름
- 이름 => 주소
- Resolver (변환기) : 네임서버에 질의를 수행하는 SW / 모듈
- 반복적 해석 (변환) : Iterative Query
- Authoritative 서버에 질의할 경우
- User -> 루트 NS .Com 담당 NS google 담당 NS
- google.com 변환 요청
- User <- 루트 NS .Com 담당 NS google 담당 NS
- com 담당 네임서버 주소
- User -> .Com 담당 NS google 담당 NS
- google.com 변환 요청
- User <- .Com 담당 NS google 담당 NS
- google.com 담당 NS 주소
- User -> google 담당 NS
- google.com 변환 요청
- User <- google 담당 NS
- google.com IP 주소
- 재귀적 해석 (변환) : Recursive Query
- Recursive 서버에 질의할 경우
- 중간 과정의 네임서버들이 모두 재귀적 변환을 허용해야 함
- 실제로는 그렇지 않음.
- User -> 루트 NS .Com 담당 NS google 담당 NS
- google.com 변환 요청
- User 루트 NS -> .Com 담당 NS google 담당 NS
- google.com 변환 요청
- User 루트 NS .Com 담당 NS -> google 담당 NS
- google.com 변환 요청
- User 루트 NS .Com 담당 NS <- google 담당 NS
- google.com IP 주소
- User 루트 NS <- .Com 담당 NS google 담당 NS
- google.com IP 주소
- User <- 루트 NS .Com 담당 NS google 담당 NS
- google.com IP 주소
- 일반적인 DNS 네임 변환 과정
- 반복적(Iterative) 변환과 재귀적(Recursive) 변환을 함께 사용함
- DNS 서버의 종류
- Recursive DNS Server : 조건이 만족될 때까지 반복적으로 처리
- Authoritative DNS Server (권한서버)
- Root Server, .Com NS, google NS 등 특정 도메인 영역 (Zone) 과 권한을 가지고 있는 서버
- Cache : 캐시에 저장된 정보를 제공
- ISP 업체 (KT, SKT … ) 가 제공하는 서버
- Recursive Query 순서
-
- DNS Cache 검색
- 자신에게 도메인 정보가 없을 시 DB를 검색하거나 타 서버에 요청해야 하나 시간이 오래 걸림
- 캐시로 저장
- 속도는 빠르나 잘못된 정보를 매핑할 수 있음
- 양성 캐싱(positive caching) : 한 번 질의 된 도메인 네임과 해당 IP 주소를 캐시에 유지하여 같은 질의가 올 때 캐시에서 응답해 주는 것
- 음성 캐싱(negative caching) : 잘못된 도메인에 관한 요청을 캐싱하여 불필요한 트래픽과 지연을 줄이는 역할
- DNS Cache 검색
-
- hosts 파일 검색
- host 명 : IP 주소 정보를 담고 있는 파일
/etc/hosts
(리눅스) /hosts.ics
(Internet Connection Sharing 기능 - 윈도우)
- 파밍사이트 접속유도를 위해 공격자가 목표로 하는 파일
- 변조 위험성이 큼
- hosts 파일 검색
-
- DNS 서버 질의
- Recursive DNS Server
- Authoritative DNS Server
- DNS 서버 질의
-
- 일반적인 과정
- 재귀적 질의
- 사용자가 브라우저에 URL 입력 :
comps.googleex.edu
- Resolver : 사용자 DNS 클라이언트 소프트웨어
- PC 내 Resolver 가 PC 내 Cache 확인
- Resolver 가 로컬네임서버에 (Recursive DNS Server) 재귀적 질의
- 로컬네임서버가 Cache 확인
- 사용자가 브라우저에 URL 입력 :
- 반복적 질의
- 로컬네임서버가 루트서버에 질의
- 루트서버가 .edu 네임서버 주소를 전달
- 로컬네임서버가 .edu 네임서버에 질의
- .edu 네임서버가 .googleex 네임서버 주소를 전달
- 로컬네임서버가 .googleex 네임서버에 질의
- .googleex 네임서버가 comps.googleex.edu 네임서버 주소를 전달
- 로컬네임서버가 comps.googleex.edu 네임서버에 질의
- comps.googleex.edu IP 주소를 전달
- 재귀적 질의
- 로컬네임서버가 Cache 갱신
- 로컬네임서버가 Resolver 에게 IP 전달
- Resolver 가 Cache 갱신
- Resolver 가 사용자에게 IP 주소를 전달
- 사용자 브라우저가 IP 주소로 HTTP 요청
- 재귀적 질의
- DNS => Client / Server 가 존재
- 사용자가
- 네임 공간 정의 (네임구조)
리눅스 네임서버 설정파일
/etc/resolv.conf
: 기본 네임 서버 설정정보- resolver : 질의 변환기, 재귀적 질의
cat /etc/resolv.conf
domain localdomain search localdomain nameserver 192.168.172.1 // 기본 네임서버 주소
/etc/hosts
: 도메인/호스트명과 IP주소 매핑 정보- hosts 파일은 대부분의 운영체제에 존재한다.
cat /etc/hosts
192.168.10.100 www.abc.com ...
/etc/host.conf
: DNS 질의 순서를 지정cat /etc/host.conf
order hosts, bind // hosts 파일에 먼저 질의하고, bind(nameserver) 에 질의
DNS 패킷 분석
- 개요
- DNS Message 는 Query 패킷, Response 패킷이 있다.
- DNS Message 구조는 아래와 같다.
- Header
- ID : 패킷 식별자 (요청-응답 쌍)
-
QR OPcode AA TC RD RA Z RCODE : Flag - QR (Query/Response)
- DNS 메세지가
DNS 질의(0)
,DNS 응답(1)
인지를 구분
- DNS 메세지가
- Op code (Operation code) : 4 비트
- 0 :
표준 질의
또는표준 질의에 대한 응답
- 1 : 역 질의 (Inverse Query)
- 2 : 서버의 상태 요구
- 4 : 통지
- 5 : 갱신
- 0 :
- AA (Authoritative Answer, 책임 플래그)
- DNS 응답 메세지에 만 사용됨
- 1 : 네임서버 권한이 인정된 서버일 때
- TC (Truncated)
- 512 바이트 초과 여부
- 1 : 응답메세지가 512 바이트 이상이라서 512로 짤리어짐
- 이 경우에 클라이언트는 TCP 포트를 통해 질의를 재전송하게 됨
- RD (Recursion Desired, 재귀 요구 플래그)
- 1 : 클라이언트가 재귀 질의를 원함
- 질의메세지에서 지정되며, 응답메세지에서 이를 반복함
- 재귀질의가 요청되지 않으면, 반복질의로 간주하게됨
- 1 : 클라이언트가 재귀 질의를 원함
- RA (Recursion Available, 재귀 유효 플래그)
- 네임서버가 재귀 질의가 이용 가능한지를 나타냄
- 예약 (Reserved) : 통상 000 으로 셋팅
- rCode (response code, 응답/오류 코드)
- 0 => No Error, 1 => Format Error(질의를 이해할 수 없음), 2 => ServFail(Server Failure), 3 => 도메인네임 존재 않음 등
- QR (Query/Response)
- QDCOUNT (질의 카운트)
- 질의의 수
- ANCOUNT (응답 카운트)
- 응답 RR(Resource Record)의 수
- NSCOUNT (네임서버 카운트)
- 책임 RR(Resource Record)의 수
- ARCOUNT (추가정보 카운트)
- 추가 RR(Resource Reocrd)의 수
- Question
- Answer
- Authority
- Additional
- Header
- DNS 는 일반적으로 UDP 53번 포트를 사용 (512 Bytes 미만 패킷)
- DNS 는 TCP 53번 포트로도 사용 가능 (512 Bytes 이상 패킷)
- Zone Transfer (Zone 전달)
- Master 서버에서 Slave 서버에 Zonefile(Masterfile) 전달
- 주기적 전달
- 신뢰할 수 있는 연결 필요
- Master 서버에서 Slave 서버에 Zonefile(Masterfile) 전달
- 큰 DNS 쿼리를 보낼 때 이용
- UDP 패킷으로 질의 (query) 했으나 응답패킷 (Response) 이 512Bytes 를 초과할 경우 Response 가 Truncated 되고 TCP 로 요청하라는 메시지 전송
- Zone Transfer (Zone 전달)
DNS 관련 명령어
- DNS Cache 조회
- 윈도우
ipconfig /displaydns
: DNS 캐시 정보 조회- DNS 스푸핑 등 확인
ipconfig /flushdns
: DNS 캐시 정보 초기화- 결과메시지 :
successfully flushed the DNS Resolver Cache
- 결과메시지 :
- 윈도우
- DNS 조회
- 윈도우
nslookup
: DNS 진단 유틸리티, 네임서버 검색, 대화형모드nslookup [호스트(도메인 이름/IP주소)] ([네임서버])
: 질의형- 정방향조회 (Forward DNS Lookup) : 도메인 -> IP
- 역방향조회 (Reverse DNS Lookup) : IP -> 도메인
- 리눅스 / 유닉스
dig
: Domain Information Groper : nslookup 과 기능 유사하나 더 다양한 정보를 획득dig ([@네임서버]) [도메인] ([쿼리유형]) ([쿼리옵션])
- 쿼리유형
A
: 도메인 IP 주소 질의
- 쿼리옵션
+norecurse
: Authoritative NS 에 반복적 질의 수행, 정상 응답이 되는지 여부를 체크dig @ns.test.com www.daum.net +norecurse
+tcp
: 53/tcp 포트를 허용하는지 체크+trace
: 계층 구조의 쿼리 (Root -> .com -> …) 위임의 상태를 추적dig @ns.test.com www.daum.net +trace
- 쿼리유형
whois
: whois 서버를 활용, 도메인 등록정보(소유정보) 확인whois www.test.com
- 등록인, 주소, 변경일, IP 주소 (ISP 주소), 네트워크 할당정보 등…
host 호스트 [서버]
: nslookup 과 유사
- 윈도우
DNS 스푸핑
- 개요
- 공격대상자에게 전달되는 DNS 응답을 위조
- DNS서버에 위조된 IP 주소를 지정
- 피해자가 의도하지 않은 주소로 접속하게 하는 공격 기법
- DNS 프로토콜은 Query/Response 를 UDP 프로토콜을 사용하여 주고받음
- UDP : 비연결성에서 생기는 취약점 이용
- Transaction ID 값이 일치하면 응답을 신뢰하게 됨
- 나중에 도착한 값은 폐기됨
- UDP : 비연결성에서 생기는 취약점 이용
- 방식
- 스니핑을 이용한 스푸핑 공격
- 희생자에게 전달되는 DNS 응답 위조
- DNS 캐시 포이즈닝
- DNS 서버의 캐시정보 조작
- 스니핑을 이용한 스푸핑 공격
- DNS 스푸핑 과정
- Client -> (Attacker) -> Name Server : Attacker 는 중간에서 Snipping
- Transaction ID : 1000
- Src Port : 4500
- Q : www.test.com
- A :
- Client <- Attacker Name Server : Attacker 가 Spoofing 응답값 전달
- 먼저 수신된 DNS 응답을 신뢰
- Transaction ID : 1000
- Dst Port : 4500
- Q : www.test.com
- A : 위조된 IP
- Client <- (Attacker) <- Name Server : 정상응답은 폐기됨
- Transaction ID : 1000
- Dst Port : 4500
- Q : www.test.com
- A : xxx.xxx.xxx.xxx
- Client -> (Attacker) -> Name Server : Attacker 는 중간에서 Snipping
- DNS 스푸핑 대응책
- 스니핑을 탐지, 차단
- DNS 서버 질의 전 우선순위가 높은 hosts 에 중요한 IP 주소를 등록관리
- DNS 캐시 포이즈닝 과정
- Attacker -> Recursive Server
- 여러 개의 질의를 한꺼번에 보냄
www.test.com
질의- Recursive Server 는 Authoritative 서버에 여러 번 질의 (반복적 질의에 시간 소요됨)
- 여러 개의 질의를 한꺼번에 보냄
- Attacker -> Recursive Server
- 여러 개의 응답을 한꺼번에 보냄
www.test.com
응답- Transaction ID 무작위 입력
- Dst Port 무작위 입력
- IP 주소 조작
- Recursive Server 가 Authoritative 서버에 응답을 받기 전에 Transaction ID 와 Dst Port 가 일치하는 응답값을 전송
- 뒤에 도착하는 실제 응답은 폐기됨
- TTL 지속 시간동안 조작된 IP 로 응답하게 됨
- 여러 개의 응답을 한꺼번에 보냄
- Attacker -> Recursive Server
Primary(Master) / Secondary(Slave) 네임 서버의 이해
- 주서버(Master) : 1차 네임서버
- 원본 존 데이터를 관리하는 서버
- 보조서버(Slave) : 2차 네임서버
- 마스터서버에 있는 존 데이터를 복사하여 가지고 있음
- Master 와 동일한 기능을 함
- 부하 분산을 통해 안정성을 높임
- 마스터 장애시 대신 역할을 수행
- 구조
- Master NS <-> Slave NS
- Zone transfer : TCP 53
- Master 서버와 Slave 서버 간 ZoneData 동기화
- Zone File(MasterFile)
- Reverse Zone File
- Master 서버와 Slave 서버 간 ZoneData 동기화
- Zone transfer : TCP 53
- Master NS <-> Slave NS
Recursive Query의 제한 방법
- 필요성
- 대량의 재귀적 질의 요청이 발생하면 DoS 형태의 공격으로 악용될 수 있음
- DNS Cache Poisoning 공격
- 사내 DNS 서버의 경우 재귀적 질의 접근제어 설정이 필요
- 설정파일 :
/etc/named.conf
- 설정파일 :
/etc/named.conf
acl "mynetwork" { 192.168.0.0/24;}; options { listen-on port 53 {127.0.0.1; 192.168.0.254;}; directory "/var/named"; allow-query {mynetwork;}; allow-recursion {none;}; // 재귀적 질의 제한 설정 allow-recursion {127.0.0.1; 192.168.170.10/30;}; // 재귀적 질의 제한 설정 recursion no; // // 재귀적 질의 제한 설정 // allow-transfer {any;}; // 존전송 제한 설정 allow-transfer {none;}; // 존전송 제한 설정 //forwarders {0.0.0.0;}; };
댓글남기기