리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 7 / 50 · Part 1. Linux 기본 구조
실습 환경: Rocky Linux 9 (10.0.0.200) · 비교: Ubuntu 22.04
이전 글: 6. Linux 파일 시스템 구조
🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 03. Linux 디렉터리 구조 이해
1편에서 /etc, /var/log, /home, /tmp, /proc을 관제 핵심 경로로 소개했다. 이번 글은 범위를 넓혀 Linux 디렉터리 전체가 어떤 원칙으로 나뉘어 있는지(FHS) 를 정리하고, 이를 바탕으로 침해사고 분석 시 어떤 순서로 디렉터리를 확인하는지 까지 연결한다.
디렉터리 구조를 원칙으로 이해하면 처음 보는 서버에서도 "설정은 어디에, 로그는 어디에, 이 프로그램은 왜 여기에 있지?"를 빠르게 판단할 수 있다. 특히 정상적으로는 파일이 생기지 않아야 할 위치에 파일이 있는 것 자체가 중요한 탐지 단서가 된다.
FHS는 Linux Foundation이 관리하는 디렉터리 배치 표준 이다. 배포판마다 약간의 차이는 있지만, 대부분 이 표준을 따른다. 매뉴얼 man hier에서도 요약을 볼 수 있다.
| 디렉터리 | 역할 | 대표 내용 | 관제 포인트 |
|---|---|---|---|
/boot | 부팅 파일 | vmlinuz-*, initramfs-*, grub2/ | 커널·부트 설정 변조 |
/dev | 장치 파일 | sda, null, tty*, shm/ | /dev 안의 일반 파일(은닉 의심) |
/etc | 시스템 설정 | passwd, shadow, ssh/, sudoers | 설정 변조, 지속성 |
/home | 사용자 홈 | /home/roror | 사용자 행위 흔적 |
/root | root 홈 | .bash_history, .ssh/ | 관리자 계정 흔적 |
/usr | 프로그램·라이브러리 | bin/, sbin/, lib64/, share/ | 시스템 바이너리 교체 |
/usr/local | 로컬 설치 프로그램 | 직접 빌드한 프로그램 | 패키지 관리 밖 프로그램 |
/opt | 추가 패키지 | 상용 소프트웨어 | 출처 확인 |
/var | 변하는 데이터 | log/, lib/, spool/, tmp/, www/ | 로그·예약작업·웹 루트 |
/tmp | 임시 파일 | 모든 사용자 쓰기 가능 | 공격 도구 저장 |
/run | 실행 상태 (tmpfs) | PID 파일, 소켓 | 재부팅 시 소멸 |
/proc, /sys | 커널 가상 FS | 프로세스·장치 정보 | 실시간 상태 |
/srv | 서비스 데이터 | 웹·FTP 데이터 (선택) | |
/mnt, /media | 임시·이동식 마운트 | USB, ISO | 외부 저장장치 |
/lib/modules | 커널 모듈 | $(uname -r)/kernel/ | 모듈 출처(2편) |
Rocky Linux 9, Ubuntu 22.04 이후는 /bin, /sbin, /lib, /lib64가 각각 /usr/bin, /usr/sbin, /usr/lib, /usr/lib64를 가리키는 심볼릭 링크 다. 과거 자료에서 /bin/ls와 /usr/bin/ls를 별개로 설명하는 경우가 있는데, 지금은 같은 파일이다.

FHS는 디렉터리를 두 기준으로 나눈다.
| 기준 | 의미 |
|---|---|
| Shareable / Unshareable | 여러 서버가 네트워크로 공유할 수 있는가, 이 서버 전용인가 |
| Static / Variable | 관리자 개입 없이는 변하지 않는가, 운영 중 계속 변하는가 |
이 분류가 관제에 주는 의미는 "어디가 변하는 것이 정상인가" 를 알려준다는 점이다.
/usr, /etc, /boot)이 변경 → 패키지 업데이트나 관리자 작업이 아니라면 변조를 의심한다./var/log, /run) 은 계속 변하는 것이 정상이다. 대신 변하지 않거나 줄어드는 것 (로그 크기 감소, 기록 공백)이 이상 징후다.# 1) 최상위 구조와 usrmerge 확인
ls -l /
man hier # FHS 요약 매뉴얼
# 2) 디렉터리별 용량 (최상위)
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h
# 3) /var 하위 구조
ls -l /var
sudo du -sh /var/log /var/lib /var/cache 2>/dev/null
# 4) 최근 24시간 내 변경된 /etc 파일
sudo find /etc -type f -mtime -1 -ls
# 5) /dev 안의 일반 파일 (정상적으로는 거의 없음)
sudo find /dev -type f 2>/dev/null
# 6) 패키지 관리 밖의 실행 파일 — /usr/local, /opt
ls -la /usr/local/bin /opt
# 7) 패키지 무결성 검증 (RHEL 계열)
sudo rpm -Va 2>/dev/null | grep -E '^..5' | head
# Ubuntu: sudo apt install debsums && sudo debsums -s
아래 출력은 형식 설명용 예시다.
① ls -l /
lrwxrwxrwx. 1 root root 7 ... bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 ... boot
drwxr-xr-x. 81 root root 8192 ... etc
drwxrwxrwt. 12 root root 4096 ... tmp
| 표시 | 의미 |
|---|---|
l + -> | 심볼릭 링크 (usrmerge) |
drwxrwxrwt | /tmp — 모두 쓰기 가능 + Sticky Bit(t) |
권한 뒤의 . | SELinux 보안 컨텍스트가 있음 (RHEL 계열, 47편) |
② rpm -Va 결과 읽기
S.5....T. c /etc/ssh/sshd_config
..5....T. /usr/bin/xxx
| 위치 | 문자 | 의미 |
|---|---|---|
| 1번째 | S | 크기(Size)가 패키지 원본과 다름 |
| 3번째 | 5 | 내용 해시가 다름 |
| 8번째 | T | 수정 시각이 다름 |
| 파일 앞 | c | 설정 파일 (변경이 흔함) |
c가 붙은 설정 파일은 관리자가 수정하는 것이 일반적이지만, c가 없는 /usr/bin 바이너리의 해시가 다르다면 시스템 명령어가 교체되었을 가능성을 의심해야 한다.
| 위치 | 공격자가 노리는 이유 | 대표 흔적 |
|---|---|---|
/etc | 계정·권한·서비스 설정을 바꿔 재접속 경로 확보 | passwd 새 계정, sudoers.d/ 새 파일 |
/var/spool/cron, /etc/cron.* | 주기적 재실행 | 모르는 스크립트 등록 |
/etc/systemd/system | 부팅 시 자동 실행 서비스 | 새 .service 파일 |
/usr/bin, /usr/sbin | ps, ss 같은 명령어를 교체해 결과를 숨김 | rpm -Va 해시 불일치 |
/tmp, /var/tmp, /dev/shm | 권한 없는 계정도 쓰기 가능 | 숨김 디렉터리, ELF 파일 |
/dev | 장치 파일 사이에 일반 파일을 숨김 | find /dev -type f |
/var/www | 웹 루트에 웹셸 업로드 | 최근 생성된 .php, .jsp |
증적은 사라지기 쉬운 것부터 수집하는 것이 원칙이다(RFC 3227의 휘발성 순서 개념).
| 순서 | 대상 | 이유 | 대표 명령 |
|---|---|---|---|
| 1 | /proc, /run, /dev/shm | 재부팅·프로세스 종료 시 소멸 | ps, ss, ls -l /proc/*/exe |
| 2 | /tmp, /var/tmp | 정리 작업(tmpfiles)으로 삭제될 수 있음 | ls -la, find -newer |
| 3 | /var/log | 로테이션·덮어쓰기 | 사본 + sha256sum |
| 4 | /etc, cron, systemd | 변조 여부 | find -mtime, rpm -Va |
| 5 | /home, /root | 사용자 흔적 | history, .ssh |
| 6 | /usr, /opt, /boot | 바이너리 무결성 | rpm -Va |
평소 상태를 저장해 두면 이상 여부를 빠르게 판단할 수 있다.
# 평소 상태 저장
sudo find /etc /usr/bin /usr/sbin -type f -exec sha256sum {} + > /root/baseline_$(date +%F).txt
# 사고 시 비교
sudo find /etc /usr/bin /usr/sbin -type f -exec sha256sum {} + > /tmp/now.txt
diff <(sort -k2 /root/baseline_2026-09-23.txt) <(sort -k2 /tmp/now.txt)
이 방식을 체계화한 것이 40편 이후에 다룰 파일 무결성 점검(Tripwire, AIDE, Wazuh FIM) 이다.
/usr, /etc, /boot) 변경은 변조 의심, Variable 영역(/var/log)은 줄어들거나 멈추는 것 이 이상 징후다./bin, /sbin, /lib가 /usr 하위의 링크다(usrmerge)./etc(설정), cron·systemd(지속성), /usr/bin(명령어 교체), /tmp(작업 공간)를 노린다.rpm -Va로 패키지 원본 대비 변경된 파일을 찾을 수 있다.다음 글 「8. Linux 부팅 과정」 에서는 전원을 켠 순간부터 로그인 화면까지 /boot, GRUB, 커널, systemd가 어떤 순서로 동작하는지 정리한다. 부팅 단계별로 공격자가 끼어들 수 있는 지점과, 예상치 못한 재부팅을 관제에서 어떻게 확인하는지도 함께 다룬다.