파일 권한 관리
Linux 파일 시스템의 권한 체계 완벽 가이드
Linux 파일 시스템의 권한 체계 완벽 가이드
목표: 문서 없이 권한 문제를 진단하고 해결할 수 있는 수준
🏗️ 권한 기초 구조
3요소 권한 모델
Linux는 3개의 사용자 클래스와 3개의 권한 타입으로 구성됩니다.
사용자 클래스 (User Classes)
| 클래스 | 의미 | 표기 |
|---|---|---|
| u (user) | 소유자 (owner) | 파일을 만든 사용자 |
| g (group) | 그룹 | 소유자가 속한 그룹 |
| o (others) | 기타 | 그 외 모든 사용자 |
| a (all) | 모두 | u + g + o |
권한 타입 (Permission Types)
| 권한 | 파일 | 디렉토리 | 기호 |
|---|---|---|---|
| r (read) | 내용 읽기 | 목록 조회 | 4 |
| w (write) | 내용 수정 | 파일 생성/삭제 | 2 |
| x (execute) | 실행 | 진입 (cd) | 1 |
📊 권한 표현법
1. 기호 모드 (Symbolic Mode)
chmod u+r file.txt # 소유자에게 읽기 권한 추가
chmod g-w file.txt # 그룹의 쓰기 권한 제거
chmod o=x file.txt # 기타 사용자에게 실행만
chmod a+r file.txt # 모두에게 읽기 추가
chmod u+rwx,g+rx,o-rwx # 복합 설정
연산자:
| 연산자 | 의미 |
|---|---|
+ | 권한 추가 |
- | 권한 제거 |
= | 권한 설정 (기존 제거 후 새로 설정) |
2. 숫자 모드 (Numeric Mode / Octal Mode)
chmod 755 file.txt # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 700 directory/ # rwx------
숫자 계산법:
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
자주 사용하는 권한 조합:
| 권한 | 숫자 | 의미 | 사용처 |
|---|---|---|---|
rwxrwxrwx | 777 | 모두 전체 권한 | 위험! 거의 사용 안함 |
rwxr-xr-x | 755 | 소유자 전체, 나머지 읽기/실행 | 실행 파일, 디렉토리 |
rw-r--r-- | 644 | 소유자 읽기/쓰기, 나머지 읽기 | 일반 파일 |
rwx------ | 700 | 소유자만 전체 | 민감한 파일/디렉토리 |
rw------- | 600 | 소유자만 읽기/쓰기 | SSH 키, 비밀번호 파일 |
rwxr-x--- | 750 | 소유자/그룹 전체, 기타 없음 | 팀 프로젝트 디렉토리 |
rwx--x--x | 711 | 소유자 전체, 나머지 실행만 | 공개 디렉토리 (내용 숨김) |
🔐 특수 권한 (Special Permissions)
SUID (Set User ID) — u+s (4000)
파일 소유자의 권한으로 실행
chmod u+s /usr/bin/passwd # SUID 설정
chmod 4755 /usr/bin/passwd # 숫자로 설정
동작 원리:
- 일반 사용자가 실행필 때 root 권한으로 실행됨
/usr/bin/passwd가 대표적 예시/etc/shadow를 수정해야 하므로 root 권한 필요
보안 주의:
- SUID가 설정된 프로그램은 해킹의 주요 대상
- 불필요한 SUID 제거가 보안 하드닝의 기본
find / -perm -4000으로 SUID 파일 검색
SGID (Set Group ID) — g+s (2000)
파일 그룹의 권한으로 실행 / 디렉토리에서 상속
chmod g+s /shared/directory # SGID 설정
chmod 2755 /shared/directory # 숫자로 설정
파일에서:
- SUID와 유사하게 그룹 권한으로 실행
디렉토리에서 (더 중요!):
- 해당 디렉토리에서 생성된 파일이 디렉토리의 그룹을 상속
- 팀 공유 디렉토리에 필수
실전 예시:
# 개발팀 공유 디렉토리
mkdir /project
groupadd devteam
chown :devteam /project
chmod 2775 /project # rwxrwsr-x
# 이제 /project에서 생성된 파일은 자동으로 devteam 그룹
Sticky Bit — +t (1000)
디렉토리에서 파일 삭제 제한
chmod +t /tmp # Sticky bit 설정
chmod 1777 /tmp # 숫자로 설정
동작 원리:
- 누구나 파일을 생성할 수 있음
- 자신의 파일만 삭제 가능
/tmp,/var/tmp에 기본 설정
권한 비교:
# Sticky bit 없음 (위험)
drwxrwxrwx 2 root root 4096 Jun 01 10:00 shared/
# 누구나 다른 사람 파일 삭제 가능
# Sticky bit 있음 (안전)
drwxrwxrwt 2 root root 4096 Jun 01 10:00 shared/
# 자신의 파일만 삭제 가능
👤 소유자 관리
chown — 소유자 변경
# 기본 사용법
chown user file.txt # 소유자만 변경
chown user:group file.txt # 소유자와 그룹 동시 변경
chown :group file.txt # 그룹만 변경
chown user: file.txt # 사용자의 기본 그룹으로
# 재귀 적용
chown -R user:group directory/ # 디렉토리 전체
# 참조 파일 기준
chown --reference=file1 file2 # file1과 동일한 소유자로
chgrp — 그룹만 변경
chgrp group file.txt # 그룹 변경
chgrp -R group directory/ # 재귀 적용
🛡️ ACL (Access Control List)
기본 3요소 권한으로는 부족할 때 사용하는 고급 권한 관리
설치 및 확인
# ACL 지원 확인
mount | grep acl
# 없으면 /etc/fstab에서 acl 옵션 추가
# ACL 패키지 설치 (Debian/Ubuntu)
apt-get install acl
# ACL 패키지 설치 (RHEL/CentOS)
yum install acl
setfacl — ACL 설정
# 사용자에게 권한 부여
setfacl -m u:username:rwx file.txt
# 그룹에게 권한 부여
setfacl -m g:groupname:rw file.txt
# 기타 사용자 권한 변경
setfacl -m o::r file.txt
# 마스크 설정 (최대 권한 제한)
setfacl -m m::rx file.txt
# 기본 ACL (디렉토리에서 상속)
setfacl -d -m u:username:rwx directory/
# ACL 제거
setfacl -x u:username file.txt # 특정 사용자 ACL 제거
setfacl -b file.txt # 모든 ACL 제거 (기본 권한만 남김)
setfacl -R -b directory/ # 재귀 제거
getfacl — ACL 확인
getfacl file.txt # ACL 출력
getfacl -R directory/ # 재귀 출력
getfacl -c file.txt # 주석 제거하고 출력
출력 예시:
# file: project/
# owner: admin
# group: devteam
# flags: -s- # SGID 설정됨
user::rwx
user:guest:r-x # 특정 사용자 추가 권한
group::rwx
mask::rwx
other::---
default:user::rwx # 기본 ACL (상속)
default:group::rwx
default:other::---
ACL 마스크 (Mask)
ACL의 최대 권한을 제한하는 상한선
# mask가 rw-면, 사용자가 rwx를 가져도 실제로는 rw-까지만 적용
setfacl -m m::rw file.txt
효과적인 권한 계산:
실제 권한 = 요청 권한 AND 마스크
예: 사용자 rwx, 마스크 rw-
rwx AND rw- = rw-
🔍 권한 문제 해결
일반적인 권한 문제 시나리오
1. “Permission denied” 오류
# 원인 파악 순서
ls -la file.txt # 권한 확인
id # 현재 사용자/그룹 확인
groups # 속한 그룹 목록
getfacl file.txt # ACL 확인
# 해결
chmod 644 file.txt # 권한 수정
chown user:group file.txt # 소유자 변경
setfacl -m u:username:r file.txt # ACL 추가
2. 웹 서버가 파일 접근 불가
# Apache/Nginx 사용자 확인
ps aux | grep apache # www-data 또는 apache
ps aux | grep nginx # nginx 또는 www-data
# 권한 설정
chown -R www-data:www-data /var/www/html/
chmod -R 755 /var/www/html/
find /var/www/html -type f -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;
3. 공유 디렉토리 문제
# 팀 공유 디렉토리 설정
mkdir /shared
chown root:devteam /shared
chmod 2775 /shared # SGID + rwxrwxr-x
setfacl -d -m g:devteam:rwx /shared
setfacl -d -m o::--- /shared
# umask 설정 (새 파일이 그룹 쓰기 가능하도록)
echo "umask 002" >> ~/.bashrc # 사용자별
# 또는 /etc/profile에서 전역 설정
권한 감사 스크립트
#!/bin/bash
# permission_audit.sh
echo "=== SUID 파일 검색 ==="
find / -perm -4000 -type f 2>/dev/null
echo -e "\n=== SGID 파일 검색 ==="
find / -perm -2000 -type f 2>/dev/null
echo -e "\n=== Sticky Bit 디렉토리 ==="
find / -perm -1000 -type d 2>/dev/null
echo -e "\n=== 누구나 쓰기 가능한 파일 ==="
find / -perm -002 -type f 2>/dev/null
echo -e "\n=== 소유자 없는 파일 ==="
find / -nouser -o -nogroup 2>/dev/null
🎯 umask — 기본 권한 마스크
개념
새로 생성되는 파일/디렉토리의 기본 권한을 결정
파일 기본 권한 = 666 - umask
directory 기본 권한 = 777 - umask
일반적인 umask 값
| umask | 파일 권한 | 디렉토리 권한 | 사용처 |
|---|---|---|---|
| 022 | 644 (rw-r—r—) | 755 (rwxr-xr-x) | 일반 사용자 (기본) |
| 002 | 664 (rw-rw-r—) | 775 (rwxrwxr-x) | 팀 공유 환경 |
| 077 | 600 (rw-------) | 700 (rwx------) | 보안 강화 |
| 027 | 640 (rw-r-----) | 750 (rwxr-x---) | 서버 환경 |
설정 방법
# 현재 umask 확인
umask
# 임시 변경
umask 002
# 영구 변경 (사용자별)
echo "umask 002" >> ~/.bashrc
# 영구 변경 (전역)
# /etc/profile 또는 /etc/bash.bashrc 수정
📋 권한 관리 모범 사례
웹 서버 디렉토리
# 웹 루트 설정
/var/www/html/
├── 소유자: root 또는 배포 사용자
├── 그룹: www-data (또는 nginx, apache)
├── 디렉토리: 755 (rwxr-xr-x)
├── 정적 파일: 644 (rw-r--r--)
├── 업로드 디렉토리: 775 (rwxrwxr-x) + SGID
└── 설정 파일: 640 (rw-r-----)
로그 디렉토리
/var/log/myapp/
├── 소유자: root
├── 그룹: adm 또는 loggroup
├── 디렉토리: 755
├── 로그 파일: 644
└── 민감 로그: 640
팀 프로젝트 디렉토리
/project/
├── SGID 설정 (그룹 상속)
├── Sticky Bit 설정 (자신의 파일만 삭제)
├── 기본 ACL로 그룹 권한 상속
└── umask 002 설정
🔗 관련 노트
- 01-01-리눅스-기본-명령어-모음 — 기본 명령어 참조
- 01-03-사용자-관리 — 사용자/그룹 관리
- 01-03-사용자-관리 — 권한 위임
- 03-03-보안-하드닝 — 보안 강화 가이드
- 03-03-보안-하드닝 — 강제 접근 제어
마지막 업데이트: 2026-06-01