기본 권한 체계

Linux는 모든 파일과 디렉토리에 대해 세 가지 사용자 범주와 세 가지 권한 종류로 접근을 제어한다.

사용자 범주

범주기호설명
User (소유자)u파일의 소유자
Group (그룹)g파일의 소유 그룹에 속한 사용자
Others (기타)o소유자도 그룹도 아닌 나머지
All (전체)au + g + o 전체

권한 종류

권한문자숫자(8진수)파일에서의 의미디렉토리에서의 의미
읽기r4파일 내용 읽기디렉토리 내 파일 목록 조회
쓰기w2파일 내용 수정디렉토리 내 파일 생성/삭제/이름 변경
실행x1파일 실행 (프로그램/스크립트)디렉토리 진입 (cd) 및 파일 접근

8진수 표기법

세 범주(u, g, o) 각각에 대해 r(4) + w(2) + x(1)를 합산한 숫자로 표현한다.

권한 문자열:  rwx r-x r--
계산:        4+2+1=7  4+0+1=5  4+0+0=4
8진수:       754

자주 사용하는 권한:

8진수문자용도
755rwxr-xr-x실행 파일, 디렉토리 (소유자 전체, 나머지 읽기+실행)
644rw-r--r--일반 파일 (소유자 읽기/쓰기, 나머지 읽기)
700rwx------개인 디렉토리/스크립트 (소유자만 전체)
600rw-------개인 파일, SSH 키 등 (소유자만 읽기/쓰기)
777rwxrwxrwx전체 허용 (보안상 비권장)
750rwxr-x---그룹까지만 허용
640rw-r-----그룹까지 읽기 허용

ls -l 출력 읽기

ls -la /
# drwxr-xr-x  20 root root  4096 Jan 15 10:00 .
# drwxr-xr-x  20 root root  4096 Jan 15 10:00 ..
# lrwxrwxrwx   1 root root     7 Dec 01 00:00 bin -> usr/bin
# drwxr-xr-x   4 root root  4096 Jan 15 09:30 boot
# drwxr-xr-x  19 root root  3820 Jan 15 10:00 dev
# crw-rw-rw-   1 root root  1, 3 Jan 15 10:00 /dev/null
# brw-rw----   1 root disk  8, 0 Jan 15 10:00 /dev/sda

첫 번째 문자: 파일 타입

문자타입설명
-일반 파일 (regular file)텍스트, 바이너리, 이미지 등
d디렉토리 (directory)파일 목록을 포함하는 특수 파일
l심볼릭 링크 (symbolic link)다른 파일을 가리키는 참조
c문자 장치 (character device)문자 단위 I/O (터미널, 시리얼 포트)
b블록 장치 (block device)블록 단위 I/O (디스크, 파티션)
p파이프 (named pipe, FIFO)프로세스 간 통신
s소켓 (socket)프로세스 간 네트워크 통신

전체 출력 구조

chmod - 권한 변경

심볼릭 모드 (문자 모드)

# 형식: chmod [범주][연산자][권한] 파일
# 범주: u(소유자), g(그룹), o(기타), a(전체)
# 연산자: +(추가), -(제거), =(설정)
# 권한: r, w, x
 
chmod u+x script.sh              # 소유자에 실행 권한 추가
chmod g-w file.txt               # 그룹에서 쓰기 권한 제거
chmod o-rwx secret.txt           # 기타 사용자 모든 권한 제거
chmod a+r public.txt             # 전체 사용자에 읽기 권한 추가
chmod u=rwx,g=rx,o=r file.txt    # 각 범주별 권한 설정 (콤마 구분)
chmod ug+x script.sh             # 소유자+그룹에 실행 권한 추가
chmod +x script.sh               # 전체에 실행 권한 추가 (a+x와 동일)
 
# 디렉토리 재귀 적용
chmod -R g+r directory/          # 디렉토리와 모든 하위 항목에 적용

숫자 모드 (8진수 모드)

chmod 755 script.sh              # rwxr-xr-x
chmod 644 document.txt           # rw-r--r--
chmod 700 private_dir/           # rwx------
chmod 600 id_rsa                 # rw------- (SSH 키)
chmod 777 temp.txt               # rwxrwxrwx (보안 위험, 비권장)
 
# 재귀 적용
chmod -R 755 public_html/
 
# 파일과 디렉토리 분리 적용 (find 활용)
find /path -type f -exec chmod 644 {} +   # 파일: 644
find /path -type d -exec chmod 755 {} +   # 디렉토리: 755

chown, chgrp - 소유권 변경

chown - 소유자/그룹 변경

chown user file.txt              # 소유자만 변경
chown user:group file.txt        # 소유자와 그룹 동시 변경
chown :group file.txt            # 그룹만 변경
chown user: file.txt             # 소유자 변경 + 그룹을 사용자의 기본 그룹으로
 
# 재귀 적용
chown -R www-data:www-data /var/www/
 
# 심볼릭 링크 자체 변경 (기본은 대상 파일을 변경)
chown -h user:group symlink
 
# 참조 파일의 소유권 복사
chown --reference=ref_file target_file

chgrp - 그룹만 변경

chgrp group file.txt             # 그룹 변경
chgrp -R developers project/     # 재귀 적용

일반 사용자는 자신이 소유한 파일의 그룹만 변경 가능하며, 자신이 속한 그룹으로만 변경할 수 있다. chown은 root만 사용 가능.

umask - 기본 권한 마스크

새로 생성되는 파일/디렉토리의 기본 권한을 결정하는 마스크 값.

계산 방식:

  • 파일 기본 최대 권한: 666 (실행 권한 없음)
  • 디렉토리 기본 최대 권한: 777
  • 실제 권한 = 최대 권한에서 umask 비트를 제거
umask가 022일 때:
파일:      666 & ~022 = 644 (rw-r--r--)
디렉토리:  777 & ~022 = 755 (rwxr-xr-x)

umask가 077일 때:
파일:      666 & ~077 = 600 (rw-------)
디렉토리:  777 & ~077 = 700 (rwx------)

주의: umask는 단순 뺄셈이 아니라 비트 마스킹이다. 666 - 033 = 633이 아니라, 666 & ~033 = 644이다. 비트 AND NOT 연산.

# 현재 umask 확인
umask                 # 0022 (8진수)
umask -S              # u=rwx,g=rx,o=rx (심볼릭 형태)
 
# umask 설정
umask 022             # 일반적인 기본값
umask 077             # 보안 강화 (그룹/기타 권한 없음)
umask 002             # 그룹 공유 환경 (그룹 쓰기 허용)
 
# 영구 설정 (셸 설정 파일에 추가)
# ~/.bashrc 또는 ~/.profile에:
# umask 022
 
# 확인
umask 022
touch testfile
mkdir testdir
ls -la testfile testdir
# -rw-r--r-- ... testfile   (644)
# drwxr-xr-x ... testdir   (755)

특수 권한

일반 rwx 외에 세 가지 특수 권한이 존재한다. 8진수에서 네 번째 자리(천의 자리)에 해당한다.

SUID (Set User ID) - 4000

실행 시 파일 소유자의 권한으로 실행된다. 실행 파일에만 의미가 있다.

# SUID 확인 - 소유자 실행 권한 위치에 's' 또는 'S' 표시
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd
#    ^s: SUID 설정됨
 
# 's' vs 'S':
# 's' = SUID + x (실행 권한 있음)
# 'S' = SUID만 (실행 권한 없음, 비정상적)

동작 원리:

  • /usr/bin/passwd는 root 소유이며 SUID가 설정되어 있다
  • 일반 사용자가 passwd 명령을 실행하면, 해당 프로세스는 root 권한으로 동작
  • 이를 통해 일반 사용자도 /etc/shadow 파일(root만 쓰기 가능)을 수정하여 비밀번호를 변경 가능
# SUID 설정/해제
chmod u+s executable              # SUID 설정
chmod 4755 executable             # SUID + rwxr-xr-x
chmod u-s executable              # SUID 해제
 
# 시스템에서 SUID 파일 찾기 (보안 감사)
find / -type f -perm -4000 -ls 2>/dev/null

보안 주의: SUID가 설정된 프로그램에 취약점이 있으면 권한 상승(privilege escalation) 공격에 악용될 수 있다. 불필요한 SUID 설정은 제거해야 한다.

SGID (Set Group ID) - 2000

실행 파일에서의 SGID

실행 시 파일의 소유 그룹 권한으로 실행된다.

ls -l /usr/bin/wall
# -rwxr-sr-x 1 root tty 19024 ... /usr/bin/wall
#        ^s: SGID 설정됨

디렉토리에서의 SGID (더 자주 사용)

SGID가 설정된 디렉토리에서 생성되는 새 파일/디렉토리는 해당 디렉토리의 그룹을 상속받는다. (일반적으로는 생성자의 기본 그룹)

# 공유 프로젝트 디렉토리 설정
mkdir /shared/project
chgrp developers /shared/project
chmod 2775 /shared/project       # SGID + rwxrwxr-x
 
ls -ld /shared/project
# drwxrwsr-x 2 root developers 4096 ... /shared/project
#        ^s: SGID
 
# developers 그룹 멤버가 파일 생성
touch /shared/project/newfile.txt
ls -l /shared/project/newfile.txt
# -rw-rw-r-- 1 user developers ...   <- 그룹이 developers로 자동 설정
# SGID 설정/해제
chmod g+s directory/              # SGID 설정
chmod 2755 directory/             # SGID + rwxr-xr-x
chmod g-s directory/              # SGID 해제
 
# SGID 디렉토리 찾기
find / -type d -perm -2000 -ls 2>/dev/null

Sticky Bit - 1000

디렉토리에 설정하면, 해당 디렉토리 내 파일은 파일의 소유자, 디렉토리의 소유자, 또는 root만 삭제/이름 변경할 수 있다. 다른 사용자의 파일을 삭제할 수 없다.

대표적 예시: /tmp

ls -ld /tmp
# drwxrwxrwt 15 root root 4096 ... /tmp
#          ^t: Sticky Bit
 
# 't' vs 'T':
# 't' = Sticky Bit + x (실행 권한 있음)
# 'T' = Sticky Bit만 (실행 권한 없음, 비정상적)

동작 원리:

  • /tmp는 모든 사용자가 쓸 수 있는 디렉토리 (777)
  • Sticky Bit이 없으면 누구나 다른 사람의 파일을 삭제 가능 (디렉토리에 w 권한이 있으므로)
  • Sticky Bit이 있으면 자신의 파일만 삭제 가능
# Sticky Bit 설정/해제
chmod +t directory/               # Sticky Bit 설정
chmod 1777 directory/             # Sticky Bit + rwxrwxrwx
chmod -t directory/               # Sticky Bit 해제

특수 권한 요약

특수 권한8진수파일 효과디렉토리 효과표시 위치문자
SUID4000소유자 권한으로 실행(보통 무시)소유자 x 위치s/S
SGID2000소유 그룹 권한으로 실행새 파일이 그룹 상속그룹 x 위치s/S
Sticky1000(현대 Linux에서 무시)소유자만 삭제 가능기타 x 위치t/T
# 4자리 8진수 조합 예시
chmod 4755 file    # SUID + rwxr-xr-x    (-rwsr-xr-x)
chmod 2755 dir     # SGID + rwxr-xr-x    (drwxr-sr-x)
chmod 1777 dir     # Sticky + rwxrwxrwx  (drwxrwxrwt)
chmod 6755 file    # SUID+SGID + rwxr-xr-x (-rwsr-sr-x)

ACL (Access Control List)

기본 rwx 권한 체계(소유자/그룹/기타)만으로는 세밀한 접근 제어가 어렵다. ACL은 특정 사용자나 특정 그룹에게 개별적으로 권한을 부여할 수 있는 확장 메커니즘이다.

ACL 확인 - getfacl

getfacl file.txt
# # file: file.txt
# # owner: alice
# # group: developers
# user::rw-                    <- 소유자(alice) 권한
# user:bob:r--                 <- 특정 사용자(bob) 권한 (ACL)
# group::r--                   <- 소유 그룹(developers) 권한
# group:testers:rw-            <- 특정 그룹(testers) 권한 (ACL)
# mask::rw-                    <- 유효 권한 마스크
# other::---                   <- 기타 사용자 권한
 
# ACL이 설정된 파일은 ls -l에서 '+' 표시
ls -l file.txt
# -rw-r-----+ 1 alice developers 1024 ... file.txt
#           ^ '+' = ACL 존재

ACL 설정 - setfacl

# 특정 사용자에게 권한 부여
setfacl -m u:bob:rw file.txt         # bob에게 읽기/쓰기 권한
 
# 특정 그룹에게 권한 부여
setfacl -m g:testers:r file.txt      # testers 그룹에 읽기 권한
 
# 여러 ACL 동시 설정
setfacl -m u:bob:rw,g:testers:r file.txt
 
# ACL 항목 삭제
setfacl -x u:bob file.txt            # bob의 ACL 제거
setfacl -x g:testers file.txt        # testers의 ACL 제거
 
# 모든 ACL 삭제
setfacl -b file.txt                  # 모든 ACL 제거 (기본 권한으로 복원)
 
# 재귀 적용
setfacl -R -m u:bob:rx directory/    # 디렉토리 및 하위 항목에 재귀 적용
 
# 기본(default) ACL - 새로 생성되는 파일에 자동 적용
setfacl -d -m u:bob:rw directory/    # 디렉토리 내 새 파일에 bob 읽기/쓰기
setfacl -d -m g:team:rx directory/   # 디렉토리 내 새 파일에 team 읽기/실행
 
# 기본 ACL 확인
getfacl directory/
# default:user:bob:rw-
# default:group:team:r-x

mask (유효 권한 마스크)

ACL에서 mask는 named user, 소유 그룹, named group에 대한 최대 허용 권한을 제한한다. 파일 소유자와 other의 권한에는 영향을 주지 않는다.

# mask 설정
setfacl -m m::r file.txt        # mask를 r--로 설정
 
# mask가 r--이면:
# user:bob:rw-  -> 유효 권한: r-- (mask에 의해 w 제한)
# group::rwx    -> 유효 권한: r-- (mask에 의해 wx 제한)
 
# getfacl에서 #effective: 주석으로 실제 유효 권한 표시
getfacl file.txt
# user:bob:rw-                  #effective:r--

ACL 백업/복원

# ACL 백업
getfacl -R /path/to/dir > acl_backup.txt
 
# ACL 복원
setfacl --restore=acl_backup.txt

디렉토리 권한의 의미

디렉토리에 대한 권한은 파일과 의미가 다르다. 이 차이를 정확히 이해하는 것이 중요하다.

r (읽기) - 디렉토리 목록 조회

# r 권한이 있으면 ls로 파일 목록을 볼 수 있다
# r만 있고 x가 없으면 파일 이름은 볼 수 있지만 상세 정보(크기, 권한 등)는 불가
 
chmod 744 testdir/    # rwxr--r--
# 다른 사용자는 ls testdir/ 가능하지만, ls -l testdir/ 시 상세 정보에 '?' 표시

w (쓰기) - 파일 생성/삭제/이름 변경

# w 권한이 있으면 디렉토리 내 파일을 생성, 삭제, 이름 변경 가능
# 중요: 디렉토리 w 권한으로 다른 사용자의 파일도 삭제 가능!
# -> Sticky Bit으로 이를 방지
 
chmod 733 testdir/    # rwx-wx-wx
# 다른 사용자는 파일 생성/삭제 가능하지만 목록 조회 불가

x (실행) - 디렉토리 진입 및 접근

# x 권한이 있으면 cd로 진입 가능하고, 경로에 포함된 파일에 접근 가능
# x가 없으면 디렉토리 안의 파일에 절대 접근 불가 (파일 이름을 알아도)
 
chmod 711 testdir/    # rwx--x--x
# 다른 사용자는 cd testdir/ 가능, 파일명을 알면 접근 가능, 목록 조회 불가

조합 정리

권한목록 조회 (ls)파일 접근파일 생성/삭제cd 진입
---XXXX
r--이름만 OXXX
-w-XXXX
--xXO (이름 알면)XO
r-xO (상세 포함)OXO
rw-이름만 OXXX
-wxXO (이름 알면)OO
rwxOOOO

핵심: x 권한이 없으면 디렉토리에 진입할 수 없고, 하위 파일에도 접근할 수 없다. 디렉토리의 x는 “통과(traverse)” 권한이라고 생각하면 된다.

실전 예시: 웹 서버 디렉토리 권한

# /var/www/html 전형적 설정
# 디렉토리: 755 (root가 소유, 웹 서버가 읽기+진입)
# 파일: 644 (root가 소유, 웹 서버가 읽기)
 
sudo chown -R root:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} +
sudo find /var/www/html -type f -exec chmod 644 {} +
 
# 업로드 디렉토리 (웹 서버가 쓰기 필요)
sudo chmod 775 /var/www/html/uploads
sudo chown root:www-data /var/www/html/uploads

실전 예시: 그룹 공유 디렉토리

# 팀 공유 디렉토리 설정
sudo mkdir /shared/teamdir
sudo groupadd teamgroup
sudo chgrp teamgroup /shared/teamdir
sudo chmod 2770 /shared/teamdir      # SGID + rwxrwx---
 
# 결과:
# - teamgroup 멤버만 접근 가능
# - 새 파일은 자동으로 teamgroup 그룹 소속
# - 기타 사용자는 접근 불가
 
# 팀원들을 그룹에 추가
sudo usermod -aG teamgroup alice
sudo usermod -aG teamgroup bob