제 11 장 리눅스 시스템 조사


 리눅스 시스템은 유닉스를 기반으로 개발된 운영체제이다. 엄밀히 하면 리눅스 커널만을 뜻하지만 리눅스 커널을 포함, GNU 프로젝트의 라이브러리와 도구를 포함하여 리눅스라 한다.

 리눅스는 커널, 라이브러리, 응용 프로그램 등을 누구나 자유롭게 수정 및 배포할 수 있다. 현재 200 종류 이상의 다양한 리눅스 배포판이 있으며, 가장 활발하게 배포되고 있는 Ubuntu, Fedora, OpenSUSE, Debian, Mandriva, Mint, PCLinuxOS, Slackware, Gentoo, CentOS, FreeBSD 등이 배포되고 있다.


1. 리눅스 시스템의 특징

  • 명령어 기반

 리눅스는 명령어 기반 시스템이다. 운영체제의 핵심인 커널이 명령어 기반의 입·출력을 하도록 작성되어 있기 때문이다.

  • 디렉토리와 파일

 ⅰ. 디렉토리 구조

 리눅스는 드라이브 문자가 존재하지 않고 필요한 파일 시스템을 마운트[각주:1]하여 사용한다.

 "."은 현재 디렉토리, ".."은 상위 디렉토리를 의미한다.

* / : 최상위 디렉토리로써 루트 디렉토리라 한다. 모든 디렉토리는 루트 디렉토리를 기준으로 위치한다.

* /bin : ls, cp와 같은 기본 명령어가 저장되어 있다.

* /boot : 시스템이 부팅하기 위해 필요한 파일이 저장되어 있다.

* /dev : 시스템의 각 장치를 의미하는 파일이 저장되어 있다.

*/etc : 시스템 설정에 대한 파일이 저장되어 있다.

* /home : 홈 디렉토리는 각 사용자에게 할당된 기본 디렉토리를 저장한다.

* /lib : 시스템의 공유 라이브러리가 저장되어 있다.

* /lost+found : 파일 시스템의 이상 여부를 진단하고 복구하는 fsck 명령어가 사용하는 디렉토리로, 특정 파일의 위치를 결정할 수 없는 경우 이 디렉토리에 보관한다.

* /mnt : 다른 장치를 마운트하기 위한 디렉토리이다.

* /proc : 가상 파일시스템으로 실제로 디스크에 저장되지 않으며, 시스템에서 실행되는 프로세스에 대한 정보를 저장하고 있다.

* /usr : 사용자가 설치한 응용 프로그램, 소스코드, 도움말 파일 등이 저장된다.

* /root : 슈퍼 유저인 root의 홈 디렉토리이다.

* /sbin : 슈퍼 유저가 사용하는 명령어가 저장되어 있다.

 /var : 로그 파일이나 프린터 스풀 파일과 같이 시스템의 동작 중에 변화하는 파일이 저장되어 있다.


 ⅱ. 파일 특성

 리눅스 시스템은 파일의 권한을 통해 실행 여부를 결정한다.

 ㄱ. 심볼릭 링크(Symbolic Link)

  윈도우 시스템의 바로가기 파일과 유사하다. 다른 경로의 파일을 이용하여 작업을 수행하려는 경우 심볼릭 링크를 이용하여 다른 경로의 파일에 대한 작업을 수행할 수 있다. 

 ㄴ. 하드 링크(Hard Link)

  원본을 복사하여 사본을 생성한다. 링크 파일에 대한 작업을 수행하는 경우 원본에 동일한 영향을 미치는 점은 심볼릭 링크와 동일하다. 하지만 원본 파일이 삭제되면 심볼릭 링크 파일이 함께 삭제되는데 반해 하드 링크는 제거되지 않고 원본의 내용을 그대로 가지고 있다.


 ⅲ. 디렉토리와 파일 소유 및 접근 제어
 

  위 그림과 같이 디렉토리 및 파일에 접근하기 위해서는 접근하고자 하는 대상에 적절한 권한을 얻어야 한다. 

  "r"은 읽기, "w"는 쓰기, "x"는 실행을 나타낸다.

 

 ⅳ. SUID와 SGID (Set User ID & Set Group ID) 

  특정 실행 파일을 사용할 때 해당 파일의 소유자 n또는 그룹의 권한으로 실행할 수 있도록 한다. 

                              -rwsr-xr-x 1 root root 34696 2017-01-26 18:04 ping


 "ping" 명령의 접근 권한이다. 명령어 파일의 소유자는 "root"이며 소유자의 권한에 "s"가 있으면 SUID가, 그룹권한에 "s"가 있으면 SGID가 설정되어 있음을 나타낸다. 


  • 데몬(Daemon)

리눅스 시스템에서 백그라운드로 동작하는 서버 프로그램을 의미하며 윈도우의 서비스와 유사하다. "httpd"와 같이 제공하는 서버의 이름에 "d"를 붙여 표시하는 경우가 대부분이며 서버의 동작 과정을 로그 파일에 남긴다.



2. 리눅스 환경 설정 파일

  • 사용자 및 그룹 설정

ⅰ. /etc/passwd

 시스템의 모든 계정은 /etc/passwd 파일에 정의되어 있다. 콜론(:)을 통해 각 항목을 구분한다.

                                       username:password:uid:gid:gecod:homedir:program

  username : 계정명으로 사용자가 로그인할 때 사용하는 이름이다. 

* password : 사용자의 패스워드가 암호화되어 저장된다. 사용자가 패스워드를 변경하고자 할 때 /etc/passwd 파일의 내용을 직접 수정하지 않고, "passwd" 명령을 통해 패스워드를 변경해야 한다. 시스템의 패스워드를 안전하게 관리하기 위해 shadow 패스워드를 스는 경우에는 "x"나 "*"로 표시되어 있다.

* uid : 사용자 ID로 각 사용자에게 시스템이 부여하는 고유한 정수값이다. 시스템에서 uid와 username는 1:1 대응된다 .

* gid : 사용자가 속해 있는 기본 그룹의 ID이다. 각 그룹의 ID에 따른 이름은 /etc/group에 정의되어 있다.

* gecos : 사용자의 실제 이름이나 사무실, 연락처 등의 부가 정보를 저장하기 위한 항목이다. 로그인되어 있는 사용자 정보를 표시해 주는 finger 명령이 사용자를 구별하기 위해 이 항목을 이용한다.

* homedir : 각 사용자의 홈 디렉토리를 나타낸다. 홈 디렉토리란 사용자가 시스템에 로그인할 때, 최초로 접근하는 디렉토리를 말한다. 

 program : 사용자가 로그인한 후에 실행되는 프로그램을 나타낸다. 일반적으로 각 사용자가 지정한 쉘을 실행한다. 


ⅱ. /etc/shadow

  /etc/shadow 파일은 모든 사용자가 읽을 수 있어 패스워드 인증정보가 노출된다. 이러한 취약점을 막기 위해, 패스워드 인증 정보를 별도로 보관하고 슈퍼 유저만 읽을 수 있도록 한 파일을 쉐도우 파일이라 한다.

                                ①:②:③:④:⑤:⑥:⑦:⑧:⑨

* ① : 계정명으로 /etc/passwd 파일에 있는 계정명과 동일하다.

*  : 패스워드 인증 정보이다. 비어 있다면 로그인할 때 패스워드가 필요없음을 의미하여 "*"로 되어 있으면 사용하지 않는 계정이다.

* ③ : 패스워드를 마지막으로 바꾼 날이 UTC 기준일부터 며칠 째인지 나타낸다.

* ④ : 앞으로 며칠이 지난 후 패스워드를 바꿀 수 있는지 나타낸다. 0이면 언제든 패스워드의 변경이 가능하다.

* ⑤ : 패스워드를 바꿔야 하는 날부터 며칠이 지났는지 나타낸다.

* ⑥ : 패스워드 만료기간이 되었음을 얼마 동안 사용자에게 알릴지 나타낸다.

* ⑦ : 패스워드가 만료되어 사용할 수 없게된 후 며칠이 지났는지 나타낸다.

* ⑧ : 계정 사용을 할 수 없게 된 것이 UTC 기준일부터 며칠 째인지 나타낸다.

* : 사용하지 않는다.


ⅲ. /etc/group

  그룹과 그룹에 속해있는 사용자에 대해 저장하고 있다. 모든 사용자는 최소한 하나의 그룹에 속해 있어야 하며 파일 저장 방식은 /etc/passwd 파일과 비슷하다.

                           groupname:password:gid:member1,member2, member3 ···  

* groupname : 그룹의 이름을 나타낸다.

* password : 그룹에 지정된 패스워드를 나타낸다. 패스워드가 지정된 경우, 그룹된 멤버가 아니어도, 패스워드를 알고 있는 사용자는 그룹의 권한을 획득할 수 있다.

* gid : 그룹의 ID로 groupname과 대응된다.

* member1, member2 ··· : 그룹에 속해있는 사용자 목록이다. 콤마(,)를 이용하여 각 사용자를 나열하여 나타낸다.


  •  파일 시스템 설정

 NFS(Network File System)과 같이 원격지 시스템에 대한 마운트 정보 역시 파일 시스템 설정에 기록될 수 있기 때문에 로컬 파일 시스템에 대한 분석을 수행하기 전에 분석 대상 시스템에 설정되어 있는 파일 시스템 설정을 확인해야 한다.

ⅰ. /etc/fstab

  시스템을 부팅하면서 각 장치를 자동으로 마운트할 때 사용되거나 "mount" 명령에서 "-a" 옵션을 지정한 경우 사용한다. 

              FileSystem     MountPoint     Type     Option1,Option2···     Dump     Pass 

* FileSystem : 마운트되는 장치의 이름을 의미한다. (예: /dev/sda1), NFS를 마운트하는 경우에는 원격지의 경로.

* MountPoint : 마운트 지점을 의미한다. (예: /mnt/cdrom)

* Type : 파일시스템의 타입을 지정한다. (예: ext2)

* Option : 파일 시스템에 따라 다양한 옵션이 존재할 수 있다.

   ☞ ro/rw : 읽기 전용/읽기 쓰기 가능

   ☞ suid/nosuid : SUID 사용 가능/불가

   ☞ sgid/nosgid : SGID 사용 가능/불가

   ☞ exec/noexec : 실행 권한을 가진 파일의 실행 가능/불가

   ☞ quota/noquota : 사용자별 사용 용량 제한/제한하지 않음

   ☞ auto/noauto : 부팅할 때 자동 마운트 수행/수행하지 않음

   ☞ user/nouser : 일반 사용자도 마운트 가능/불가

* Dump : "dump"라는 도구를 이용하여 파일 시스템 백업 가능 여부

* Pass : 마운트시 파일 시스템 검사 여부

   ☞ 0 : 검사하지 않음

   ☞ 1, 2 : 파일 시스템 검사. Pass가 1인 파일 시스템부터 검사한 후, 2인 파일 시스템 검사


ⅱ. /etc/mtab

  /etc/fstab은 마운트하기 위한 정보를 저장하는 반면, /etc/mtab은 현재 마운트되어 있는 정보를 저장한다.

"mount" 명령어에 파라미터를 주지 않으면 /etc/mtab의 내용이 화면에 출력된다. 



  • 네트워크 설정 파일

ⅰ. 네임 서버 설정

  일반적으로 사용하는 "forensic.korea.ac.kr"과 같은 도메인 주소 또는 "WebServer"와 같이 특정 이름을 사용하는 경우 이를 IP 주소로 바꾸는 역할을 한다. 로컬의 네임 서비스 정보를 이용하는 호스트 설정과 원격의 DNS 서버를 통해 IP 주소를 알아내는 DNS 서비스가 있다. 

  ㄱ. 호스트 설정 

   로컬에서 운용되는 네임 서비스이다. DNS 서버를 거치지 않고 지정된 IP 주소를 사용하게 할 수 있으며, IP 스푸핑(spoofing) 방지, 특정 호스트에 대한 접근 제어 등이 가능하다. 호스트 설정 파일에는 /etc/hosts.conf, /etc/hosts, /etc/hosts.allow, /etc/hosts.deny가 있다.

   - /etc/hosts.conf

    네임 서비스를 어떻게 동작시킬 것인지 결정한다.

* order : 네임 서비스가 동작하는 순서를 결정한다. 파라미터로 hosts, bind, nis가 있으며 hosts는 로컬에 저장된 /etc/hosts 파일 참조를, bind는 DNS 서버를 통한 네임 서비스를, nis는 네트워크 정보 서비스(NIS) 프로토콜을 이용한다는 것을 의미한다.

* alert : on/off로 설정할 수 있다. IP 스푸핑이 발생하면 syslog에 기록한다.

* multi : on/off로 설정할 수 있다. 동일한 호스트에 여러 IP 주소를 부여할 수 있도록 한다.

* nospoof : on/off로 설정할 수 있다. 주소를 이용하여 IP를 얻어내는 것과 IP를 통해 주소를 얻는 두 가지 방법을 모두 수행하여 두 개가 일치할 경우에만 IP 주소를 전달한다.

* trim : 도메인 주소를 파라미터로 설정한다. hosts 파일을 참조할 때, 도메인을 입력하지 않아도 자동으로 찾을 수 있게 한다.

  host.conf 파일은 다음과 같이 설정한다.

   order hosts,bind

   multi on 

  - etc/hosts

    호스트의 이름과 IP 주소의 쌍으로 구성되어 있다. /etc/hosts 파일은 다음과 같다. 

  - /etc/hosts.allow, /etc/hosts.deny

    외부의 접근을 허용 또는 차단하기 위해 사용한다.

ㄴ. DNS 설정

  DNS 설정 파일은 /etc/resolv.conf이다. 



ⅱ. 네트워크 인터페이스 카드(NIC) 설정

 NIC 정보는 /etc/network/interfaces에 저장되어 있다.

  auto는 부팅 시 자동으로 인터페이스를 활성화시킨다. 고정 IP 주소를 사용하는 경우에는 "static"로 선언하고, IP 주소, 넷마스크, 네트워크 주소, 브로드캐스트 주소, 게이트 웨이 등의 항목을 설정한다. 동적 IP 주소를 사용하는 경우에는 "static" 대신 "dhcp"로 지정하면 된다.


3. 자동 실행 프로그램

ⅰ. 시스템의 시작·종료 시 자동 실행 파일

 시스템이 시작·종료할 때, 자동으로 실행되는 파일은 실행레벨(RunLevel)에 의존한다. 실행레벨은 0~6까지 있으며, 리눅스 배포판에 따라 실행레벨의 정의는 달라질 수 있다. 

 "페도라 코어 8"에 정의되어 있는 실행레벨이다. 

우분투 데스크톱 버전에 정의되어 있는 실행레벨이다.

ⅱ. 사용자 동작에 따른 자동 실행 파일

 사용자가 로그인하여 쉘을 실행시키거나 새로운 쉘로 진입하는 경우, 특정 프로그램을 이용하는 경우에 자동으로 실행되는 스크립트 파일이 있다. 자동 스크립트 파일은 일반적으로 사용자의 홈 디렉토리에 있다.

ㄱ. ".bashrc", ".bash_profile", ".bash_logout"

  bash 쉘이 동작할 때 자동으로 실행되는 스크립트이다. 

 - ".bashrc" : bash 쉘이 구동될 때 마다 실행

 - ".bash_profile" : bash 쉘이 로그인 쉘로 이용되었을때만 동작

 - ".bash_logout" : bash 로그인 쉘이 종료되었을 경우 실행

/etc/profile, /etc/bash.bashrc 등

 ㄴ. ".cshrc", ".login"

   c 쉘이나 tcsh가 실행할 때 자동으로 실행되는 스크립트이다.

 ㄷ. ".kshrc"

   콘(Korn) 쉘이 실행할 때 자동으로 실행되는 스크립트 파일이다.

 ㄹ. ".vimrc"

   텍스트 편집기인 vi, vim 에디터를 이용할 경우 자동으로 실행된다.

 ㅁ. ".xinitrc"

   X 윈도우가 구동될 때 자동으로 실행된다.

ⅲ. 작업 스케줄링(crontab)

 리눅스 시스템에서 사용하는 작업 스케줄링 데몬이다. /etc/crontab 파일 내에 정의되어 있다. 

                            Min        Hour      Day       Month       DayOfWeek       Command

 * Min : 0~59분

 * Hour : 0~23시

 * Day : 1~31일

 * Month : 1~12 혹은 Jan~Dec

 * DayOfWeek : 0 또는 7은 일요일, 1=월요일, 2=화요일 ··· 혹은 Sun~Sat

 * Command :실행하고자 하는 명령어 또는 스크립트



4. 시스템 로그 파일

 시스템의 로그를 기록하기 위해 기본적으로 syslog 데몬을 이용한다. 운영체제의 동작과정에서 발생하는 로그, 다른 데몬 프로그램이 발생시키는 로그를 기록한다. 일반적으로 시스템에 의해 발생된 로그는 /var/log 디렉토리에 기록된다.

 시스템 로그는 윈도우 시스템의 이벤트 로그와 유사하게 시스템에서 발생한 일에 대해 자세히 기록하므로 리눅스 시스템에서 발생된 사건에 대해 많은 정보를 제공한다.

  • 명령어 히스토리

bash 쉘은 ".bash_history" 파일에 입력한 명령어를 기록한다. 명령어 히스토리 파일에 기록되는 명령어의 수는 $HISTSYZE 환경 변수에 기록되어 있다.

slowtrado-MacBook-Pro:~ slowtrado $ echo $HISTSIZE

500 

  • /var/log/wtmp와 /var/run/utmp, /var/log/lastlog

 로그인 시간과 사용자가 시스템에 연결한 기간과 재부팅할 때의 부팅 기록을 바이너리 파일로 저장한다.

slowtrado-MacBook-Pro:~ slowtrado $ /var/log$ last

slowtrado  console                   Thu Nov 24 23:37 - crash  (12:28)

_mbsetupuser  console                   Thu Nov 24 23:28 - crash  (12:36)

root      console                   Thu Nov 24 23:28 - 23:28  (00:00)

reboot    ~                         Thu Nov 24 23:27 

_mbsetupuser  console                   Sat Nov 19 06:24 - crash (5+17:03)

root      console                   Sat Nov 19 06:24 - 06:24  (00:00)

reboot    ~                         Sat Nov 19 06:23  


wtmp begins Sat Nov 19 06:23 

 /var/run/utmp 파일은 시스템에 현재 로그인되어 있는 사용자의 정보를 저장하고 있는 바이너리 파일이다. who, w, finger 등의 명령어를 통해 내용을 볼 수 있다.

slowtrado-MacBook-Pro:~ slowtrado$ w

20:25  up  8:39, 2 users, load averages: 1.39 1.36 1.34

USER     TTY      FROM              LOGIN@  IDLE WHAT

slowtrado console  -                11:46    8:38 -

slowtrado s000     -                16:22       - w 

 /var/log/lastlog 파일은 각 계정이 마지막으로 로그인한 시간을 저장하고 있는 바이너리 파일이다.

  • /var/log/dmesg

 시스템이 부팅할 때 출력하는 메시지를 기록하는 로그 파일이다. 시스템의 하드웨어 설정 및 로드된 디바이스 드라이버 등을 확인할 수 있다.

  • /var/log/messages

 시스템에서 발생하는 각종 로그를 기록한 파일이다. 운영체제가 동작하며 발생하는 하드웨어 및 소프트웨어의 이벤트와 에러를 기록한다.

  • /var/log/auth.log

 관리자 권한으로 실행된 명령에 대해 시간, 계정명, 시도한 작업, 실패 여부 등을 저장한다. sudo 명령을 통해 관리자 권한으로 동작한 것 뿐만 아니라 passwd와 같이 SUID, SGID가 설정되어 관리자 권한으로 실행된 명령어도 기록된다.



5. /proc 파일 시스템

 리눅스 시스템이 동작하기 위한 커널 정보를 메모리에 계층 구조로 구현한 것이다. 현재 동작 중인 프로세스 정보 외에도 CPU 사용, 인터럽트, I/O 포트 정보, 장치 정보 등을 쉽게 가져올 수 있다.

ⅰ. 시스템 정보 

 ㄱ. cmdline : 부팅할 때 사용했던 커널 파라미터 출력

 ㄴ. cpuinfo : 시스템에 장착되어 있는 모든 프로세서에 대한 정보 보관

 ㄷ. diskstats : 디스크 I/O에 대한 통계

 ㄹ. driver/rtc : 하드웨어적인 시스템 클럭인 RTC(Real Time Clock)의 값 소유

 ㅁ. filesystmes : 커널에서 지원하는 파일 시스템을 보여줌

 ㅂ. /kallsyms(커널 2.6), /ksyms(커널 2.4) : 커널에서 사용되는 전역 변수, 함수 등의 심볼 보관

 ㅅ. kcore : 프로그램에서 크래쉬가 발생했을 때 생성되는 "core" 파일과 동일한 형식의 파일

 ㅇ. modules : 커널에 로드된 모든 모듈의 이름과 커널 주소 보관

 ㅈ. mounts : NFS를 포함하여 현재 마운트 되어 있는 모든 장치 보관 

 ㅊ. partitions : 시스템의 각 파티션에 대한 정보 제공

 ㅋ. sys directory : 커널 내부에서 사용하는 변수에 대한 정보를 파일로 보관

 ㅌ. uptime : 시스템이 동작한 시간을 나타내는 값과 그 중 유후(Idle) 시간이 얼마나 되는지에 대한 두 개의 시간 값 보관 (초 단위)

 ㅍ. version : 상세한 커널 버전 및 커널 컴파일시의 정보

 ㅎ. meminfo : 메모리의 사용량 및 상태에 대한 통계 값

ⅱ. 프로세스 정보

 ㄱ.  exe : 실제 실행 파일의 이미지에 대한 심볼릭 링크

 ㄴ. cmdline : 프로세스가 시작할 때, 입력한 실행 파일명과 파라미터를 포함하는 명령어 구문 의미

 ㄷ. cwd : 프로세스의 작업 디렉토리의 심볼릭 링크

 ㄹ. environ : 프로세스를 위한 환경 변수 보관

 ㅁ. fd 디렉토리 : 프로세스와 관련된 모든 파일의 디스크립터에 대한 정보 저장, 0, 1, 2는 표준 입·출력과 표준 에러 표현

 ㅂ. loginuid : 시스템에 접속한 UID



6. 활성 시스템 조사

 리눅스 또는 유닉스 계열의 종류, 버전 등이 매우 다양하기 때문에 모든 시스템에서 동작 가능한 통합 도구를 제작하는 것보다 각 시스템 별로 사용가능한 쉘 스크립트(Shell script)를 제작하는 방법을 권장한다.

 쉘 스크립트에는 현재 시간 및 부팅 이후 사용 시간, CPU, OS, 실행 중인 프로세스, 연결된 장치, 네트워크 인터페이스 카드, 네트워크 연결, 파일시스템, 사용자 접속 기록, 명령어 history 등의 정보가 있다.



  1. 다른 장치의 파일에 접근하기 위해서는 운영체제에 접근하고자 하는 장치의 파일 시스템을 알리고, 특정 디렉토리에 장치의 파일 시스템을 연결하는 작업이다. [본문으로]

'Digital Forensics > Pre Digital Forensic' 카테고리의 다른 글

컴퓨터 구조  (0) 2017.09.13
침해 사고 조사 절차  (0) 2017.01.30
윈도우 시스템 조사  (0) 2017.01.19
디지털 증거의 무결성 유지 기술  (0) 2017.01.18
파일 시스템과 파일 복구 IV  (0) 2017.01.16
Posted by dodssockii :