파일 · 권한 · 사용자 관리 03 / 50 · Part 1. Linux 파일 관리 기초
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 7. Linux 디렉터리 구조
Linux 서버에서 침해사고를 조사할 때 가장 먼저 필요한 능력은 "이 파일이 이 위치에 있는 것이 정상인가?" 를 판단하는 것이다. /usr/bin/sshd는 정상이지만 /tmp/.X11/sshd는 의심스럽다. 이 판단의 기준이 디렉터리 구조다.
이번 글에서는 주요 디렉터리의 역할을 정리하고, 한 걸음 더 나아가 각 디렉터리의 기본 권한이 왜 그렇게 설정되어 있는지 를 Rocky Linux 9.8과 Ubuntu 24.04의 실제 출력으로 비교한다. 권한은 결국 "누가 여기에 파일을 만들 수 있어야 하는가"라는 설계 결정의 결과다.
「리눅스 시스템 기초 7편」이 FHS 전체와 usrmerge를 다뤘다면, 이 글은 권한과 보안 점검 경로 에 초점을 맞춘다.
| 경로 | 역할 | 쓰기 권한이 필요한 주체 |
|---|---|---|
/usr | 프로그램·라이브러리·문서 | 패키지 관리자(root)만 |
/etc | 시스템 설정 | root만 |
/home | 일반 사용자 홈 | 각 사용자는 자기 홈 안에서만 |
/root | root 홈 | root만 |
/var | 로그·캐시·스풀·웹 데이터처럼 변하는 데이터 | 서비스별 계정 |
/tmp, /var/tmp | 임시 파일 | 모든 사용자 (단, 남의 파일 삭제는 금지) |
/opt | 서드파티 패키지 | root (설치 시) |
/dev | 장치 파일 | 커널(udev) |
/proc, /sys | 커널 상태를 보여 주는 가상 FS | 커널 |
/run | 실행 중 상태(PID 파일, 소켓) | 서비스 |
디렉터리 권한은 크게 세 패턴으로 나뉜다.
| 패턴 | 권한 | 예 | 의미 |
|---|---|---|---|
| 시스템 영역 | 755 (drwxr-xr-x) root | /usr, /etc, /var | 누구나 읽고 들어갈 수 있지만 쓰기는 root만 |
| 개인 영역 | 700/750/550 | /root, /home/user | 소유자(또는 그룹)만 접근 |
| 공용 쓰기 영역 | 1777 (drwxrwxrwt) | /tmp, /var/tmp, /dev/shm | 누구나 쓰기 + Sticky Bit(t) 로 남의 파일 삭제 금지 (30편) |
| 구분 | /tmp | /var/tmp |
|---|---|---|
| 목적 | 짧은 임시 파일 | 재부팅 후에도 유지되어야 하는 임시 파일 |
정리 규칙 (/usr/lib/tmpfiles.d/tmp.conf) | Rocky: q /tmp ... 10d (10일 경과 파일 정리) · Ubuntu: D /tmp ... 30d (부팅 시 비우고 30일 경과 정리) | Rocky: q /var/tmp ... 30d · Ubuntu: 기본 규칙이 주석 처리되어 자동 정리 안 됨 |
| 보안 의미 | 공격 도구 임시 저장 | 재부팅 후에도 남는 공격 도구 저장 위치 |

디렉터리 권한은 파일 생성 가능 여부를 직접 결정한다. 사용자가 /etc/evil.conf를 만들려고 하면 커널은 /etc 디렉터리 inode의 권한 을 검사한다. /etc는 drwxr-xr-x root root이므로 일반 사용자는 w가 없어 생성이 거부된다.
반대로 /tmp는 drwxrwxrwt로 모든 사용자에게 w가 있다. 그래서 권한이 없는 공격자가 처음 발판을 만들 수 있는 곳 이 /tmp, /var/tmp, /dev/shm이다. 웹 서버 취약점으로 명령 실행에 성공한 공격자는 대부분 apache·www-data 같은 서비스 계정 권한을 갖는데, 이 계정이 쓸 수 있는 곳이 바로 이 공용 쓰기 영역이다.
Rocky와 Ubuntu에서 /root 권한이 다른 것도 설계 차이다.
| 배포판 | /root 권한 | 의미 |
|---|---|---|
| Rocky 9 | dr-xr-x--- (550) | root 그룹도 읽기·통과 가능, 쓰기 비트는 없지만 root는 권한 검사를 우회함 |
| Ubuntu 24.04 | drwx------ (700) | root만 접근 |
# 1) usrmerge: /bin, /sbin, /lib 이 /usr 로 향하는 링크인지
ls -l / | grep -E ' (bin|sbin|lib|lib64) '
# 2) 주요 디렉터리 권한 한 번에 보기 (-d: 디렉터리 자체)
ls -ld /etc /home /root /tmp /var /var/tmp /usr /opt /dev/shm
# 3) 로그 디렉터리 구성 비교
ls /var/log
# 4) 배포판 고유 설정 디렉터리
ls -ld /etc/sysconfig /etc/pki # Rocky
ls -ld /etc/default /etc/apt # Ubuntu
# 5) 가상 파일 시스템 (크기 0 으로 보임)
ls -ld /proc /sys /run
Rocky Linux 9.8

Ubuntu 24.04.5

텍스트 원본(실제 출력) — Rocky:
[analyst@rocky9-lab ~]$ ls -l / | grep -E ' (bin|sbin|lib|lib64) '
lrwxrwxrwx 1 root root 7 Nov 3 2024 bin -> usr/bin
lrwxrwxrwx 1 root root 7 Nov 3 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2024 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 8 Nov 3 2024 sbin -> usr/sbin
[analyst@rocky9-lab ~]$ ls -ld /etc /home /root /tmp /var /var/tmp /usr /opt /dev/shm
drwxrwxrwt 2 root root 40 Sep 24 10:15 /dev/shm
drwxr-xr-x 1 root root 4096 Sep 24 10:15 /etc
drwxr-xr-x 1 root root 4096 Sep 24 10:15 /home
drwxr-xr-x 2 root root 4096 May 16 2022 /opt
dr-xr-x--- 1 root root 4096 Sep 24 10:12 /root
drwxrwxrwt 1 root root 4096 Sep 24 10:15 /tmp
drwxr-xr-x 1 root root 4096 Sep 24 10:11 /usr
drwxr-xr-x 1 root root 4096 Sep 24 10:11 /var
drwxrwxrwt 2 root root 4096 Nov 20 2023 /var/tmp
[analyst@rocky9-lab ~]$ ls /var/log
README
anaconda
btmp
dnf.librepo.log
dnf.log
dnf.rpm.log
hawkey.log
lastlog
maillog
messages
private
secure
spooler
wtmp
[analyst@rocky9-lab ~]$ ls -ld /etc/sysconfig /etc/pki
drwxr-xr-x 1 root root 4096 Sep 24 10:12 /etc/pki
drwxr-xr-x 1 root root 4096 Sep 24 10:12 /etc/sysconfig
[analyst@rocky9-lab ~]$ ls -ld /proc /sys /run
dr-xr-xr-x 86 root root 0 Sep 24 10:15 /proc
drwxr-xr-x 1 root root 4096 Sep 24 10:12 /run
dr-xr-xr-x 12 root root 0 Sep 24 10:15 /sys
텍스트 원본(실제 출력) — Ubuntu:
analyst@ubuntu-lab:~$ ls -l / | grep -E ' (bin|sbin|lib|lib64) '
lrwxrwxrwx 1 root root 7 Apr 22 2024 bin -> usr/bin
lrwxrwxrwx 1 root root 7 Apr 22 2024 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Apr 22 2024 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 8 Apr 22 2024 sbin -> usr/sbin
analyst@ubuntu-lab:~$ ls -ld /etc /home /root /tmp /var /var/tmp /usr /opt /dev/shm
drwxrwxrwt 2 root root 40 Sep 24 10:15 /dev/shm
drwxr-xr-x 1 root root 4096 Sep 24 10:15 /etc
drwxr-xr-x 1 root root 4096 Sep 24 10:15 /home
drwxr-xr-x 2 root root 4096 Sep 11 11:03 /opt
drwx------ 1 root root 4096 Sep 24 10:10 /root
drwxrwxrwt 1 root root 4096 Sep 24 10:15 /tmp
drwxr-xr-x 1 root root 4096 Sep 11 11:03 /usr
drwxr-xr-x 1 root root 4096 Sep 11 11:10 /var
drwxrwxrwt 2 root root 4096 Sep 11 11:10 /var/tmp
analyst@ubuntu-lab:~$ ls /var/log
README
alternatives.log
apt
bootstrap.log
btmp
dpkg.log
faillog
journal
lastlog
private
wtmp
analyst@ubuntu-lab:~$ ls -ld /etc/default /etc/apt
drwxr-xr-x 8 root root 4096 Sep 11 11:03 /etc/apt
drwxr-xr-x 1 root root 4096 Sep 24 10:10 /etc/default
analyst@ubuntu-lab:~$ ls -ld /proc /sys /run
dr-xr-xr-x 86 root root 0 Sep 24 10:15 /proc
drwxr-xr-x 1 root root 4096 Sep 24 10:10 /run
dr-xr-xr-x 12 root root 0 Sep 24 10:15 /sys
| 출력 | 해석 |
|---|---|
bin -> usr/bin (양쪽 공통) | 두 배포판 모두 usrmerge 적용. /bin/ls와 /usr/bin/ls는 같은 파일이다 |
drwxrwxrwt ... /tmp | 누구나 쓰기(rwx × 3) + 마지막 t = Sticky Bit |
drwxrwxrwt ... /dev/shm | 메모리 기반 공용 쓰기 영역. 크기 40은 tmpfs 디렉터리 크기 표기 |
Rocky dr-xr-x--- /root | 550. 소유자 칸에도 w가 없지만 root는 쓰기 검사를 우회하므로 문제없다 |
Ubuntu drwx------ /root | 700. 다른 사용자는 목록도, 통과도 불가 |
Rocky /var/log에 secure, messages | 인증 로그는 secure, 일반 로그는 messages |
Ubuntu /var/log에 auth.log 없음 | 이 컨테이너에는 rsyslog가 실행되지 않아 아직 파일이 없다. 일반 Ubuntu 서버에서는 auth.log, syslog가 생성된다 |
/proc, /sys 크기 0 | 디스크가 아니라 커널이 요청 시점에 만들어 보여 주는 가상 파일 |
링크 날짜 Nov 3 2024(Rocky) / Apr 22 2024(Ubuntu) | 컨테이너 이미지가 만들어진 시점. 실제 서버에서는 OS 설치 시점과 비교해 최근에 바뀐 시스템 디렉터리 를 찾는 기준이 된다 |
이 결과는 Docker 컨테이너에서 얻은 것이다. VM이나 물리 서버의
/var/log에는 더 많은 파일(boot.log,cron,audit/등)이 존재한다.
| 위치 | 정상 | 의심 |
|---|---|---|
/tmp, /var/tmp, /dev/shm | 짧게 쓰고 지워지는 임시 파일 | 실행 파일(ELF), 스크립트, 숨김 디렉터리(.x, ...) |
/etc | 패키지가 설치한 설정 | 최근 변경된 passwd, sudoers.d/*, cron.d/* |
/usr/bin, /usr/sbin | 패키지 소유 파일 | 패키지에 속하지 않은 실행 파일 (rpm -qf, dpkg -S로 확인, 20편) |
/var/www | 웹 콘텐츠 | 업로드 폴더 안의 .php, .jsp |
/home/*/.ssh | 본인이 등록한 키 | 최근 추가된 authorized_keys 항목 |
공용 쓰기 디렉터리에 파일이 있다는 것만으로 침해라고 판단하지 않는다. 패키지 설치, 브라우저, 컴파일러도 /tmp를 사용한다. 실행 파일 여부, 소유 계정, 생성 시점, 실행 이력 을 함께 확인한다.
[Detection] EDR 알림: /dev/shm/.k 실행 (user=apache)
↓
[위치 판단] /dev/shm = 누구나 쓰기 가능한 메모리 FS → 웹 계정이 쓸 수 있는 몇 안 되는 경로
↓
[Evidence] ls -la /dev/shm, stat /dev/shm/.k, sha256sum, file
↓
[연관 로그] 웹 액세스 로그의 같은 시간대 요청 (업로드·명령 실행 흔적)
↓
[Response] 파일 보존 → 프로세스 확인 → 웹 취약점 경로 차단
| 관제 포인트 | 설명 |
|---|---|
| IOC 경로 | 위협 인텔리전스 보고서의 "파일 경로" IOC는 대부분 /tmp, /var/tmp, /dev/shm, 숨김 디렉터리다 |
| SIEM 규칙 | 공용 쓰기 경로에서의 execve 이벤트는 탐지 가치가 높다 (auditd -F dir=/tmp) |
| Baseline | 시스템 디렉터리의 권한·소유자를 기준값으로 저장해 두고 변경을 비교한다 |
| Ubuntu/Rocky | 인증 로그 위치가 다르므로 SIEM 수집 경로를 배포판별로 설정해야 한다 |
| 실수 | 결과 | 예방 |
|---|---|---|
앱이 안 된다고 /var/www를 777로 변경 | 웹셸 업로드 가능 | 업로드 폴더만 서비스 계정 쓰기 허용 (45편) |
/tmp 권한을 777로 되돌림 (Sticky 누락) | 남의 파일 삭제·교체 가능 | 반드시 1777 |
서드파티 프로그램을 /usr/bin에 직접 복사 | 패키지 무결성 검사와 혼동 | /usr/local 또는 /opt 사용 |
| Rocky와 Ubuntu 로그 경로를 같은 것으로 가정 | SIEM 수집 누락 | 배포판별 경로 문서화 |
운영 서버에서 /etc 파일로 실습 | 설정 손상 | 복사본으로 실습 |
[ ] /bin 이 /usr/bin 을 가리키는 링크임을 확인했다
[ ] ls -ld 로 /etc, /tmp, /root 의 권한을 확인했다
[ ] /tmp 의 마지막 t (Sticky Bit) 를 찾았다
[ ] Rocky 와 Ubuntu 의 /root 권한 차이를 확인했다
[ ] 인증 로그 경로(secure / auth.log) 차이를 정리했다
[ ] 공용 쓰기 경로 3곳(/tmp, /var/tmp, /dev/shm) 을 말할 수 있다
/usr, /etc, /var)은 755 root — 읽기는 모두, 쓰기는 root만./tmp, /var/tmp, /dev/shm)은 1777 — 권한 없는 공격자의 첫 발판이 되는 위치다./root는 Rocky 550, Ubuntu 700으로 배포판마다 다르다./var/log/secure, Ubuntu /var/log/auth.log다.다음 글 「04. 절대경로와 상대경로」 에서는 /, ., .., ~이 커널과 쉘에서 어떻게 해석되는지, 그리고 PATH 환경변수의 순서가 어떻게 명령어 하이재킹으로 이어지는지 를 직접 재현한다.