리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 15 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200) · 비교: Ubuntu 22.04
이전 글: 14. inode와 파일 시스템
🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 21. Linux 파일 권한의 기본 구조 · 22. 파일과 디렉터리의 권한 차이
5편에서 커널이 VFS 단계에서 권한을 검사한다고 했고, 14편에서 권한이 inode에 저장된다는 것을 봤다. 이번 글은 그 권한 자체, 즉 rwxr-x---가 정확히 무엇을 허용하는지 를 다룬다.
권한은 Linux 보안의 가장 기본 방어선이다. 침해사고의 상당수는 권한 설정 실수에서 시작된다.
이번 글에서는 권한의 의미와 검사 순서를 정리하고, 다음 16·17편에서 chmod, chown으로 실제 권한을 관리한다.
-rwxr-x--- 1 roror dev 2048 Sep 23 11:20 report.sh
│└┬┘└┬┘└┬┘ └─┬─┘ └┬┘
│ │ │ │ │ └ 그룹
│ │ │ │ └ 소유자
│ │ │ └ 기타(other) 권한
│ │ └ 그룹(group) 권한
│ └ 소유자(user) 권한
└ 파일 종류 (13편)
| 기호 | 숫자 | 의미 |
|---|---|---|
r | 4 | 읽기 |
w | 2 | 쓰기 |
x | 1 | 실행 / 통과 |
- | 0 | 권한 없음 |
세 칸을 숫자로 더하면 8진수 표기가 된다. rwxr-x--- = 7·5·0 = 750.
| 권한 | 파일 | 디렉터리 |
|---|---|---|
| r | 내용 읽기 | 안의 이름 목록 조회 (ls) |
| w | 내용 수정 | 안에서 파일 생성·삭제·이름 변경 |
| x | 프로그램으로 실행 | 디렉터리 안으로 진입·경로 통과 |
자주 헷갈리는 사례:
| 상황 | 결과 |
|---|---|
디렉터리 r만 있고 x 없음 | 이름 목록은 보이지만 파일을 열 수 없음 |
디렉터리 x만 있고 r 없음 | 목록은 못 보지만, 이름을 정확히 알면 파일에 접근 가능 |
파일은 r--(읽기 전용)인데 디렉터리가 w | 파일 내용 수정은 불가, 하지만 삭제는 가능 |
마지막 경우가 보안상 중요하다. 파일 삭제·교체 권한은 파일이 아니라 상위 디렉터리의 w 에서 나온다.
| 파일 | Rocky Linux 9 | Ubuntu 22.04 | 의미 |
|---|---|---|---|
/etc/passwd | 644 root:root | 644 root:root | 누구나 읽기 (계정 목록) |
/etc/shadow | 000 root:root | 640 root:shadow | 해시 — root(또는 shadow 그룹)만 |
/etc/sudoers | 440 root:root | 440 root:root | 수정은 visudo로만 |
/tmp | 1777 | 1777 | 모두 쓰기 + Sticky Bit |
~/.ssh/ | 700 | 700 | 소유자만 |
~/.ssh/authorized_keys | 600 | 600 | 권한이 넓으면 sshd가 거부할 수 있음 |
Rocky의
/etc/shadow가000인데도 root가 읽을 수 있는 이유는 다음 절의 root 예외 때문이다.

커널은 프로세스의 UID·GID와 파일의 소유자·그룹을 비교해 처음 일치하는 칸 하나만 적용한다.
CAP_DAC_OVERRIDE). 단, 실행은 x가 최소 하나 있어야 한다.그래서 ---rwx--- 파일은 그룹 사용자는 접근할 수 있지만 소유자 본인은 접근할 수 없다. 권한이 합쳐지지 않는다는 점을 보여주는 예다.
새로 만드는 파일의 권한은 umask로 결정된다. 파일은 666, 디렉터리는 777에서 umask만큼 권한을 뺀다.
| umask | 새 파일 | 새 디렉터리 | 쓰임 |
|---|---|---|---|
0022 | 644 | 755 | 일반적 기본값 (root 등) |
0002 | 664 | 775 | 사용자별 그룹을 쓰는 배포판의 일반 사용자 |
0077 | 600 | 700 | 보안 강화 (본인만) |
mkdir -p ~/lab15 && cd ~/lab15
# 1) 권한 확인 방법 3가지
ls -l /etc/passwd /etc/shadow /etc/sudoers
stat -c '%A %a %U:%G %n' /etc/passwd /etc/shadow /tmp
namei -l /home/roror/.ssh/authorized_keys # 경로 전체의 권한
# 2) umask 확인과 효과
umask
touch f1; mkdir d1; ls -ld f1 d1
(umask 077; touch f2; mkdir d2); ls -ld f2 d2
# 3) 디렉터리 w의 의미 — 읽기 전용 파일도 삭제 가능
echo data > ro.txt; chmod 444 ro.txt
echo more >> ro.txt # Permission denied
rm -f ro.txt && echo "삭제됨" # 디렉터리에 w가 있으므로 삭제 가능
# 4) 디렉터리 x만 있을 때
mkdir box && echo secret > box/known.txt
chmod 311 box # 소유자 -wx
ls box # Permission denied (r 없음)
cat box/known.txt # 이름을 알면 읽힘 (x 있음)
chmod 755 box
# 5) 소유자 칸만 적용되는 예
echo test > own.txt; chmod 070 own.txt
cat own.txt # 소유자 본인도 Permission denied
chmod 644 own.txt
아래 출력은 형식 설명용 예시다.
① namei -l
f: /home/roror/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root home
drwx------ roror roror roror
drwx------ roror roror .ssh
-rw------- roror roror authorized_keys
파일 하나의 권한만 보면 안 되고 경로 전체 를 봐야 한다. 상위 디렉터리 중 하나라도 다른 사용자에게 w가 있으면 파일을 통째로 바꿔치기할 수 있다.
② 위험 권한 판단표
| 발견 | 위험 |
|---|---|
/etc/shadow가 644 | 모든 사용자가 해시를 읽고 오프라인 크래킹 가능 |
root cron이 실행하는 스크립트가 777 | 누구나 내용을 바꿔 root 권한으로 실행 |
웹 루트가 apache 소유 + w | 웹 취약점 한 번에 웹셸 저장 가능 |
~/.ssh가 777 | 다른 사용자가 authorized_keys 교체 가능 |
홈 디렉터리 755 + 설정 파일 644 | 비밀번호가 든 설정 파일 노출 |
| 공격 | 이용하는 권한 설정 | 대응 |
|---|---|---|
| 스크립트 변조 권한 상승 | root가 실행하는 파일·디렉터리에 일반 사용자 w | 실행 경로 전체를 root 소유 755 이하로 |
| 해시 탈취 | 해시 파일 읽기 권한 과다 | shadow 권한 점검 |
| 웹셸 업로드 | 웹 계정이 쓸 수 있는 실행 경로 | 업로드 폴더 분리, 실행 금지 |
| 정보 노출 | 설정·백업 파일 644 | 민감 파일 600 |
| 파일 바꿔치기 | 상위 디렉터리 w | namei -l로 경로 점검 |
# 누구나 쓸 수 있는 파일 (가상 FS·임시 경로 제외)
sudo find / -xdev -type f -perm -0002 ! -path '/proc/*' ! -path '/tmp/*' ! -path '/var/tmp/*' 2>/dev/null
# Sticky Bit 없이 누구나 쓸 수 있는 디렉터리
sudo find / -xdev -type d -perm -0002 ! -perm -1000 2>/dev/null
# 주요 파일 권한 한 번에
stat -c '%a %U:%G %n' /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers /etc/ssh/sshd_config
# root cron이 실행하는 파일의 권한
sudo grep -hv '^#' /etc/crontab /etc/cron.d/* 2>/dev/null | grep -oE '/[^ ]+\.(sh|py|pl)' | sort -u | xargs -r ls -l
# /etc/audit/rules.d/perm.rules — 권한·소유자 변경 System Call
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod
-a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -F auid!=unset -k perm_mod
[Event] auditd perm_mod: /opt/backup/backup.sh 권한 755 → 777 (auid=devuser)
↓
[맥락] 이 스크립트는 root crontab 에서 매일 02:00 실행
↓
[IOC] 스크립트 mtime/ctime, 추가된 줄, devuser 로그인 IP
↓
[Root Cause] 일반 사용자가 root 실행 스크립트를 수정 가능하게 만듦 → 권한 상승 준비
↓
[Response] 스크립트 원복·권한 700 root:root, 추가된 명령 분석, devuser 계정 조사
r은 목록, w는 생성·삭제, x는 통과다. 파일 삭제 권한은 디렉터리 w 에서 나온다.CAP_DAC_OVERRIDE).umask로 결정된다. 보안 강화 환경은 077.namei -l) 의 권한을 점검한다.다음 글 「16. chmod와 권한 관리」 에서는 chmod의 기호·숫자 표기, 그리고 기본 권한 9비트 앞에 붙는 특수 권한(SUID·SGID·Sticky Bit) 과 ACL 을 다룬다. 특히 SUID는 권한 상승 공격에서 가장 먼저 점검하는 항목이다.