포렌식/파일시스템 (파일시스템 포렌식분석)

다중 디스크 봄륨 - 디스크 스패닝

Pikigod 2020. 2. 10. 18:54

7.2 디스크 스패닝 (Disk Spanning)

-> 디스크 스패닝은 여러 디스크를 하나의 큰 디스크로 보여주도록 한다. 많은 소프트웨어 RAID 솔루션들은 디스크 스패닝도 제공하기 때문에 디스크 스패닝을 RAID와 제공했지만 디스크스패닝은 중복성이나 성능향상 같은 이점은 없다.

주로 대용량 시스템을 만드는데 사용하고 일부 버전들의 디스크추가, 용량을 동적으로 늘리기 가능하다.

 

많은 운영체제에서 디스크 스패닝을 제공하고 있지만 여기서는 윈도우와 리눅스 위주로 살펴보자.

 

 

▶ 개요

-> 디스크스패닝의 주요이론은 일반 노트 대신 메모들을 수집하기 위해 여러개의 링바인더를 사용하는 것과 같다.

(하나가 다 차면 새로운것을 사는것이 아닌, 추가적으로 메모만 끼워넣는 개념이다.)

디스크스패닝도 마찬가지로 새로운 디스크 저장공간을 기존 저장공간 끝에 추가할 수 있다.

 

-> 다음은 디스크스패닝을 사용하는 100개의 데이터를 저장할 수 있는 두 디스크의 예

 

 

※ 논리적볼륨(Logical Volume)은 디스크스패닝의 결과이다. 

-> 여러개의 물리적 디스크 그룹을 새로운 논리적 볼륨으로 결합한다. 디스크스패닝을 하면 논리적 볼륨이 생성된다.

 

 

▶ 리눅스 MD

-> 리눅스 디스크스패닝은 2가지 방법이 있다.

1. MD드라이버는 기본스패닝을 수행한다.

2. LVM(Logical Volume Manager)은 더욱 개선된 시스템이다.

두 시스템 모두 주요 리눅스 배포판에 존재한다.

 

▷ 배경

-> MD드라이버는 도스기반 파티션이고 RAID나 디스크스패닝 볼륨으로 조합해서 그것들을 모두 그룹으로 만든다.

RAID나 논리적 볼륨에서는 위 그룹으로 만든 디스크들을 사용한다. 거기에 할당된 목록을 정리한 설정파일 /etc/raidtab이 존재한다. 이 설정파일 없이는 마운트 할 수 없다.

디스크스패닝을 위해 설정파일을 'raid-level'을 'linear'로 바꾸는 것 외에는 RAID와 동일하다.

linear로 바꿔주자

- 커널은 이 설정파일을 읽고 /dev/md0를 생성한다. 하나의 단일볼륨으로 사용하지만 실제는 /dev/dhb1와 /dev/hdd2를 결합한 것이다.

- '영구적인' 슈퍼블록(Persistent-Superblock) 값을 0으로 설정하면 설정데이터는 오직 /etc/raidtab안에 존재하지만 값을 1로 설정하면 디스크나 파티션은 리눅스의 '자동-감지' 기능이 자동으로 MD를 설정할 수 있도록 설정데이터를 그 끝에 포함한다.

- 이 '자동-감지'를 위해 설정파일이 위치한 도스 파티션은 단드시 '0xfd' 파티션 타입을 갖춰야만 한다.

- 부팅하는 동안 관련장치를 생성했는지는 /var/log/messages 로그파일에 있다. 자동-감지 과정은 'md' 커널 모듈을 로드했을때 동작한다.

 

- 디스크나 파티션이 '영구적인' 슈퍼블록을 포함하면 여러구역으로 나눠진 1024바이트 구조를 갖는다.

영구적인 슈퍼블록이 설정된 디스크

- 리눅스 시스템은 부팅시 그 볼륨을 마운트하지 않아도 슈퍼블록에 그 값을 업데이트한다. (슈퍼블록을 이용해서 디스크의 제거여부, 순서여부 확인이 가능하다)

 

 

▷ 수집과 분석

- MD 볼륨의 데이터 분석을 위한 최선의 선택은 '단일 드라이브', '파티션'으로 볼륨을 수집(이전에는 RAID볼륨을 얻어야했다.)고, 표준분석도구를 이용하는 것이다. 볼륨에 '영구적인 슈퍼블록'이 있다면 쉽겠지만 그렇지 않으면 /etc/raidtab을 생성하고 분석 대상 시스템에서 /etc/raidtab을 기반으로 해야한다.

 

- 설정파일 생성후 'raidstart'명령으로 MD파일을 생성해야한다. 설정에 따라 /dev/디렉토리에 장치를 만든 후 dd같은 명령으로 수집 가능하다. 이후 MD장치 정리를 위해 'raidstop'을 실행한다. 디스크 백업 이미지를 가지는지 확인해야 하고 수집시에 ATA, SCSI 쓰기 방지 장치를 사용해야 한다. 

- 볼륨 내 각각 도스파티션 타입이 0xfd이고, 영구적인 슈퍼블록이 존재하면 시스템을 자동-감지 MD장치로 설정하자. 이후 'raidstart'하면 자동으로 설정파일이 정리된다.

 

- 한 시스템 내 디스크를 다른 위치로 옮기면 슈퍼블륵을 덮어쓰게 된다. 그래서 이는 MD생성에 오류가 될 수 있다.

 

- MD디스크를 다룰때 Raidtab 파일을 지우는 습관을 들이자 왜냐하면 지우지 않고 다른 MD디스크를 다루게 되면 다른 디스크도 볼륨으로 인식하는 상황이 발생할 수 있다.

 

- 디스크를 수집할 대 위치와 같은 정보들은 문서화를 잘 시켜서 위치가 수정되더라도 문제가 생기지 않게 해야한다.

 

 

▶ 리눅스 LVM 

-> 디스크 스패닝 두 번째 방법

 

▷ 배경

- LVM은 MD보다 더 개선된 구조이다. 그리고 '볼륨그룹'이라는 디스크 그룹 개념을 사용한다. LVM을 사용하는 도스파티션은 0x8e 파티션 타입을 갖는다. 각 시스템에는 1개 또는 그 이상의 볼륨그룹이 존재하고 각 그룹은 /dev/ 디렉토리에 하위 디렉토리를 갖는다.

- 논리적 볼륨은 물리적 확장과 같은 크기를 가지는 논리적 확장으로 만들어지고, 각각의 논리적 확장과 물리적 확장 사이를 매핑한다.

 

물리적 확장과 논리적 확장을 맵핑해 논리적 볼륨에 LVM구성

-> 3개의 물리적확장 세트가 논리적 볼륨을 생성한다. (물리적 디스크를 연속적으로 붙일수도 있지만 스트라이핑도 가능)

 

- 논리적 볼륨을 위한 설정 데이터를 로컬시스템볼륨, 두곳에 저장한다.

LVM 설정파일은 바이너리 형식이고 '/etc/lvmtab''/etc/lvmtab.d'에 저장된다. 또한 'vgimport', 'vgscan', 'vgchange'와 같은 LVM유틸로 업데이트 된다.

-> 구조체 항목중에 시간을 가지는 항목이 없기 때문에 MD장치로 인해 논리적 볼륨 생성시 업데이트가 안된다. 

 

▷ 수집과 분석

- LVM 시스템 분석은 MD장치보다 더 자동화 할 수 있다. LVM은 시스템간에 디스크 이동시 vgexport와 vginport라는 유틸리티를 갖지만 디스크, 수집시에는 필요없다.

- vgexport 유틸리티는 볼륨을 위해 내부 설정파일을 제거하고 디스크 볼륨그룹에 '-EXPORT'라는 단어를 쓴다. 이는 분석 대상 시스템에서 디스크를 제거할 때 필요없다.

- LVM의 논리적 볼륨장치들을 검색하기 위해서 vgscan 명령어를 사용한다. 이러면 자동으로 /etc/lvmtab과 /etc/lvmtab.d에 설정파일들을 생성한다. 

- 설정 파일 생성후에 검색된 볼륨을 활성화하기 위해 vgchange -ay 명령어를 실행해야 한다. 이후 dd로 /dev/에 볼륨장치로부터 볼륨을 얻을 수 있다.

 

 

▶ 마이크로소프트 윈도우 LDM

-> 윈도우의 LDM의 구조와 수집기술을 설명하도록하자

 

▷ 동적디스크

- LDM은 기본파티션, RAID 0,1,5, 디스크스패닝과 유사한 볼륨들을 지원한다.

이 디스크들은 도스나 GPT 파티션 테이블들을 갖고 각 파티션이 자체적으로 포함되어있다. 논리적 볼륨을 구성하는 파티션을 만들기위해 동적디스크는 추가적인 데이터 구조체를 갖는다.

- 동적디스크에는 2개의 중요한 영역이 있다. LDM파티션 영역은 디스크의 대부분을 차지하고, 동적디스크가 생성된 곳에있다. 동적디스크의 마지막 1MB를 LDM데이터베이스에서 할당한다. 그 LDM 데이터베이스는 어떻게 파티션을 구성했는지. 어떻게 논리적 볼륨을 생성했는지 엔트리를 포함한다.

LDM 영역

- 윈도우는 한개의 디스크 그룹을 지원한다. 모든 동적 디스크들은 자동으로 그 그룹에 할당한다.

동적디스크는 동적 파티션으로 분할이 가능하고 한개 또는 한개이상의 디스크는 논리적 볼륨을 만들기 위해 그룹화 한다. 이것이 디스크 그룹인셈

 

 

-> 동적디스크와 동적파티션 용어를 조심하자! 둘다 논리적 볼륨이지만 의미가 다르다.

도스파티션의 확장 파티션을 이용하는 것 -> 논리적 볼륨 (주 확장 파티션, 부확장파티션)

동적디스크를 가지고 만든 모든 파티션, 테이블 -> 논리적 볼륨

 

 

▷ LDM 데이터베이스

-> 동적파티션 정의, 논리적 볼륨을 생성한 규칙을 만드는 곳 (마이크로소프트는 LDM데이터베이스 구조를 공개하지는 않았다.)

그러나 LDM을 4개의 구역으로 보자. 전용헤더, 목차, 데이터베이스, 트랜잭션 로그이다.

 

1. 전용헤더(Private Header) : 파일시스템의 '부트섹터'와 비슷하고 디스크와 논리적 볼륨의 고유한 특징을 설명한다.

이 구조체는 디스크를 위한 ID(윈도우의 GUID)와 디스크그룹 이름을 포함한다. -> 윈도우는 컴퓨터 이름의 기반이 되는 1개의 디스크 그룹만을 가진다.

 

2. 목차(Table of Contents) 구역 : 16섹터 크기이다. 

-> DB 레이아웃과 관련있는 정보를 포함한다.

 

3. 데이터베이스 구역 : 디스크, 파티션, 컴포넌트, 볼륨을 설명하는 엔트리를 갖는다.

디스크 엔트리 : 도스나 GPT 디스크가 있는 각 동적 디스크들을 위해 존재

파티션 엔트리 : 동적디스크 파티션 방법을 위해 사용

컴포넌트 엔트리 : 파티션의 결합방법을 설명하기 위해 사용. 각 파티션 엔트리들은 사용할 컴포넌트 엔트리를 가리키고있다.

볼륨 엔트리 : 파티션에 컴포넌트 유형을 적용한 결과인 논리적 볼륨을 표현한다.

 

 

※ 두 디스크를 이용한 예를 보도록 하자.

 

 

 

- 논리적 볼륨의 첫 부분은 디스크1에 15MB에 있고, 두번째 부분은 디스크2의 10MB에 있고 마지막 부분은 디스크1의 20MB에 있다. 마이크로소프트 dmdiag.exe 도구는 데이터베이스 내 엔트리들을 출력하고 실행결과는 다음과 같다.

 

위에 표시된 디스크들은 두개의 동적디스크를 나타내면서 ID는 0.1027, 0.1063이다.

 

 

 디스크그룹 엔트리가 있고 디스크그룹은 컴퓨터 이름과 해시로 지정된 것을 확인할 수 있다.

 

->위 두개의 Subdisk는 디스크1의 물리적 디스크 파티션 엔트리가 있다. 둘다 0.1107의 'plex' 값을 가지고있고, 그 값들은 논리적볼륨에 사용되는 컴포넌트 엔트리를 참고한다.

Disk1-01은 0섹터에서 시작하고 30720 섹터의 길이를 갖는다.

Disk1-02는 30720 섹터에서 시작하고 40960섹터의 길이를 갖는다.

 

 

-> Disk2-01은 섹터0에서 시작하고 20480 섹터의 길이를 가지고 Plex값도 0.1107을 가진다.

 

 

위 내용을 그림으로 표현하면 다음과 같다.

(LDM 데이터베이스 내 물리 디스크와 동적파티션 엔트리 사이의 관계)

 

 

-> 이 내용은 논리적 볼륨을 생성하기 위해서 어떻게 동적파티션을 결합시키는지 설명하는 디스크 스패닝 컴포넌트의 예이다.

 

 

-> 위의 assoc는 volume의 id를 나타내고 있었다. 이는 논리적 볼륨에 볼륨엔트리들을 나타낸다.

 

이 기록들은 다음 그림으로 정리할 수 있다.

 

LDM 데이터베이스 내 엔트리들 사이의 관계

 

4. LDM데이터베이스의 마지막 구역은 트랜잭션로그(transactional log)이고, LDM의 수정사항을 기록한 로그이다. 또한, 전원문제나 그 밖의 충돌에 대비해서 안전한 상태로 디스크를 유지하기위해 사용한다.

 

 

▷ 수집 및 분석

- 소프트웨어로 논리적 볼륨을 구성하면 분석이 어렵고, 읽기전용으로 볼륨을 재생성하는 것도 쉽지않다. 시스템분석은 논리적볼륨을 수집하고, 표준분석도구를 이용할 때 가장 쉽다. BUT 윈도우는 부팅시 디스크를 마운트하고 마운트된 파일시스템을 분석하는 것은 손상된 이미지를 얻을 수 있고, 수정이 되었을 수도 있다.

 

- 윈도우는 한번에 한 디스크 그룹을 이동시킬수 있다. 이제 여기서 이동시 OS는 LDM데이터베이스에 새로운 데이터를 쓴다. -> 데이터 변조가 될 수 있기 때문에 주의하자.

 

- 리눅스 커널은 기본 LDM디스크 스패닝은 없는데 재컴파일을 통해 지원이 가능하다. LDM지원시 리눅스는 DB를 읽고  각 동적 디스크에 물리적 파티션을 위해 하드디스크 장치를 생성한다. 예제의 두 디스크로 리눅스 부팅시 다음을 갖는다.

/dev/hdb1, /dev/hdb2, /dev/hdd1

이후 MD커널드라이브는 단일 장치 생성을 위해 레이아웃을 설명하는 /etc/raidtab 파일을 생성해야만 한다.

 

다음은 raidtab 파일 내용이다. 

raidtab 파일

 

'linear' RAID 볼륨의 경우 데이터묶음은 어떤 크기라도 반드시 존재한다. 

Encase와 ProDiscover는 윈도우 논리적 볼륨에서 각각의 이미지를 인식할 수 있고, 그것들을 한번에 결합이 가능하다. 만약 디스크스패닝만 사용하면 파티션들을 수동으로 추출가능하고, 디스크이미지에서 수동으로 파티션들을 인식할 수 있다. dmdiage.exe에서 레이아웃 세부사항을 볼 수 있지만 윈도우에서만 분석이 가능하다.

따라서 리눅스도구를 이용하자.

 

NTFS 그룹은 Idminfo도구를 개발했고 이 도구는 윈도우 LDM데이터베이스를 조사하고 --dump를 통해 세부내용을 출력한다. 

 

disk1.dd 세부내용 출력

 

이는 디스크2개에 파티션3개가 볼륨을 구성하는 것을 보여준다. Idminfo는 파티션에서 상대적 위치를 나타내므로 디스크에서의 위치는 따로 mml로 분석한 결과를 더해주어야 한다.

 

 

첫 파티션

#dd if=disk1.dd skip=63 count=30720 > span.dd

(span.dd 생성)

 

※ 두번재 파티션

#dd if=disk2.dd skip=63 count=20480 >>span.dd

(span.dd 추가)

 

 

※ 세번째 파티션 

#dd if=disk1.dd skip=30783 count=40960 >>span.dd

(span.dd 추가)

 

=> 일반 파일시스템 이미지처럼 Span.dd를 처리할 수 있다. 커널이 LDM을 지원하면 수동으로 하기전에 디스크들을 먼저 인식해보자.

 

 


p.s 오늘은 너무 길다. 진짜 시간 너무오래 걸린거 같다.

리눅스 - MD, LDM

윈도우 - LVM