파일 · 권한 · 사용자 관리 03 / 50 · Part 1. Linux 파일 관리 기초
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 7. Linux 디렉터리 구조

1. 들어가며

Linux 서버에서 침해사고를 조사할 때 가장 먼저 필요한 능력은 "이 파일이 이 위치에 있는 것이 정상인가?" 를 판단하는 것이다. /usr/bin/sshd는 정상이지만 /tmp/.X11/sshd는 의심스럽다. 이 판단의 기준이 디렉터리 구조다.

이번 글에서는 주요 디렉터리의 역할을 정리하고, 한 걸음 더 나아가 각 디렉터리의 기본 권한이 왜 그렇게 설정되어 있는지 를 Rocky Linux 9.8과 Ubuntu 24.04의 실제 출력으로 비교한다. 권한은 결국 "누가 여기에 파일을 만들 수 있어야 하는가"라는 설계 결정의 결과다.

「리눅스 시스템 기초 7편」이 FHS 전체와 usrmerge를 다뤘다면, 이 글은 권한과 보안 점검 경로 에 초점을 맞춘다.


2. 핵심 개념

2-1. FHS와 주요 디렉터리

경로역할쓰기 권한이 필요한 주체
/usr프로그램·라이브러리·문서패키지 관리자(root)만
/etc시스템 설정root만
/home일반 사용자 홈각 사용자는 자기 홈 안에서만
/rootroot 홈root만
/var로그·캐시·스풀·웹 데이터처럼 변하는 데이터서비스별 계정
/tmp, /var/tmp임시 파일모든 사용자 (단, 남의 파일 삭제는 금지)
/opt서드파티 패키지root (설치 시)
/dev장치 파일커널(udev)
/proc, /sys커널 상태를 보여 주는 가상 FS커널
/run실행 중 상태(PID 파일, 소켓)서비스

2-2. 세 가지 권한 패턴

디렉터리 권한은 크게 세 패턴으로 나뉜다.

패턴권한예의미
시스템 영역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편)

2-3. /var/tmp와 /tmp의 차이

구분/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: 기본 규칙이 주석 처리되어 자동 정리 안 됨
보안 의미공격 도구 임시 저장재부팅 후에도 남는 공격 도구 저장 위치

3. 동작 원리

Linux 디렉터리 구조와 기본 권한

디렉터리 권한은 파일 생성 가능 여부를 직접 결정한다. 사용자가 /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 9dr-xr-x--- (550)root 그룹도 읽기·통과 가능, 쓰기 비트는 없지만 root는 권한 검사를 우회함
Ubuntu 24.04drwx------ (700)root만 접근

4. 명령어 실습

# 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

5. 실행 결과

Rocky Linux 9.8

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — 주요 디렉터리 권한

Ubuntu 24.04.5

실제 실행 결과 — Ubuntu 24.04.5 · analyst@ubuntu-lab — 주요 디렉터리 권한

텍스트 원본(실제 출력) — 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

6. 결과 해석

출력해석
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--- /root550. 소유자 칸에도 w가 없지만 root는 쓰기 검사를 우회하므로 문제없다
Ubuntu drwx------ /root700. 다른 사용자는 목록도, 통과도 불가
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/ 등)이 존재한다.


7. 보안 관점

위치정상의심
/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를 사용한다. 실행 파일 여부, 소유 계정, 생성 시점, 실행 이력 을 함께 확인한다.


8. 보안관제 관점

[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 수집 경로를 배포판별로 설정해야 한다

9. 실무에서 자주 발생하는 실수

실수결과예방
앱이 안 된다고 /var/www를 777로 변경웹셸 업로드 가능업로드 폴더만 서비스 계정 쓰기 허용 (45편)
/tmp 권한을 777로 되돌림 (Sticky 누락)남의 파일 삭제·교체 가능반드시 1777
서드파티 프로그램을 /usr/bin에 직접 복사패키지 무결성 검사와 혼동/usr/local 또는 /opt 사용
Rocky와 Ubuntu 로그 경로를 같은 것으로 가정SIEM 수집 누락배포판별 경로 문서화
운영 서버에서 /etc 파일로 실습설정 손상복사본으로 실습

10. 실습 체크리스트

[ ] /bin 이 /usr/bin 을 가리키는 링크임을 확인했다
[ ] ls -ld 로 /etc, /tmp, /root 의 권한을 확인했다
[ ] /tmp 의 마지막 t (Sticky Bit) 를 찾았다
[ ] Rocky 와 Ubuntu 의 /root 권한 차이를 확인했다
[ ] 인증 로그 경로(secure / auth.log) 차이를 정리했다
[ ] 공용 쓰기 경로 3곳(/tmp, /var/tmp, /dev/shm) 을 말할 수 있다

11. 핵심 정리

  • 디렉터리 구조는 "이 파일이 여기 있는 것이 정상인가" 를 판단하는 기준이다.
  • 시스템 영역(/usr, /etc, /var)은 755 root — 읽기는 모두, 쓰기는 root만.
  • 공용 쓰기 영역(/tmp, /var/tmp, /dev/shm)은 1777 — 권한 없는 공격자의 첫 발판이 되는 위치다.
  • /root는 Rocky 550, Ubuntu 700으로 배포판마다 다르다.
  • 인증 로그는 Rocky /var/log/secure, Ubuntu /var/log/auth.log다.
  • 공용 쓰기 경로에 파일이 있다는 사실만으로 침해로 단정하지 않는다. 형식·소유자·시점·실행 이력을 함께 본다.

12. 다음 편 예고

다음 글 「04. 절대경로와 상대경로」 에서는 /, ., .., ~이 커널과 쉘에서 어떻게 해석되는지, 그리고 PATH 환경변수의 순서가 어떻게 명령어 하이재킹으로 이어지는지 를 직접 재현한다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글