기본 권한 체계
Linux는 모든 파일과 디렉토리에 대해 세 가지 사용자 범주와 세 가지 권한 종류로 접근을 제어한다.
사용자 범주
| 범주 | 기호 | 설명 |
|---|---|---|
| User (소유자) | u | 파일의 소유자 |
| Group (그룹) | g | 파일의 소유 그룹에 속한 사용자 |
| Others (기타) | o | 소유자도 그룹도 아닌 나머지 |
| All (전체) | a | u + g + o 전체 |
권한 종류
| 권한 | 문자 | 숫자(8진수) | 파일에서의 의미 | 디렉토리에서의 의미 |
|---|---|---|---|---|
| 읽기 | r | 4 | 파일 내용 읽기 | 디렉토리 내 파일 목록 조회 |
| 쓰기 | w | 2 | 파일 내용 수정 | 디렉토리 내 파일 생성/삭제/이름 변경 |
| 실행 | x | 1 | 파일 실행 (프로그램/스크립트) | 디렉토리 진입 (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진수 | 문자 | 용도 |
|---|---|---|
755 | rwxr-xr-x | 실행 파일, 디렉토리 (소유자 전체, 나머지 읽기+실행) |
644 | rw-r--r-- | 일반 파일 (소유자 읽기/쓰기, 나머지 읽기) |
700 | rwx------ | 개인 디렉토리/스크립트 (소유자만 전체) |
600 | rw------- | 개인 파일, SSH 키 등 (소유자만 읽기/쓰기) |
777 | rwxrwxrwx | 전체 허용 (보안상 비권장) |
750 | rwxr-x--- | 그룹까지만 허용 |
640 | rw-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 {} + # 디렉토리: 755chown, 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_filechgrp - 그룹만 변경
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/nullSticky 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진수 | 파일 효과 | 디렉토리 효과 | 표시 위치 | 문자 |
|---|---|---|---|---|---|
| SUID | 4000 | 소유자 권한으로 실행 | (보통 무시) | 소유자 x 위치 | s/S |
| SGID | 2000 | 소유 그룹 권한으로 실행 | 새 파일이 그룹 상속 | 그룹 x 위치 | s/S |
| Sticky | 1000 | (현대 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-xmask (유효 권한 마스크)
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 진입 |
|---|---|---|---|---|
--- | X | X | X | X |
r-- | 이름만 O | X | X | X |
-w- | X | X | X | X |
--x | X | O (이름 알면) | X | O |
r-x | O (상세 포함) | O | X | O |
rw- | 이름만 O | X | X | X |
-wx | X | O (이름 알면) | O | O |
rwx | O | O | O | O |
핵심:
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