파일 권한 관리

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

자주 사용하는 권한 조합:

권한숫자의미사용처
rwxrwxrwx777모두 전체 권한위험! 거의 사용 안함
rwxr-xr-x755소유자 전체, 나머지 읽기/실행실행 파일, 디렉토리
rw-r--r--644소유자 읽기/쓰기, 나머지 읽기일반 파일
rwx------700소유자만 전체민감한 파일/디렉토리
rw-------600소유자만 읽기/쓰기SSH 키, 비밀번호 파일
rwxr-x---750소유자/그룹 전체, 기타 없음팀 프로젝트 디렉토리
rwx--x--x711소유자 전체, 나머지 실행만공개 디렉토리 (내용 숨김)

🔐 특수 권한 (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파일 권한디렉토리 권한사용처
022644 (rw-r—r—)755 (rwxr-xr-x)일반 사용자 (기본)
002664 (rw-rw-r—)775 (rwxrwxr-x)팀 공유 환경
077600 (rw-------)700 (rwx------)보안 강화
027640 (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