파일 · 권한 · 사용자 관리 22 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 15. Linux 파일 권한 이해
21편에서 권한은 r·w·x 세 비트라고 했다. 그런데 이 세 비트는 파일과 디렉터리에서 전혀 다른 것을 의미 한다. 이 차이를 정확히 모르면 다음과 같은 상황을 설명할 수 없다.
이번 글에서는 이 세 가지를 모두 실습으로 재현한다. 특히 마지막 — 파일 삭제 권한이 파일이 아니라 상위 디렉터리의 w 에서 나온다는 사실은 Sticky Bit(30편)와 권한 설계의 핵심 근거다.
| 권한 | 파일 | 디렉터리 |
|---|---|---|
r | 내용 읽기 | 안의 이름 목록 조회 (ls) |
w | 내용 수정 | 안에서 파일 생성·삭제·이름 변경 |
x | 프로그램 실행 | 디렉터리 안으로 진입·통과 (cd, 경로 접근) |
디렉터리에서 w가 "안의 파일을 만들고 지우는 권한"이라는 점이 핵심이다. 파일을 삭제할 수 있는지는 그 파일 이 아니라 파일이 든 디렉터리 의 w가 결정한다.
디렉터리의 r(목록 조회)과 x(진입)는 별개다. 네 가지 조합이 가능하다.
| 디렉터리 권한 | ls (r) | cd·파일접근 (x) |
|---|---|---|
r-x (5) | 가능 | 가능 |
r-- (4) | 목록만, 파일 열기 불가 | 불가 |
--x (1) | 목록 불가, 이름 알면 접근 | 가능 |
--- (0) | 불가 | 불가 |

디렉터리는 "이름 → inode 번호" 목록을 담은 파일이다(01편). 이 관점에서 권한을 다시 보면 자연스럽다.
r(목록 읽기): 디렉터리의 데이터 블록(이름 목록)을 읽는 권한. ls가 이걸 쓴다.x(통과): 목록에서 특정 이름의 inode 번호를 찾아 다음 단계로 진행 하는 권한. cd와 경로 해석이 이걸 쓴다.w(수정): 목록에 항목을 추가·제거 하는 권한. 파일 생성·삭제·이름 변경이 곧 목록 수정이다.그래서 파일 삭제(unlink)는 파일 내용을 건드리지 않는다. 디렉터리의 이름 목록에서 항목 하나를 지우는 작업 이다. 파일이 읽기 전용(444)이든 아니든 상관없이, 상위 디렉터리에 w가 있으면 삭제된다.
--x만 있고 r이 없는 경우도 이 구조로 설명된다. 목록은 못 읽지만(r 없음), 이름을 정확히 알면 그 이름의 inode로 통과할 수 있다(x 있음). 그래서 cat enterable/known.txt는 성공한다.
listable(744)과enterable(711)은 root 소유다.analyst는 other 칸이 적용된다.box(777) 안의ro.txt(444)는 root 소유의 읽기 전용 파일이다.
cd /data/lab22
# 1) r만 있는 디렉터리 (744) — 목록은 되지만 파일 열기 실패
ls -ld listable enterable
ls listable
cat listable/a.txt # Permission denied (x 없음)
# 2) x만 있는 디렉터리 (711) — 목록 실패, 이름 알면 성공
ls enterable # Permission denied (r 없음)
cat enterable/known.txt # 이름을 알면 열림 (x 있음)
# 3) 읽기 전용 파일이 삭제되는 이유
ls -l box/ro.txt # -r--r--r-- (444)
echo "try append" >> box/ro.txt # Permission denied (파일 w 없음)
rm -f box/ro.txt # 삭제 성공 (디렉터리 box 가 777)
ls box

텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ cd /data/lab22
[analyst@rocky9-lab lab22]$ ls -ld listable enterable
drwx--x--x 2 root root 4096 Sep 24 10:50 enterable
drwxr--r-- 2 root root 4096 Sep 24 10:50 listable
[analyst@rocky9-lab lab22]$ echo "== listable(744): other=r-- =="
== listable(744): other=r-- ==
[analyst@rocky9-lab lab22]$ ls listable
a.txt
[analyst@rocky9-lab lab22]$ cat listable/a.txt
cat: listable/a.txt: Permission denied
[analyst@rocky9-lab lab22]$ echo "== enterable(711): other=--x =="
== enterable(711): other=--x ==
[analyst@rocky9-lab lab22]$ ls enterable
ls: cannot open directory 'enterable': Permission denied
[analyst@rocky9-lab lab22]$ cat enterable/known.txt
B
[analyst@rocky9-lab lab22]$ echo "== 읽기전용 파일이지만 디렉터리가 777 =="
== 읽기전용 파일이지만 디렉터리가 777 ==
[analyst@rocky9-lab lab22]$ ls -l box/ro.txt
-r--r--r-- 1 root root 17 Sep 24 10:50 box/ro.txt
[analyst@rocky9-lab lab22]$ echo "try append" >> box/ro.txt
-bash: box/ro.txt: Permission denied
[analyst@rocky9-lab lab22]$ rm -f box/ro.txt && echo "삭제 성공 (파일이 아니라 디렉터리 w 로 결정)"
삭제 성공 (파일이 아니라 디렉터리 w 로 결정)
[analyst@rocky9-lab lab22]$ ls box
| 출력 | 해석 |
|---|---|
drwxr--r-- listable | other 칸 r--(4). 목록 읽기만 가능 |
ls listable → a.txt | r이 있어 이름 목록은 보인다 |
cat listable/a.txt → Permission denied | x가 없어 파일로 진입(통과) 할 수 없다 |
drwx--x--x enterable | other 칸 --x(1). 통과만 가능 |
ls enterable → Permission denied | r이 없어 목록을 못 읽는다 |
cat enterable/known.txt → B | 이름을 알면 x로 통과해 접근 성공 |
-r--r--r-- box/ro.txt | 파일은 읽기 전용(444) |
echo >> box/ro.txt → Permission denied | 파일 w가 없어 내용 수정 불가 |
rm -f box/ro.txt → 삭제 성공 | 파일 권한과 무관. 상위 box가 777이라 삭제 가능 |
세 번째 블록이 이번 글의 핵심이다. 같은 파일에 대해 내용 수정은 거부되고 삭제는 성공 한다. 삭제는 파일이 아니라 디렉터리를 수정하는 작업이기 때문이다.
| 상황 | 위험 | 대응 |
|---|---|---|
| 로그 디렉터리가 그룹·기타 쓰기 가능 | 로그 파일이 읽기 전용이어도 삭제·교체 가능 | 로그 디렉터리 권한 축소, append-only(chattr +a) |
공용 디렉터리(/tmp)의 삭제 문제 | 누구나 남의 파일 삭제 가능 | Sticky Bit(30편)로 소유자만 삭제하게 제한 |
--x 디렉터리로 "은닉" | 목록은 못 보지만 이름 추측 시 접근 | 은닉일 뿐 보안 아님. 실제 보호는 권한·소유자 |
홈 디렉터리 other x | 경로를 알면 하위 파일 접근 경로 열림 | 홈 디렉터리 700/750 |
웹 루트 디렉터리 w | 웹 계정이 파일 생성·교체 → 웹셸 | 업로드 폴더만 제한적 쓰기 |
핵심 원칙: 민감 파일을 보호하려면 파일 권한만으로 부족하다. 상위 디렉터리의 w와 경로상의 x까지 함께 통제 해야 한다.
[점검] 로그·설정 디렉터리의 쓰기 권한
find /var/log /etc -xdev -type d -perm -o+w -o -perm -g+w 2>/dev/null
↓
[판단] 읽기 전용 로그 파일이라도 디렉터리 w 가 열려 있으면 삭제·교체 가능
↓
[강화] 로그 파일 append-only: chattr +a /var/log/secure
디렉터리 권한 축소, Sticky Bit 확인
↓
[Detection] 로그 삭제·교체는 auditd unlink/rename 규칙으로 (10편)
| 관점 | 내용 |
|---|---|
| 경로 전체 점검 | 파일 하나가 아니라 경로 전체의 권한을 본다. namei -l /path/to/file로 상위 디렉터리 권한까지 확인 |
| 삭제 방어 | 중요한 파일은 상위 디렉터리 권한 + chattr +a(추가만 허용)로 삭제·변조를 막는다 |
| Investigation | "파일 권한이 444였는데 삭제됐다"는 모순은 디렉터리 w로 설명된다. 조사 시 디렉터리 권한도 기록 |
| 실수 | 결과 | 예방 |
|---|---|---|
| 파일을 444로 만들면 삭제도 막힌다고 생각 | 디렉터리 w로 삭제됨 | 상위 디렉터리 권한 함께 통제 |
디렉터리에 x 없이 r만 부여 | 목록은 보이나 파일 접근 불가 | 접근이 필요하면 r-x |
--x 디렉터리를 보안 수단으로 사용 | 이름 추측 시 접근 | 실제 보호는 권한·소유자 |
| 홈 디렉터리를 755로 방치 | 경로 통과로 하위 노출 | 700/750 |
| 로그 삭제 방지를 파일 권한으로만 | 디렉터리 w로 우회 | chattr +a, 원격 전송(10편) |
[ ] 디렉터리의 r/w/x 가 파일과 다른 의미임을 설명할 수 있다
[ ] r만 있는 디렉터리에서 목록은 되지만 파일 열기가 안 됨을 확인했다
[ ] x만 있는 디렉터리에서 이름을 알면 접근됨을 확인했다
[ ] 읽기 전용 파일이 디렉터리 w 때문에 삭제되는 것을 재현했다
[ ] 파일 삭제 권한이 상위 디렉터리에서 나온다는 것을 이해했다
[ ] namei -l 로 경로 전체 권한을 점검하는 방법을 안다
r은 목록, w는 생성·삭제·이름 변경, x는 진입·통과다.r과 x는 독립적이다. r만 있으면 목록만, x만 있으면 이름을 알 때만 접근된다.w 에서 나온다.w가 있으면 삭제된다.x + chattr +a를 함께 고려한다.다음 글 「23. chmod 기호 방식」 에서는 u·g·o·a와 +·-·=를 조합해 권한을 세밀하게 조정하는 방법, 그리고 파일에는 실행 권한을 주지 않으면서 디렉터리에만 x를 부여하는 대문자 X 옵션을 실습한다.