[Digital Forensic] RAID & Disk Spanning

 

RAID & Disk Spanning


(1) RAID(Redundant Arrays of Inexpensive Disks)

  • 성능 향상을 위해 디스크 하나 대신 여러 개를 사용하는 중복 디스크 개념

  • 하드웨어 컨트롤러나 소프트웨어 드라이버가 여러 디스크들을 하나로 병합

  • 컴퓨터는 그 볼륨을 단일 디스크로 인식

 

예전에는 RAID가 고성능 서버 컴퓨터에서만 사용되었지만, 요즘은 일반 Desktop 컴퓨터에도 쓰이고 있다. 

 

RAID 기술에는 여러 레벨이 있고 각 레벨마다 신뢰성과 성능 향상 등의 정도가 다르다.

 

총 7가지 레벨이 있으며 그 레벨들에 대하여 알아보자.


(2) RAID 레벨

2-1. RAID 레벨 0

  • RAID Level 0은 스트라이핑 모드 (Striping Mode)라고도 함

  • 2개 이상의 디스크를 사용, 두 디스크에 데이터를 볼륨 묶음으로 교차하여 나열해 놓은 방식

  • 해당 레벨은 읽기/쓰기 성능에 향상을 제공하지만, 데이터가 나누어져 나열되어 있는 경우이기 때문에 하나의 디스크만 고장 나도 데이터를 복구할 수 없음

 

[그림 1] RAID Level 0

 

2-2. RAID 레벨 1

  • RAID Level 1은 미러링 모드 (Mirroring Mode)라고도 함

  • 동일한 디스크가 두 개 있는 것

  • 한쪽 디스크에 데이터를 입력할 때 다른 한쪽 디스크에도 동일한 데이터가 입력됨

  • 신뢰성에서는 선호되는 구조지만, 한 번 입력 시 두 번의 디스크 입력 퍼포먼스로 인해 성능 저하와 디스크 구성 비용이 2배로 들어 일반적으로 사용하지 않는 구조

 

[그림 2] RAID Level 1

 

2-3. RAID 레벨 2

  • RAID Level 0의 장점과 신뢰성을 향상시킨 구조

  • 패리티 코드를 사용, 디스크 고장 시 데이터를 복구할 수 없는 문제점을 해결

  • 패리티 코드 계산 시에 해밍 코드가 사용되며 패리티 디스크 개수는 (저장 디스크 개수 -1)

 

[그림 3] RAID Level 2

 

2-4. RAID 레벨 3

  • RAID Level 2를 개선시킨 구조

  • 패리티 코드를 포함하는 많은 디스크를 단 하나의 디스크를 사용하여 동일한 효과를 볼 수 있도록 함

  • 패리티 코드 계산은 XOR 연산을 통해 계산

 

[그림 4] RAID Level 3

 

2-5. RAID 레벨 4

  • 구조는 Level 3와 별반 다를 것 없음

  • 차이는 패리티 코드 계산에 있으며, Level 3 경우 바이트 단위로 패리티 코드를 계산

  • 그러나 Level 4는 미리 정해진 블록 단위로 패리티 코드 계산

 

[그림 5] RAID Level 4

 

2-6. RAID 레벨 5

  • Level 4의 단점을 개선한 구조

  • 각 데이터들의 변화가 많을 경우 패리티 비트 또한 변화해야 하기 때문에 빈번한 접근으로 인해 디스크에 부하 발생

  • 이를 방지하기 위해 패리티 비트 디스크를 따로 만드는 것이 아닌 데이터 디스크 내에 패리티 비트를 저장하는 방식 사용

 

[그림 6] RAID Level 5

 

2-7. RAID 레벨 6

  • 신뢰성에 기반을 둔 구조

  • Level 5의 경우 두 개의 디스크에서 동시에 오류 발생 시, 복구하지 못하는 단점이 있는데 이를 해당 레벨에서 패리티 디스크를 하나 더 추가하여 해결

  • 디스크 하나가 더 추가되었다보니 구현 시 추가 비용이 발생

  • 데이터 (A ~ E) Q가 레벨 6에서 추가된 패리티 코드

 

[그림 7] RAID Level 6

 

지금까지 알아 본 RAID 구조들은 표준 구조들이며 현재는 시스템 별로 다른 구조를 혼용하여 사용하고 있다.

 

RAID 볼륨을 생성하는 방법으로는 하드웨어 방식과 소프트웨어 방식으로 나뉘며, 두 가지를 알아보도록 하자.


(3) RAID 구성 방식

3-1. 하드웨어 방식

  • 해당 방식은 하드웨어 장비로 RAID를 구성하는 방식으로 두 가지 방식으로 나눌 수 있음

 

1) 독립된 컨트롤러 방식

  • 해당 방식은 독자적인 프로세서와 메모리, 입출력 장치 등을 갖고 있어 CPU 없이도 입출력이 가능하여 최적화된 성능 발휘 가능

  • 하지만 별도로 메인보드에 장착되는 이유로 인해 가격이 비쌈

  • 볼륨 부팅 등의 경우에서 일어나는 악의적 행위들에 대해 안정적이며, 독립적이어서 시스템이 고장 나도 영향을 받지 않음

 

2) 일반적인 디스크에 삽입하는 컨트롤러

  • 하나의 칩(Chip)에 모든 기능이 구현되어 있는 형태

  • 다른 하드웨어와 통합하여 사용할 수 있고, 기존 I/O 컨트롤러 등과도 교체가 가능

  • 가격은 비교적 독립된 컨트롤러 방식에서 사용하는 장치보다 저렴

  • 이 방식은 독립된 컨트롤러 방식과 얻어지는 성과물은 대부분 같지만, 기존 하드웨어에 장착되어 있는 방식이기 때문에 다른 시스템으로 이전하여 사용하기 어려움

 

[그림 8] 하드웨어 RAID 방식 기본 구조

 

 

3-2. 소프트웨어 방식

  • RAID 기능이 소프트웨어적으로 구현된 방식

  • 이 방식으로 RAID를 구현할 경우 사용자는 볼륨만을 확인 가능

  • 각 디스크에 직접 접근하기 위해 유닉스 수준의 저수준 장치를 이용해야만 함

  • RAID 기능을 지원하는 OS는 MS Windows NT, 2000, XP, Apple Mac OS X, Linux, Sun Solaris, HP-UX, IBM AIX 정도가 있음

  • CPU를 사용하기 때문에 하드웨어 RAID에 비해 많은 제약이 있고 성능이 효율적이지 못함

  • 하드웨어 방식과 마찬가지로 두 가지로 나뉨

 

1) 순수 소프트웨어 방식

  • 하드웨어 없이 소프트웨어로만 구현하는 방식으로 구현 비용 저렴

  • 그러나 RAID 기능이 OS에 로드되기 전인 부팅 시에 일어나는 악의적 행위나 여러 가지 에러에 대해 안전하지 못함

  • CPU를 사용하므로 해당 시스템 성능에 영향을 주며 시스템 에러나 고장으로 인해 얻어지는 결과물에 대한 무결성 보장 못함

 

2) 하이브리드 방식

  • 순수 소프트웨어 방식의 RAID 기능이 OS에 로드되기 전 안전하지 못한 점 해결을 위해 하드웨어와 혼합하여 구현한 방식

  • 실제 구현은 소프트웨어 방식이며, 도움을 주는 하드웨어는 메인보드에 설정된 RAID BIOS

  • 해당 방식은 결국 소프트웨어 방식이기 때문에 RAID 기능이 OS에 로드된 후 에러나 악의적 행위에 대한 안전 보장 못함

  • 다른 시스템으로의 이전이 쉽지 않음

  • 무결성 또한 보장 못함

 

[그림 10] 소프트웨어 방식 기본 구조


(4) RAID 포렌식

  • RAID 볼륨을 분석할 때에는 어떻게 이미징 해야 하는지 선택해야 함

  • 각각 디스크를 이미징할 지, 아니면 각 방식에 의해 생성된 볼륨을 이미징할 지 선택

 

4-1. 하드웨어 방식

  • 해당 방식에서 사용하는 컨트롤러 경우 비교적 저렴하지만, 저렴하지 않은 것들도 있어 만약 디스크를 개별적으로 이미징한 경우 컨트롤러 구입이나 자신이 사용하는 RAID 볼륨을 생성하여 분석 필요

  • 하지만 만약 분석해야 할 시스템에 고가의 컨트롤러를 사용하고 자신이 갖고 있지 않은 컨트롤러라면 해당 컨트롤러를 구입해서 사용해야함 (쉽지 않은 일)

  • 그렇기에 개별적 디스크를 이미징하는 것은 이런 경우 좋지 못함 (그렇다고 디스크 이미징을 안 하면 안 됨)

 

RAID 볼륨을 만들지 않고 디스크 자체를 제한적인 방법들(Strings Search)로 분석을 시도해야 한다.

 

다양한 방법이 있겠지만 쉬운 방법으로는 해당 컨트롤러 드라이버를 갖추고 있는 Live CD(Linux)들로 부팅하여 수집하는 것이 있다.

 

 

4-2. 소프트웨어 방식

  • 해당 방식 컨트롤러 경우 소프트웨어이기 때문에 디스크를 이미징 하여도 되고 RAID 볼륨을 이미징 하여도 크게 문제 없음

  • 두 방식 모두 볼륨 이미징 방식을 포함하게 되는데 볼륨을 이미징할 때는 비할당 영역도 세심하게 살피고 주의해야 함


(5) 디스크 스패닝

  • RAID와 비슷한 개념으로 여러 디스크를 하나의 큰 디스크로 운영체제가 인식하게끔 하는 기술

  • 하지만 RAID와 같이 성능 향상이나 중복성 등은 지원하지 않고, 오직 디스크 크기만을 늘려 줌

  • 이러한 점 때문에 통합되어 있는 디스크에 또 다른 디스크 추가나 파일 시스템 크기를 동적으로 늘릴 수 있음

 

많은 운영체제에서 디스크 스패닝 기술을 지원하고 있지만 이 글에서는 리눅스와 윈도우만 다룬다.

 

5-1. 리눅스 디스크 스패닝

  • 두 가지로 된 디스크 스패닝 기술이 있으며 MD, LVM으로 나눌 수 있음

 

리눅스는 부팅할 때 디스크 스패닝 볼륨을 마운트하지 않더라도 슈퍼블록 값은 업데이트 한다.

 

이를 이용해 커널이 디스크를 제거 했는지와 디스크 순서를 체크한다.

 

1) MD

  • 리눅스에는 'MD 드라이버'라고 불리는 드라이버가 있는데 이 드라이버는 도스 기반 파티션을 사용

  • 파티션이 할당된 순서대로 목록을 정리한 'etc/raidtab' 이라는 파일이 존재하는데 볼륨은 이 파일 없이 마운트 가능

  • 해당 파일 설정 값 중에 persistent-superblock이라는 항목 값이 0일 경우 설정 데이터들이 /etc/raidtab 파일 안에만 존재

  • 값이 1일 경우 설정 데이터들이 MD 장치를 생성할 수 있도록 디스크나 파티션 끝에 포함 됨 

 

이는 '자동 감지' 기능을 뜻하며 자동 감지 기능이 동작하기 위해서는 설정 데이터가 위치한 파티션 타입이 'Linux raid partition with autodetect using persistent superblock(0xfd)'이어야 한다.

 

부팅하는 동안 MD 장치가 생성된 것을 확인하려면 Messages 로그를 보면 된다.

 

MD 장치가 생성되도록 superblock이 설정되어 있다면 디스크나 파티션은 1024Byte로 나눠진 여러 구역의 구조를 갖는다.

 

각 구역에는 다음과 같은 정보가 포함되어 있다.

구역

정보

첫 번째 구역

디스크 스패닝 또는 RAID 버전, 디스크 수, 생성 시간, 식별자

두 번째 구역

마지막 업데이트 시간, 카운터, 볼륨 상태, 동작 중인 디스크와 오류난 디스크 수

나머지 구역

주/부 장치 번호, 볼륨 내 각 장치 역할, 디스크 상태

 

2) LVM 

  • Logical Volume Manager의 약자로, MD의 개선된 기술로 볼륨 그룹이라는 것을 사용

  • LVM을 사용하려면 파티션은 'Linux Logical Volume Manager Partition(0x8e)'이어야 함

  • 각 시스템에는 1개 또는 그 이상 볼륨 그룹이 있으며, 각 볼륨 그룹은 /dev/ 디렉토리에 하위 디렉토리를 가짐

  • 물리적 확장 세트를 볼륨 그룹을 이용하여 논리적 볼륨을 생성하는데 이는 물리적 확장 세트들을 연속적으로 연결하거나 스트라이핑을 사용하여 생성

  • 이렇게 생성된 볼륨은 /dev/ 볼륨 그룹 하위 디렉토리 내 장치 파일이 주어지며, 논리적 볼륨 설정 데이터는 로컬 시스템과 볼륨 두 곳에 저장 됨

  • 설정 파일 같은 경우는 '/etc/lvmtab, /etc/lvmtab.d'에 저장 됨 (설정 파일들은 바이너리 파일이며, vgimport, vgscan, vgchange 등의 유틸리티로 업데이트 됨)

 

[그림 11] LVM

 

위 [그림 11]에서 디스크 0과 1은 물리적 세트이고, 볼륨 그룹을 통해 생성된 디스크는 논리적 세트이다.

 

 

5-2. 윈도우 디스크 스패닝

  • 윈도우는 NT 버전 이후로 디스크 스패닝을 지원해 왔으며 사용하는 기술은 LDM

  • LDM은 기본 파티션, 디스크 스패닝, RAID 레벨 0, 1, 5와 유사하고 간단한 볼륨들을 지원

  • 기본 디스크들은 LDM이 사용되지 않으며 LDM이 사용되기 위해서는 디스크에 추가적 데이터 구조체가 포함 되어야 함

 

[그림 12] LDM(동적 디스크) 기본 구조

 

위 [그림 12]를 보면 LDM 파티션 영역 뒤에 LDM 데이터베이스라는 것이 있는데 이 영역은 동적 파티션을 정의하고 논리적 볼륨을 생성한 규칙을 만드는 곳이다.

 

이 영역은 다음과 같은 엔트리를 갖는다.

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

  • 파티션 엔트리 : 동적 디스크 파티션 방법을 설명

  • 컴포넌트 엔트리 : 파티션들의 결합 방법을 설명

  • 볼륨 설명 엔트리 : 파티션 컴포넌트 유형을 적용한 결과인 논리적 볼륨을 포현


(6) 디스크 스패닝 포렌식

  • 리눅스 MD 볼륨을 분석하기 위한 최선의 선택은 단일 드라이브 또는 파티션으로 볼륨을 수집하고 표준 분석 도구를 사용하는 것

  • 슈퍼블록이 설정되어 있다면 쉽겠지만, 그렇지 않다면 대상 시스템에서 /etc/raidtab 파일 생성 필요

  • 그 후 raidstart 명령어로 MD 장치 생성 후, dd 종류 도구로 MD 장치를 이미징 할 수 있음

  • 수집 후에 MD 장치를 정지시키기 위해 raidstop 명령어 사용 필요

 

리눅스 LVM 볼륨 분석은 MD 장치보다 분석을 더 자동화할 수 있다.

 

시스템으로부터 디스크를 분리하여 신뢰할만한 리눅스 시스템에 디스크를 결합하여 분석할 수 있고, LVM을 지원하는 Live CD(Linux)를 대상 시스템에 부팅 시켜 분석이 가능하다.

 

vgscan 명령어를 사용하면 '/etc/lvmtab, /etc/lvmtab.d' 파일이 자동 생성되는데, 자동 생성되면 vgchange -a y 명령어를 실행하여 볼륨을 활성화 시킨 후에 dd 종류 도구로 이미징 시도가 가능하다.

 

윈도우 LDM 경우 분석이 어렵고, 읽기 전용으로 볼륨을 재생성하는 것 또한 쉽지 않다.

 

Live CD(Linux)를 사용하여 LDM을 분석할 수 있는데 이는 조금 수정이 필요하다.

 

기본적으로 리눅스는 LDM을 지원하지 않아 커널 재컴파일을 해야 하며, 재컴파일된 커널은 데이터베이스를 읽고, 각 동적 디스크에 물리적 파티션을 위해 하드 디스크 장치를 생성하게 된다.

 

위와 같은 장치와 방법을 통해 이미징을 시도하면 된다.


# Reference

 

http://www.yes24.com/Product/Goods/8511539

+ Recent posts