카테고리 없음

[Linux] 시스템 로그 분석과 프로세스 포렌식 기초

yejiamoe 2025. 12. 10. 14:03

 

오늘은 리눅스 시스템 관리와 보안의 핵심인 접속 기록(Logging) 분석과 프로세스 계층(Process Hierarchy) 구조에 대해 깊이 있게 공부했다. 서버를 운영하거나 보안 사고를 분석할 때, "누가, 언제, 어디서 들어왔는가"를 파악하고 "현재 내 쉘이 어떤 권한으로 실행 중인가"를 이해하는 것은 필수적이다.

오늘 실습한 주요 명령어와 분석 내용을 정리해 본다.

1. 시스템 접속 기록 분석: last

리눅스에서 가장 기본이 되는 로그 분석 도구는 last 명령어다. 이 명령어는 /var/log/wtmp 파일을 참조하여 사용자의 로그인, 재부팅, 로그아웃 기록을 보여준다.

 

위의 last 명령어 실행 결과를 분석해보면 보안 및 시스템 안정성 측면에서 몇 가지 중요한 인사이트를 얻을 수 있다.

  • 비정상 종료 (Crash) 탐지: 로그 중간중간에 crash라는 항목이 눈에 띈다. 이는 시스템이 정상적으로 logout 하거나 shutdown 되지 않고, 전원이 갑자기 끊기거나 커널 패닉 등으로 강제 재부팅되었음을 의미한다. 로그를 보면 Mon Dec 1, Tue Nov 11 등에 반복적으로 시스템이 비정상 종료된 것을 확인할 수 있는데, 이는 서버 안정성에 문제가 있거나 가상머신을 강제로 껐을 때 주로 발생한다.
     
     
  • 접속 위치 식별 (Where):
     
    • tty2: 서버 콘솔 앞에서 직접 로그인한 물리적 접근(Local)을 의미한다.
    • pts/1: 192.168.56.100과 같은 IP 주소가 찍혀 있는 경우, SSH 등을 통해 원격(Remote)에서 접속했음을 의미한다. 만약 내가 접속하지 않은 시간에 낯선 IP로 접속한 기록이 있다면 침해 사고를 의심해야 한다
  • 유령 계정 식별 (Who): 로그에 testuser라는 계정이 10월 31일에 접속한 기록이 남아있다. 테스트 목적으로 생성했다가 삭제하지 않고 방치된 계정은 공격자의 거점이 될 수 있으므로, 사용이 끝났다면 즉시 삭제하여 '공격 표면(Attack Surface)'을 줄여야 한다.

2. 계정 보안 감사: lastlog와 교차 검증

 

last가 '이력'을 보여준다면, lastlog는 시스템에 존재하는 모든 계정의 **'마지막 접속 시점'**만을 요약해서 보여준다.

 

 
 
  • 시스템 계정 확인: bin, daemon, adm 등의 계정은 **Never logged in**으로 표시되는 것이 정상이다. 이들은 사람이 아닌 시스템 데몬 실행을 위한 계정이기 때문이다. 만약 여기에 접속 날짜가 찍혀 있다면 백도어 설치 등을 강력히 의심해야 한다.
     
  • Root 계정 모니터링: root 계정은 시스템의 모든 권한을 가지므로 언제 마지막으로 로그인했는지(Tue Dec 2...) 항상 인지하고 있어야 한다.

심화: 잠재적 위험 계정 찾아내기 (diff 활용)

단순히 로그만 보는 것을 넘어, /etc/passwd 파일과 lastlog를 비교하여 **"로그인은 가능한 쉘을 가지고 있는데, 접속 기록은 없는 계정"**을 찾아내는 실습을 진행했다.

  1. test1 파일 생성: /etc/passwd에서 로그인이 금지된(nologin) 쉘을 가진 계정 목록 추출.
  2. test2 파일 생성: lastlog에서 한 번도 로그인하지 않은(Never logged in) 계정 목록 추출.
  3. diff 비교: 실습 결과, testuser2라는 계정이 발견되었다.
    • > testuser2의 의미: 이 계정은 한 번도 로그인하지 않았지만(test2에 존재), nologin 쉘 목록에는 없다(test1에 없음).
       
    • 결론: 즉, testuser2/bin/bash와 같은 정상적인 쉘을 가지고 있어 언제든 로그인이 가능한 상태로 방치된 계정일 확률이 높다. 이는 잠재적인 보안 위협이므로 조치가 필요하다.

3. 프로세스 계층 구조와 권한 상승 (pstree)

리눅스에서 내가 현재 어떤 상태인지 명확히 알기 위해 프로세스 트리(pstree)를 분석했다. 특히 su 명령어를 사용할 때 프로세스가 어떻게 생성되는지 시각적으로 확인했다.

(여기에 pstree 및 ps -ef 결과 이미지 삽입 - source: 67, 83)

  • PID 확인: echo $$ 명령어로 현재 내 쉘의 PID가 3517임을 확인했다.
  • 프로세스 족보 (Parent-Child 관계):pstree -p 결과를 보면 다음과 같은 계층 구조가 보인다.gnome-terminal(3143) ─┬─ bash(3161) ─── su(3506) ─── bash(3517)
    1. bash(3161): 내가 처음 로그인했을 때의 일반 유저(user) 쉘이다.
    2. su(3506): 관리자 권한을 얻기 위해 실행한 명령어다.
    3. bash(3517): su 명령의 자식 프로세스로 생성된 새로운 루트(root) 쉘이다.
  • 이 트리가 시사하는 바는 매우 중요하다.

즉, su 명령어는 기존의 일반 유저 쉘을 루트 쉘로 '교체'하는 것이 아니라, 기존 쉘 위에 루트 쉘을 한 겹 더 '얹어서' 실행하는 방식이다. 따라서 ps -ef | grep pts/0 명령어로 현재 터미널을 조회해보면, 일반 유저 프로세스(3161)와 루트 프로세스(3517)가 동시에 살아있는 것을 볼 수 있다.

 
 
 

이 상태에서 exit을 입력하면 루트 쉘(3517)만 종료되고, 다시 부모 프로세스인 일반 유저 쉘(3161)로 돌아가게 된다.

4. 오늘의 결론 (Takeaway)

단순히 명령어를 치는 것과 시스템 내부에서 어떤 일이 일어나는지 아는 것은 천지 차이다.

  • last와 lastlog는 침해 사고 분석(Digital Forensics)의 가장 기초적인 단서가 된다.
  • diff를 활용한 계정 감사는 숨겨진 위협을 찾는 유용한 방법론이다.
  • 프로세스는 부모-자식 관계로 연결되어 있으며, su 권한 상승 시 쉘이 중첩된다는 구조를 이해해야 정확한 시스템 제어가 가능하다.

보안 전문가가 되기 위해서는 이러한 로그 한 줄, 프로세스 하나를 허투루 넘기지 않는 습관을 들여야겠다.