리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 5 / 50 · Part 1. Linux 기본 구조
실습 환경: Rocky Linux 9 (10.0.0.200)
이전 글: 4. User Space와 Kernel Space
4편에서 User Mode 프로그램은 하드웨어나 다른 프로세스의 메모리에 직접 접근할 수 없다고 정리했다. 그렇다면 cat은 어떻게 디스크의 파일을 읽고, curl은 어떻게 네트워크로 데이터를 보낼까? 답은 System Call(시스템 호출) 이다.
System Call은 보안관제에서 특히 중요하다. 파일 열기, 프로그램 실행, 네트워크 연결 같은 모든 행위가 System Call을 거치기 때문에, 이 지점을 기록하면 공격자가 쉽게 우회할 수 없는 행위 기록을 얻을 수 있다. auditd, EDR, Sysmon for Linux 같은 도구가 모두 이 원리를 이용한다.
이번 글에서 답할 질문:
strace로 프로그램의 System Call을 어떻게 관찰하는가?System Call은 User Mode 프로그램이 커널에 서비스를 요청하는 공식 인터페이스 다. 각 System Call에는 번호가 있고, 프로그램은 번호와 인자를 CPU 레지스터에 넣은 뒤 syscall 명령으로 커널에 진입한다.
대부분의 프로그램은 System Call을 직접 부르지 않고 C 라이브러리(glibc)의 래퍼 함수 를 통해 호출한다. 예를 들어 C의 open() 함수는 내부적으로 openat System Call을 호출한다.
| 분류 | 대표 System Call | 하는 일 | 보안 의미 |
|---|---|---|---|
| 파일 | openat, read, write, unlink, rename, chmod | 파일 열기·읽기·쓰기·삭제·권한 변경 | 민감 파일 접근, 증거 삭제 |
| 프로세스 | fork/clone, execve, exit, kill | 프로세스 생성·실행·종료 | 어떤 프로그램이 실행되었나 |
| 네트워크 | socket, connect, bind, listen, accept | 소켓 생성·연결·대기 | 외부 연결, 백도어 포트 |
| 권한 | setuid, setgid, capset | 실행 권한 변경 | 권한 상승 |
| 커널 | init_module, finit_module, ptrace | 모듈 로드, 다른 프로세스 조작 | 루트킷, 프로세스 인젝션 |
System Call 설명서는 매뉴얼 섹션 2 에 있다. man 2 openat처럼 조회한다.

open())를 호출한다.openat은 257)와 인자를 레지스터에 넣는다.syscall 명령으로 CPU가 Kernel Mode로 전환된다.-1과 오류 코드(errno, 예: EACCES 권한 없음, ENOENT 파일 없음).| 구분 | strace | auditd |
|---|---|---|
| 원리 | ptrace로 대상 프로세스를 추적 | 커널 감사 서브시스템 |
| 범위 | 지정한 프로세스(와 자식) | 시스템 전체 (규칙 기반) |
| 용도 | 분석·디버깅 (일시적) | 상시 감사 기록 (관제) |
| 성능 영향 | 대상 프로세스가 크게 느려짐 | 규칙이 적으면 작음 |
| 결과 위치 | 터미널 / 파일 | /var/log/audit/audit.log |
sudo dnf install -y strace
# 1) cat이 호출하는 파일 관련 System Call
strace -e trace=openat,read,write cat /etc/hostname
# 2) 어떤 System Call을 몇 번 호출했는지 요약
strace -c ls /etc > /dev/null
# 3) 프로세스 생성·실행 추적 (-f: 자식 프로세스까지)
strace -f -e trace=process bash -c 'id'
# 4) 권한 없는 파일 접근 시 반환값
strace -e trace=openat cat /etc/shadow
# 상태 확인 (Rocky Linux는 기본 설치·활성화)
sudo systemctl status auditd
sudo auditctl -s
# 감사 규칙 파일 작성
sudo vi /etc/audit/rules.d/soc.rules
# /etc/audit/rules.d/soc.rules
# 민감 파일 감시 (-p: r 읽기, w 쓰기, a 속성 변경)
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p rwa -k shadow_access
-w /etc/sudoers -p wa -k sudoers_change
# 사용자 로그인 세션에서 실행된 모든 프로그램
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k user_exec
sudo augenrules --load # rules.d 파일을 합쳐 적용
sudo auditctl -l # 적용된 규칙 확인
# 이벤트 발생
sudo cat /etc/shadow > /dev/null
# 조회
sudo ausearch -k shadow_access -i | tail -20
sudo aureport -x --summary | head # 실행 파일별 요약
아래 출력은 형식 설명용 예시다.
① strace — 권한 없는 파일
openat(AT_FDCWD, "/etc/shadow", O_RDONLY) = -1 EACCES (Permission denied)
= -1 EACCES는 커널이 권한 검사에서 거부했다는 뜻이다. 일반 사용자의 /etc/shadow 접근 시도가 audit 로그에 반복적으로 남는다면 정보 수집(권한 탐색) 행위 를 의심할 수 있다.
② strace -c 요약
% time seconds usecs/call calls errors syscall
xx.xx 0.000xxx x xx getdents64
xx.xx 0.000xxx x xx x openat
어떤 System Call을 많이 쓰는지로 프로그램의 성격(파일 탐색형, 네트워크형)을 빠르게 파악할 수 있다.
③ ausearch -i 결과 읽기
type=PROCTITLE msg=audit(09/23/2026 10:21:07.123:512) : proctitle=cat /etc/shadow
type=PATH ... name=/etc/shadow ... mode=file,000 ouid=root
type=SYSCALL ... syscall=openat success=yes exit=3 auid=roror uid=root
comm=cat exe=/usr/bin/cat key=shadow_access
| 필드 | 의미 | 관제에서의 쓰임 |
|---|---|---|
msg=audit(시각:일련번호) | 이벤트 시각과 ID | 같은 ID의 레코드가 하나의 이벤트 |
syscall | 호출된 System Call | 어떤 행위인가 |
success / exit | 성공 여부, 반환값 | 시도인지 성공인지 |
auid | 최초 로그인 사용자 (sudo 후에도 유지) | 실제 책임 계정 |
uid / euid | 현재 실행 권한 | root로 실행되었는가 |
comm / exe | 프로세스 이름 / 실행 파일 경로 | 어떤 프로그램이 했는가 |
key | 규칙에 붙인 이름 | SIEM 검색·경보 조건 |
auid=roror uid=root는 "roror 계정으로 로그인한 사용자가 sudo로 root 권한을 얻어 실행했다"는 뜻이다. sudo를 거쳐도 원래 사용자를 추적할 수 있다 는 점이 auditd의 가장 큰 장점이다.
| 공격 행위 | 관련 System Call | 탐지 규칙 예 |
|---|---|---|
| 계정 정보 탈취 시도 | openat on /etc/shadow | -w /etc/shadow -p r |
| 백도어 계정 추가 | openat(쓰기), rename on /etc/passwd | -w /etc/passwd -p wa |
| 악성 프로그램 실행 | execve | -S execve -F auid>=1000 |
| 권한 상승 | setuid, setresuid | -S setuid -F a0=0 -F auid>=1000 |
| 증거 삭제 | unlink, unlinkat on /var/log | -w /var/log/ -p wa |
| 루트킷 로드 | init_module, finit_module | 2편 참고 |
System Call 감사는 강력하지만 모든 것을 기록하면 로그가 폭증 한다. 관제 환경에서는 민감 파일, 사용자 세션의 execve, 권한 변경처럼 의미 있는 지점만 골라 규칙을 설계한다.
커널 감사 훅 → auditd → /var/log/audit/audit.log
→ Filebeat(auditd 모듈) 또는 Wazuh agent
→ SIEM 인덱스 → 규칙: key=shadow_access AND auid!=root 계정
→ 경보 → 분석가 확인
[Alert] key=shadow_access, success=no 반복 (auid=webadmin)
↓
[IOC] auid, 시각, exe, 원격 로그인 IP(secure 로그와 시각 대조)
↓
[분석] 같은 auid의 user_exec 이벤트 조회 → 실행 명령 목록 복원
ausearch -k user_exec -ua webadmin -i
↓
[Root Cause] 탈취된 계정으로 권한 탐색 중 / 운영자 실수 구분
↓
[Response] 계정 잠금 및 비밀번호 변경, 해당 IP 차단, 로그 증적 보존
| 실수 | 결과 | 예방 |
|---|---|---|
auditctl로만 규칙 추가 | 재부팅 시 사라짐 | /etc/audit/rules.d/에 파일로 저장 후 augenrules --load |
arch=b64만 지정 | 32비트 호출 누락 | 필요 시 arch=b32 규칙도 추가 |
ausearch 없이 raw 로그만 봄 | UID·시각이 숫자라 해석 어려움 | -i 옵션으로 해석 |
모든 openat 기록 | 로그 폭증, 디스크 부족 | 경로·key 기반으로 범위 제한 |
syscall 명령 → 커널 처리 → 반환 순으로 동작한다.strace는 특정 프로세스 분석용, auditd는 시스템 전체 상시 감사용이다.auid는 sudo를 거쳐도 유지되는 원래 로그인 사용자 다.-w)와 execve 감사로 "누가 무엇을 실행·접근했는가"를 기록한다./etc/audit/rules.d/에 저장해야 재부팅 후에도 유지된다.다음 글 「6. Linux 파일 시스템 구조」 에서는 이번 글의 openat이 커널 안에서 거쳐 가던 VFS와 실제 파일 시스템(xfs, ext4) 을 다룬다. 디스크·파티션·파일 시스템·마운트 포인트의 관계와, /tmp에 noexec 같은 마운트 옵션을 거는 보안상의 이유를 정리한다.