NTFS
목차
파일시스템 역사[편집]
NTFS(New Technology File System)는 Microsoft에서 설계한 파일시스템으로, 1993년 Windows NT 운영체제에 처음 사용된 이후 Windows 2000, XP, 7 등을 거쳐 현재 Windows 8까지 많은 운영체제에 사용되고 있다. 아래 [표 4-1]는 NTFS 버전에 따른 운영체제를 나타낸다.
버전(Version) | 운영체제(OS) |
---|---|
1.0 | Windows NT 3.1 |
1.1 | Windows NT 3.5 |
1.2 | Windows NT 3.51 |
3.0 | Windows 2000 |
3.1 | Windows XP, 2003, Vista, 2008, 7, 8 |
2001년 Windows XP에서 NTFS 3.1버전을 처음 선보였으며 2013년 현재 Windows 8 운영체제에 이르기까지 동일한 버전의 NTFS를 사용하고 있다. 본 위키는 가장 널리 사용되는 NTFS 3.1을 기준으로 작성되었다.
파일시스템의 특징[편집]
NTFS는 기존 FAT 파일시스템의 한계를 개선하여 신뢰성, 보안, 대용량 장치 지원을 위해 개발되었으며, 특정 내용으로 구조체를 감싸는 포괄적인 데이터 구조체(Wrapper)를 사용하여 확장성을 제공한다. 하지만 뛰어난 기능을 제공하고 있는 만큼 복잡한 특성을 가지고 있다.
NTFS의 특징[편집]
- USN Journal(Update Sequence Number Journal or Change Journal)
- - NTFS의 모든 파일 및 디렉터리의 변경 사항을 기록하는 로그 파일로 파일이름 변경시간, 변경 타입 등 변경 사항에 대한 정보를 목록화하여 볼륨의 변경 여부를 확인할 때 사용한다.
- ADS(Alternate Data Stream)
- - NTFS는 파일명, 소유자, 시간정보 등을 ‘속성(Attribute)’이라는 스트림을 통해 표현하며, 데이터 역시 하나의 스트림으로 표현된다. 일반적으로 파일 당 하나의 데이터 스트림을 사용하나, ADS는 하나의 파일이 하나 이상의 데이터를 저장할 수 있도록 지원하는 것이다.
- - 예를 들어, “filename:testname”과 같이 원본 파일 이름(filename)에 콜론(:)을 붙여 “testname”이란 이름을 가진 데이터 스트림을 추가할 수 있다. 이는 윈도우 탐색기를 통해 확인할 수 없으므로, 정보 은닉 용도로도 사용된다.
- Sparse 파일
- - Sparse 파일은 파일의 데이터가 대부분 0으로 채워져 있는 경우, 해당 파일의 내용을 그대로 저장하지 않고, 크기 정보만을 담는 파일을 말한다.
- - 예를 들어, 1MB의 파일에 처음 4KB를 제외한 나머지가 0으로 채워진 경우 이를 모두 디스크에 저장하는 것은 비효율적이므로, 크기 정보만을 저장하여 저장장치의 효율을 높여준다.
- 파일 압축
- - NTFS는 파일시스템 수준의 압축을 지원하며, 압축방식으로는 LZ77을 사용한다. 파일 압축은 공간을 절약하는데 많은 도움을 주지만, 파일이나 디렉터리에 접근할 때마다 압축을 풀어야 하므로, 성능이 저하된다.
- - 이 기능은 다음 [그림 4-1] 고급 특성과 같이 파일 및 디렉터리 속성의 ‘고급특성’에서 설정할 수 있다.
- EFS(Encrypting File System)
- - EFS는 NTFS 상의 파일 및 디렉터리를 암호화하는 기능으로 CryptoAPI와 File System Run-Time Library(FSRTL)를 사용했으며, 빠른 암호화/복호화를 위해 FEK(File Encryption Key)를 통한 대칭키 방식으로 암호화한다.
- - 파일 압축 기능과 마찬가지로 ‘고급특성’을 통해 설정할 수 있다.
- VSS(Volume Shadow Copy Service)
- - 새롭게 덮여 쓰인 파일 및 디렉터리에 대해 백업 본을 유지하는 기능이다. 이는 시스템 재부팅 과정에서 시스템의 저널 정보와 함께 안전한 복구를 도와준다.
- Quotas
- - 다중 사용자를 지원하는 환경에서 각 사용자의 디스크 사용량을 제한하는 기능이다. 만약 쿼터 기능이 설정된 시스템에서 자신에게 할당된 이상의 공간을 사용할 경우 경고메시지를 받게 된다.
- 유니코드 지원
- - NTFS는 모든 파일, 디렉터리, 볼륨 이름 등을 지정할 때 유니코드를 사용한다.
- 동적 배드 클러스터 재할당
- - 배드 섹터가 발생한 클러스터는 사용할 수 없으므로, 새로운 클러스터를 할당해 정상 데이터를 자동으로 재할당한 클러스터에 복사하는 기법이다. 이후 배드 섹터가 발생한 클러스터는 플래그를 통해 더 이상 사용되지 않도록 관리된다.
구조분석[편집]
부트 레코드(Boot Record)는 NTFS 파일시스템의 여러 설정 값들이 저장되어 있는 영역으로 VBR(Volume Boot Record)이라고도 한다. 이 영역에서 부트 코드, 섹터 당 바이트 수, 클러스터 당 섹터 수, 볼륨의 크기, 클러스터의 크기, MFT의 시작 클러스터 주소, MFT Entry의 사이즈 등과 같은 중요 정보들을 얻을 수 있다. 또한, 부트 레코드는 고정된 크기를 가지지 않고, 클러스터 크기에 따라 변동된다.
아래 표는 부트 레코드 항목들에 대한 세부내용을 보여준다.
범위 | 이름 | 설명 |
---|---|---|
0x00~0x02 | Jump Boot Record | 부트코드로 점프하라는 명령어이다. |
0x03~0x0A | OEM Name | OEM 회사를 나타내는 문자열로, Windows의 경우 “NTFS”라고 표시된다. |
0x0B~0x0C | Bytes Per Sector | 섹터 당 바이트 수를 나타낸다. 한 섹터가 몇 바이트를 담고 있는지에 대한 항목으로, 보통 512를 갖는다. |
0x0D | Sector Per Cluster | 클러스터 당 섹터 수를 나타낸다. 반드시 0보다 큰 2의 배수이어야 하며, 보통 8을 갖는다.
※ Bytes Per Sector와 Sector Per Cluster를 종합하여 클러스터의 크기를 측정할 수 있다.(Bytes Per Sector × Sector Per Cluster = 클러스터의 크기) |
0x0E~0x0F | Reserved Sector Count | 예약된 영역의 개수를 나타낸다. 하지만 NTFS는 예약된 영역이 존재하지 않으므로, 반드시 0을 갖는다. |
0x10~0x14 | Unused | 실제로는 사용하지 않는 항목들이나, FAT 파일시스템의 부트 레코드와 형태를 맞추기 위해 존재한다.
※ 다음 Unused 영역 : 0x16~0x27, 0x41~0x43, 0x45~0x47, 0x50~0x53) |
0x15 | Media | 볼륨이 어떤 미디어에 저장되어 있는지를 나타낸다. 보통 고정식 디스크 값인 “0xF8”로 표시한다.
※ 그밖에는 플로피 디스크를 나타낸다. |
메타데이터[편집]
메타 데이터 파일(Meta Data File)이란 NTFS가 볼륨을 관리하기 위해서 사용하는 시스템 파일을 말한다. NTFS는 일반적인 파일시스템들처럼 볼륨을 관리하는 데이터들을 따로 영역을 두고 있지 않고, 파일형태로 관리한다. 때문에 NTFS는 확장성이 좋고, 정해진 볼륨의 형태가 없는 것이 특징이다.
파일 추출 기법[편집]
$MFT에는 볼륨에 존재하는 모든 파일과 디렉터리에 대한 정보를 담고 있는 테이블이다. $MFT에 접근하기 위해서는 섹터의 크기, 클러스터의 크기, $MFT의 시작 Offset을 알면 접근 할 수 있다. $MFT는 다수의 MFT Entry로 구성되어 있다. $MFT Entry의 내부 속성들은 가변적인 속성을 가지고 있으며 속성 헤더 다음 속성 내용이 따라온다. 아래 그림은 Resident 속성의 TestFile.txt의 MFT Entry이다. Resident 속성은 MFT Entry 내부에 파일 데이터도 포함이 되어있기 때문에 파일이름과 그에 대한 데이터를 추출 할 수 있다. Non-Resident 속성인 경우에는 Runlist를 통해 파일을 복구 할 수 있다.
데이터 복구[편집]
NTFS에서는 파일의 메타정보를 유지하기 위해 MFT Entry, MFT Entry의 할당상태를 표시하기 위한 $MFT(MFT Entry 0) 파일의 $BITMAP 속성, 클러스터의 할당 상태를 표시하기 위한 $Bitmap(MFT Entry 6) 파일의 $DATA 속성을 사용한다. 파일이 삭제될 경우 $MFT 파일의 $BITMAP 속성에서 해당 파일이 사용했던 MFT Entry 비트가 0으로 설정되고 $Bitmap 파일의 $DATA 속성에서 해당 파일에 할당되었던 클러스터 비트가 0으로 설정된다. 결국 파일의 MFT Entry와 실제 파일에 할당되었던 클러스터의 내용은 변경되지 않는다. 따라서 해당 파일의 MFT Entry와 할당되었던 클러스터 내용이 새로운 파일의 정보로 덮여 쓰이지 않았다면 비교적 쉽게 파일을 복구할 수 있다. NTFS에서는 FAT 파일시스템과 다르게 파일의 내용이 Resident 속성일 경우 MFT Entry 상에 저장되므로 완벽하게 복구할 수 있다. 또한 Non-resident 속성의 경우에도 Cluster Runs 정보를 통해 완벽하게 복구할 수 있다.
아래 그림은 NTFS 파일시스템에서 “\dir\file1.dat" 파일이 삭제된 후 파일을 복구하는 과정을 보여준다.
VBR의 BPB[1]
정보에 MFT 시작위치 정보를 얻어 MFT 시작위치로 이동한다. $MFT 파일의 $BITMAP 속성에서 현재 사용 중이지 않은 MFT Entry(0x00 값을 갖는) 정보를 얻어온다.
$MFT 파일의 $DATA 속성에서 0x00 값을 갖는 MFT Entry를 대상으로 $FILE_NAME 속성의 파일 이름이 “file1.dat"를 가지는 MFT Entry를 찾는다. 그 결과 MFT Entry 301번이 해당 파일의 MFT Entry 임이 확인되었다.
MFT Entry 301번의 $FILE_NAME 속성에서 파일 크기를 확인한다. 그리고 $DATA 속성을 확인한 결과 Non-resident 속성임이 확인되었다. 따라서 Cluster Runs 정보를 기반으로 파일 크기만큼 데이터를 획득한다. 획득한 데이터를 저장할 위치에 앞서 확인한 파일 이름으로 파일을 저장한다.
로그 & 저널 분석[편집]
USN저널은 NTFS의 메타데이터를 구성하는 파일이다. $UsnJnrl이라는 이름으로 존재하며 파일시스템의 모든 파일 및 디렉터리의 변경 사항을 기록하는 로그이다. USN 저널 파일은 빈 파일로 생성된 후 NTFS의 볼륨에 변경이 생길 때 마다 미리 정의된 레코드 형식으로 변경사항을 기록하고 저널 파일에 추가한다.
은폐 대응[편집]
NTFS 파일시스템에서는 확장자 변경, 숨김 파일 속성을 이용하거나 낭비되는 영역 등에 정보를 은닉할 수 있다.