신비한 개발사전

로그 파일 삭제범 검거 과정 1편 본문

Infrastructure

로그 파일 삭제범 검거 과정 1편

jbilee 2025. 9. 28. 03:58

CloudWatch에 한동안 잘 뜨고 있던 로그가 어느 순간을 기점으로 뚝 끊겨있었다. EC2에 접속해 확인해보니, 백엔드 디렉토리 안에 뒀던 logs 폴더가 사라져있었다.

 

로그 디렉토리가 어쩌다 사라졌을까? 당연하게도 팀원 중 누구도 디렉토리를 지우지 않았을 뿐더러, 지울 이유도 없었다.

 

logs 외에 build 폴더도 없어졌길래 처음엔 빌드 실패 때문일지 의심했다. 우리 CI/CD 파이프라인은 ./gradlew clean build 명령어를 호출하고 있었기 때문에, clean으로 인해 build 폴더를 삭제한 상태로 빌드를 시작한다. 다만 빌드 과정에서 logs 폴더는 건드릴 일이 없으니, clean build가 원인일 리 없었다.

 

문제를 어디서부터 해결하면 좋을지 고민하다가, 파일이나 디렉토리에 대한 상태를 보거나 수정된 내역을 트랙킹하는 리눅스 명령어를 찾아봤다. 아쉽게도 우리한테 필요한 정보를 제공해주는 기능은 없었다.

  • stat: 지금 현존하고 있는 파일/디렉토리만 확인 가능
  • find: 목록만 리스트업 해주고 아무런 메타 정보를 제공해주지 않는 것으로 보임

 

언제, 누가, 어떤 파일을 어떻게 삭제했는지 알려주는 흑마술 같은 툴이 있을까?

 

있다.

 

컴퓨터 세계에서 없는 건 없다.

 

리눅스의 감사 프로그램 auditd를 통해 위 정보는 물론 기타 메타 정보까지 알 수 있다.

 

auditd 설정하기

EC2 인스턴스(ubuntu 환경)에서 auditd를 사용하려면 먼저 설치를 진행한다.

# 설치
sudo apt install auditd

# 실행
sudo systemctl start auditd

 

감시하고 싶은 디렉토리(또는 파일)는 auditctl 명령어에 path를 전달해 하나의 규칙으로 설정할 수 있다.

sudo auditctl -w ${디렉토리_path} -p wa -k ${key_식별_이름}

# 예시:
sudo auditctl -w /home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend -p wa -k backend_watch

 

-k로 key 이름을 지정하면 추후 해당 key로 기록된 로그만 골라 볼 수 있다.

 

참고로 위와 같이 설정해서 구동시키는 auditd는 EC2 인스턴스를 재부팅하면 사라진다고 하니, 재부팅하게 되면 꼭 다시 설정해줘야 한다.

 

auditctl로 규칙을 등록하는 즉시 감사가 시작된다. 식별자를 같이 등록했을 경우 아래 커맨드로 감사 로그를 확인할 수 있다.

sudo ausearch -k ${key_식별_이름} -i

# 예시:
sudo ausearch -k backend_watch -i

 

auditd 로그 예시

시험 삼아 backend 디렉토리에 hello 폴더를 만들었다가 지워봤고, auditd에 의해 아래와 같은 로그가 찍힌 것을 확인했다.

type=PROCTITLE msg=audit(09/28/25 01:56:31.015:1300) : proctitle=auditctl -w /home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend -p wa -k backend_watch
type=SYSCALL msg=audit(09/28/25 01:56:31.015:1300) : arch=aarch64 syscall=sendto success=yes exit=1132 a0=0x4 a1=0xffffd8377b60 a2=0x46c a3=0x0 items=0 ppid=408484 pid=408485 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts2 ses=unset comm=auditctl exe=/usr/sbin/auditctl subj=snap.amazon-ssm-agent.amazon-ssm-agent key=(null)
type=CONFIG_CHANGE msg=audit(09/28/25 01:56:31.015:1300) : auid=unset ses=unset subj=snap.amazon-ssm-agent.amazon-ssm-agent op=add_rule key=backend_watch list=exit res=yes
----
type=PROCTITLE msg=audit(09/28/25 02:48:41.718:1395) : proctitle=mkdir hello
type=PATH msg=audit(09/28/25 02:48:41.718:1395) : item=1 name=hello inode=362933 dev=103:01 mode=dir,775 ouid=ubuntu ogid=ubuntu rdev=00:00 nametype=CREATE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(09/28/25 02:48:41.718:1395) : item=0 name=/home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend inode=309919 dev=103:01 mode=dir,775 ouid=ubuntu ogid=ubuntu rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(09/28/25 02:48:41.718:1395) : cwd=/home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend
type=SYSCALL msg=audit(09/28/25 02:48:41.718:1395) : arch=aarch64 syscall=mkdirat success=yes exit=0 a0=AT_FDCWD a1=0xffffdb126666 a2=0777 a3=0xffffdb125fc0 items=2 ppid=409277 pid=409293 auid=unset uid=ubuntu gid=ubuntu euid=ubuntu suid=ubuntu fsuid=ubuntu egid=ubuntu sgid=ubuntu fsgid=ubuntu tty=pts1 ses=unset comm=mkdir exe=/usr/bin/mkdir subj=snap.amazon-ssm-agent.amazon-ssm-agent key=backend_watch
----
type=PROCTITLE msg=audit(09/28/25 02:48:46.416:1396) : proctitle=rm -rf hello
type=PATH msg=audit(09/28/25 02:48:46.416:1396) : item=1 name=hello inode=362933 dev=103:01 mode=dir,775 ouid=ubuntu ogid=ubuntu rdev=00:00 nametype=DELETE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(09/28/25 02:48:46.416:1396) : item=0 name=/home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend inode=309919 dev=103:01 mode=dir,775 ouid=ubuntu ogid=ubuntu rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(09/28/25 02:48:46.416:1396) : cwd=/home/ubuntu/actions-runner/_work/2025-moitz/2025-moitz/backend
type=SYSCALL msg=audit(09/28/25 02:48:46.416:1396) : arch=aarch64 syscall=unlinkat success=yes exit=0 a0=AT_FDCWD a1=0xb07d337f6140 a2=0x200 a3=0x1 items=2 ppid=409277 pid=409294 auid=unset uid=ubuntu gid=ubuntu euid=ubuntu suid=ubuntu fsuid=ubuntu egid=ubuntu sgid=ubuntu fsgid=ubuntu tty=pts1 ses=unset comm=rm exe=/usr/bin/rm subj=snap.amazon-ssm-agent.amazon-ssm-agent key=backend_watch

 

내가 터미널에 입력했던 그대로 mkdir hellorm -rf hello가 기록돼있다!

 

 

auditd를 설치하고 테스트해보는 동안 다시 만들어둔 logs와 build 디렉토리는 아직 사라지지 않고 남아있다. 일단 auditd에게 감시를 시켜놓고 결과를 기다리려 한다.

 

참고:

 

2편: https://dydk1215.tistory.com/270