파일 · 권한 · 사용자 관리 24 / 50 · Part 3. Linux 파일 권한
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 16. chmod와 권한 관리
23편에서 기호 방식(u+x)을 다뤘다. 이번 글은 실무에서 더 자주 쓰는 숫자 방식 이다. chmod 755 file처럼 세 자리 8진수로 권한 전체를 한 번에 지정한다.
숫자 방식의 장점은 표준값을 외워 두면 빠르고 실수가 적다 는 것이다. 600, 644, 755, 700 네 가지만 알아도 대부분의 상황을 처리할 수 있다. 이번 글에서는 12가지 조합의 실제 출력으로 각 값의 의미와 용도를 정리한다.
각 칸(소유자·그룹·기타)의 세 비트를 더한다.
| 권한 | r(4) | w(2) | x(1) | 합 |
|---|---|---|---|---|
rwx | 4 | 2 | 1 | 7 |
rw- | 4 | 2 | 0 | 6 |
r-x | 4 | 0 | 1 | 5 |
r-- | 4 | 0 | 0 | 4 |
-wx | 0 | 2 | 1 | 3 |
--x | 0 | 0 | 1 | 1 |
--- | 0 | 0 | 0 | 0 |
세 칸을 이어 쓰면 세 자리 숫자다. rwxr-x--- = 7·5·0 = 750.
| 숫자 방식 | 기호 방식 | |
|---|---|---|
| 적용 범위 | 9비트 전체 덮어쓰기 | 지정한 비트만 조정 |
| 적합한 상황 | 표준값으로 통째 설정 | 일부만 추가·제거 |
| 예 | chmod 644 f | chmod g-w f |
숫자 방식은 항상 전체를 덮어쓰므로, 특정 비트만 바꾸려면 현재 값을 먼저 알아야 한다.

숫자 방식은 지정한 세 자리(때로 특수 권한을 포함한 네 자리, 28편)를 그대로 mode 비트로 설정한다. 커널 입장에서는 chmod() 시스템 콜에 mode 값을 넘기는 것이고, 기호 방식도 내부적으로는 현재 값에 연산을 적용한 뒤 같은 시스템 콜을 호출한다. 결과 저장 방식은 동일하고, 차이는 "현재 값을 유지하느냐" 뿐이다.
표준값을 외워 두는 것이 실무에서 안전한 이유는, 상황마다 계산하면 실수(예: 의도치 않은 x나 w)가 생기기 때문이다. 아래 표준값은 사실상 관용구로 굳어져 있다.
cd /data && mkdir lab24 && cd lab24
# 1) 12가지 조합을 한 번에
for m in 000 400 600 640 644 664 700 750 751 755 775 777; do
touch f$m; chmod $m f$m
done
stat -c '%a %A %n' f000 f400 f600 f640 f644 f664 f700 f750 f751 f755 f775 f777
# 2) 실무 표준값
touch key.pem && chmod 600 key.pem && ls -l key.pem # 개인 키
mkdir private && chmod 700 private && ls -ld private # 개인 디렉터리
touch script.sh && chmod 755 script.sh && ls -l script.sh # 실행 스크립트

텍스트 원본(실제 출력):
[analyst@rocky9-lab ~]$ cd /data && mkdir lab24 && cd lab24
[analyst@rocky9-lab lab24]$ for m in 000 400 600 640 644 664 700 750 751 755 775 777; do touch f$m; chmod $m f$m; done
[analyst@rocky9-lab lab24]$ stat -c '%a %A %n' f000 f400 f600 f640 f644 f664 f700 f750 f751 f755 f775 f777
0 ---------- f000
400 -r-------- f400
600 -rw------- f600
640 -rw-r----- f640
644 -rw-r--r-- f644
664 -rw-rw-r-- f664
700 -rwx------ f700
750 -rwxr-x--- f750
751 -rwxr-x--x f751
755 -rwxr-xr-x f755
775 -rwxrwxr-x f775
777 -rwxrwxrwx f777
[analyst@rocky9-lab lab24]$ echo "---추가 예시---"
---추가 예시---
[analyst@rocky9-lab lab24]$ touch key.pem && chmod 600 key.pem && ls -l key.pem
-rw------- 1 analyst analyst 0 Sep 24 10:50 key.pem
[analyst@rocky9-lab lab24]$ mkdir private && chmod 700 private && ls -ld private
drwx------ 2 analyst analyst 4096 Sep 24 10:50 private
[analyst@rocky9-lab lab24]$ touch script.sh && chmod 755 script.sh && ls -l script.sh
-rwxr-xr-x 1 analyst analyst 0 Sep 24 10:50 script.sh
| 값 | 기호 | 용도와 주의 |
|---|---|---|
000 | ---------- | 모든 접근 차단 (소유자도, root 제외) |
400 | -r-------- | 소유자 읽기만 (읽기 전용 보관) |
600 | -rw------- | 개인 키·비밀 파일. SSH 개인 키는 이 권한이 아니면 거부됨 |
640 | -rw-r----- | 소유자 쓰기, 그룹 읽기. Ubuntu /etc/shadow가 640 root:shadow |
644 | -rw-r--r-- | 일반 파일 기본. 소유자 쓰기, 모두 읽기 |
664 | -rw-rw-r-- | 그룹 공유 편집 |
700 | -rwx------ | 개인 디렉터리·스크립트. 소유자 전용 |
750 | -rwxr-x--- | 그룹까지 실행·진입 허용 |
751 | -rwxr-x--x | 기타는 진입만(목록 불가). 특정 하위 경로 공유 시 |
755 | -rwxr-xr-x | 실행 파일·공개 디렉터리 기본 |
775 | -rwxrwxr-x | 그룹 협업 디렉터리 |
777 | -rwxrwxrwx | 누구나 수정. 원칙적으로 지양 |
key.pem을 600으로 만든 이유가 실무적으로 중요하다. SSH는 개인 키 파일의 권한이 그룹·기타에 열려 있으면 키 사용을 거부 한다. 권한이 곧 키의 안전을 보장하기 때문이다.
| 권장 | 대상 |
|---|---|
600 | SSH 개인 키(~/.ssh/id_*), .env, 비밀번호 포함 설정 |
644 | 웹 콘텐츠, 일반 설정, 공개 문서 |
700 | ~/.ssh, 개인 작업 디렉터리 |
755 | 실행 파일, 웹 디렉터리 |
| 피할 값 | 777, 666, world-writable |
| 위험 값 | 문제 |
|---|---|
777 파일 | 누구나 내용 변경 → 스크립트면 코드 주입 |
666 파일 | 누구나 내용 변경 (실행만 불가) |
777 디렉터리 (Sticky 없음) | 누구나 남의 파일 삭제·교체 |
개인 키 644 | 다른 사용자가 키 탈취 → SSH가 거부하기도 함 |
최소 권한 원칙: 필요한 최소한만 준다. 755로 될 것을 777로 주지 않는다.
[정기 점검] 표준을 벗어난 권한 탐색
find /etc -type f -perm -o+w # 설정 파일 world-writable
find /home -name 'id_*' ! -name '*.pub' -perm /077 # 노출된 개인 키
find /var/www -type f -perm -o+w # 웹 파일 world-writable
↓
[판단] 표준값(600/644/755)에서 벗어난 이유 확인
↓
[Evidence] 해당 파일 ctime(권한 변경 시각) + 변경 주체 로그
↓
[Response] 표준 권한으로 원복, 키 노출 시 키 교체
| 관점 | 내용 |
|---|---|
| Baseline | 주요 경로의 표준 권한을 기준값으로 저장하고 이탈을 탐지 |
| 키 노출 | 개인 키가 077 비트(그룹·기타 권한)를 가지면 유출 위험. 발견 시 키 교체 까지 |
| 자동화 | CIS 벤치마크·보안 점검 스크립트가 권한 표준 준수를 검사 (30편) |
| 실수 | 결과 | 예방 |
|---|---|---|
문제 해결로 chmod 777 | 심각한 노출 | 필요한 최소 권한 |
개인 키를 644로 | SSH 거부 또는 유출 | 600 |
| 숫자로 특정 비트만 바꾸려다 전체 변경 | 의도치 않은 권한 | 일부 조정은 기호 방식 |
디렉터리를 644로 | 진입 불가(x 없음) | 디렉터리는 755/700 |
| 네 자리 습관 부족 | 특수 권한(4755) 실수 | 28편에서 다룸 |
[ ] r(4)+w(2)+x(1) 로 한 칸을 계산할 수 있다
[ ] 750 = rwxr-x--- 처럼 변환할 수 있다
[ ] 600/644/700/755 의 용도를 말할 수 있다
[ ] 개인 키에 600 이 필요한 이유를 안다
[ ] 777/666 을 피해야 하는 이유를 설명할 수 있다
[ ] 숫자 방식이 9비트 전체를 덮어쓴다는 점을 이해했다
600, 일반 파일 644, 개인 디렉터리 700, 실행·공개 755.600이 아니면 사용이 거부될 수 있다.777·666·world-writable은 지양한다.다음 글 「25. umask 이해하기」 에서는 새로 만드는 파일·디렉터리의 기본 권한을 결정하는 umask의 계산 원리를 다루고, Rocky와 Ubuntu의 기본 umask 차이가 만드는 실제 결과를 확인한다.