TrotRanking
IT Engineering

리눅스 터미널 히스토리 포렌식 추적: 타임스탬프와 PROMPT_COMMAND를 이용한 명령 무결성 장악

김민준 · IT 시스템 엔지니어
퍼블릭 클라우드 인프라가 팽창하면서 수십, 수백 대의 리눅스 서버 가상 머신(VM) 노드를 콘솔 터미널 하나만으로 오케스트레이션하고 관리하는 리눅스 관리자나 데브옵스 프로덕션 엔지니어들에게, 터미널 상에서 실행했던 명령어의 발자취 궤적을 쫓는 히스토리(History) 데이터는 단순한 기억력 보조 장치의 수준을 까마득히 넘어섭니다. 서버 환경이 고의적인 크래커에게 해킹당하거나, 내부 인력의 실수로 예기치 못한 글로벌 설정 꼬임 현상이 빚어져 서비스가 박살 났을 때 이 로그 파일이야말로 사고 전후의 시간을 가름하고 롤백 기준점을 잡아주는 생명줄이자 1차적인 강력한 보안 포렌식 데이터 그 자체로 기능합니다. 하지만 불행히도 리눅스 우분투나 CentOS 운영체제가 최초 설치되어 배포되는 순정 상태의 기본 배시(Bash) 쉘 히스토리 시스템은 보안 관점에서는 너무나도 멍청하고 소름 돋도록 헐거운 구멍을 자랑합니다. 누가 언제 그 명령어를 키보드로 쳤는지에 대한 타임스탬프 기록 기능조차 황당하게 기본으로 꺼져있으며, 심각하게도 동일한 관리자 루트 계정 세션으로 두세 개의 멀티 SSH 접속 창을 띄워놓고 동시다발적으로 빌드 구문을 칠 경우 시스템 메모리상의 CLI 로그들이 엉키며 최종적으로 종료되는 터미널의 히스토리만 기존 터미널 파일 기록 위로 덮어씌워 소멸되는 끔찍한 데이터 소실 참사가 벌어집니다. 이러한 허술한 히스토리 로깅 인프라를 군용 감시망 수준의 철저한 기록 금고 시스템으로 개조 방어하기 위해서는 먼저 사용자의 홈 디렉터리 기반 구성 파일인 `~/.bashrc` 영역을 강제로 탈거하고 텍스트 에디터로 깊은 튜닝 수술을 시작해야 합니다. 가장 먼저 명령어 실행 로그에 날짜와 초 단위 정밀 서버 시간 도장이 찍히도록 시스템 강제 환승 명령을 심어주어야 합니다. `export HISTTIMEFORMAT="%F %T "` 라는 타임스탬프 환경 변수를 구문 가장 상단에 굵직하게 박아 넣습니다. 그리고 로그 자체가 쉽게 밀려 삭제되지 않도록 보존 기억 용량의 한계치를 폭발적으로 확장하기 위해 `HISTSIZE=100000` 및 `HISTFILESIZE=100000`이라는 초대형 사이즈 스케일링 명령어를 동반 입력해 줍니다. 여기까지가 기본 용량 방어였다면 덮어쓰기 소실 에러를 막기 위해 `shopt -s histappend` 쉘 옵셔닝 코드를 결합시켜, 새로운 접속 세션이 종료될 때마다 무식하게 전체 로그 텍스트 파일을 새로 파내어 뒤집어쓰는 게 아니라 기존 스크립트 로그 최하단에 안전하게 한 줄씩 차곡차곡 리스트를 이어 붙이면서 마운트 하도록 시스템 동기 속성을 변경해야 완료됩니다. 가장 치명타에 가까운 백도어 방어 파이프라인의 종착역은 바로 `PROMPT_COMMAND` 환경 변수 후킹 장악과 커널 레벨의 불변 속성(immutable) 잠금 기법입니다. 수백 개의 모조 동시 접속 스크립트에서도 실시간으로 명령어가 텍스트 파일로 밀려 들어가게 하려면 앞선 설정 파일에 `export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"` 라는 난해한 연쇄 플러싱 구문을 인젝트 해버립니다. 이 마법 같은 커맨드 체인은 엔터키를 타격하여 명령이 끝나고 쉘 프롬프트 커서가 다시 깜빡이려는 그 찰나의 순간마다 메모리의 로그 버퍼를 강제로 하드 디스크 .bash_history 텍스트로 폭포수처럼 쏟아부어 배출(Flush)시킨 뒤 캐시를 다시 리로딩 하는 극소형 동기화 엔진입니다. 이렇게 완벽한 기록 추적망이 구축되었다 해도 악의적 관리자가 `rm` 명령어로 파일 폴더 자체를 폭파해버리면 끝이라는 딜레마가 남습니다. 이를 막기 위해 최고 관리자 루트 콘솔에서 `chattr +a ~/.bash_history` 라는 흉악한 리눅스 특수 속성 변경 명령어가 동원됩니다. 이것이 적용되는 순간 파일은 물리적으로 'Append Only(추가만 허용)'라는 무적의 감옥 방어 보호막에 갇히게 되며, 설사 해당 서버를 해킹해 `root` 권한 탈취에 성공한 초심자 해커가 파일을 삭제하거나 vi 에디터로 침투 기록을 수정하려 시도할지라도 커널단에서 'Operation not permitted' 에러를 뿜으며 수정 파기 요청 자체를 거부해버리는 궁극의 불멸 포렌식 장벽 아키텍처 환경이 구축됩니다.