Permission: 소유자·그룹·기타로 파일 접근을 제어하는 리눅스 권한 모델
리눅스 퍼미션(Permission)은 파일과 디렉터리에 대해 소유자(user), 그룹(group), 기타 사용자(other)별로 읽기·쓰기·실행 권한을 지정하는 접근 제어 방식이다. 권한은 9비트의 모드(mode)로 저장되며 `chmod`, `chown` 명령으로 바꾼다. 웹 서버 배포, SSH 키 관리, 스크립트 실행 같은 실무 상황에서 자주 마주치는 오
By 송민성
1. 개념
리눅스 퍼미션(Permission)은 파일 시스템의 각 객체(파일, 디렉터리)에 붙은 접근 제어 정보다. 모든 객체는 소유자(owner)와 소유 그룹(group)을 하나씩 가지며, 다음 세 부류에 대해 각각 권한을 따로 지정한다.
| 부류 | 약자 | 대상 |
|---|---|---|
| 소유자(user) | u | 파일을 소유한 사용자 |
| 그룹(group) | g | 파일의 소유 그룹에 속한 사용자 |
| 기타(other) | o | 위 둘에 해당하지 않는 모든 사용자 |
권한 종류는 세 가지다.
| 권한 | 기호 | 숫자 | 파일에서의 의미 | 디렉터리에서의 의미 |
|---|---|---|---|---|
| 읽기(read) | r | 4 | 내용 읽기 | 목록 조회(ls) |
| 쓰기(write) | w | 2 | 내용 수정 | 항목 생성·삭제·이름 변경 |
| 실행(execute) | x | 1 | 프로그램으로 실행 | 진입(cd) 및 하위 항목 접근 |
2. 왜 사용하는가
리눅스는 다중 사용자(multi-user) 운영체제다. 한 시스템에서 여러 사용자와 프로세스가 같은 파일 시스템을 공유하므로 다음이 필요하다.
- 다른 사용자의 개인 파일을 읽거나 수정하지 못하게 막는다.
- 시스템 설정 파일을 일반 사용자가 변경하지 못하게 보호한다.
- 웹 서버처럼 권한을 최소화한 계정으로 서비스를 돌려, 취약점이 있어도 피해 범위를 줄인다(최소 권한 원칙, principle of least privilege).
3. 동작 원리
모드(mode) 표기
ls -l의 출력 첫 열은 10글자다.
-rwxr-xr--- 첫 글자: 파일 종류 (
-일반 파일,d디렉터리,l심볼릭 링크) - 다음 9글자: 3글자씩 user / group / other 권한
위 예시는 소유자 rwx(7), 그룹 r-x(5), 기타 r--(4)이므로 숫자로 754다.
검사 순서
프로세스가 파일에 접근하면 커널은 프로세스의 유효 사용자 ID(effective UID)와 그룹 ID를 보고 다음 순서로 하나의 부류만 적용한다.
- 프로세스의 UID가 파일 소유자와 같으면 user 권한만 본다.
- 아니고 프로세스의 그룹이 파일의 소유 그룹과 일치하면 group 권한만 본다.
- 둘 다 아니면 other 권한을 본다.
즉 소유자인데 user 권한이 ---이고 other가 rwx여도, 소유자는 접근할 수 없다. 슈퍼유저 root(UID 0)는 대체로 이 검사를 우회한다.
디렉터리 경로 탐색
/a/b/c.txt를 열려면 /a와 /a/b에 대한 실행(x) 권한이 모두 필요하다. 파일 자체의 권한이 열려 있어도 상위 디렉터리에 x가 없으면 접근할 수 없다.
특수 비트
| 비트 | 숫자 | 효과 |
|---|---|---|
| setuid | 4000 | 실행 시 파일 소유자의 권한으로 실행 |
| setgid | 2000 | 실행 시 파일 그룹 권한으로 실행, 디렉터리에서는 새 파일이 디렉터리의 그룹을 상속 |
| sticky | 1000 | 디렉터리 안의 파일을 소유자(또는 root)만 삭제·이름 변경 가능 (예: /tmp) |
기본 권한과 umask
새 파일을 만들 때 요청된 모드에서 umask에 해당하는 비트가 제거된다. 일반 파일의 기본 요청 모드는 666, 디렉터리는 777이다. umask가 022이면 파일은 644, 디렉터리는 755가 된다.
4. 코드 예제
#!/usr/bin/env bash
set -eu
# 실습용 임시 디렉터리 생성
workdir="$(mktemp -d)"
cd "$workdir"
# 1) 파일 생성 후 기본 권한 확인
umask 022
echo 'echo hello' > run.sh
ls -l run.sh # -rw-r--r-- (644)
# 2) 실행 권한이 없으면 직접 실행 불가
./run.sh || echo "실행 실패: Permission denied"
# 3) 기호 모드로 소유자에게 실행 권한 추가
chmod u+x run.sh
ls -l run.sh # -rwxr--r-- (744)
./run.sh # hello 출력
# 4) 숫자 모드로 한 번에 지정
chmod 750 run.sh # rwxr-x---
stat -c '%a %A %U:%G %n' run.sh 2>/dev/null || stat -f '%Lp %Sp %Su:%Sg %N' run.sh
# 5) 그룹/기타 권한 제거
chmod go-rwx run.sh
ls -l run.sh # -rwx------
# 6) 디렉터리 x 권한의 의미
mkdir secret
echo data > secret/file.txt
chmod 644 secret # x 제거
cat secret/file.txt || echo "디렉터리에 x가 없어 접근 불가"
chmod 755 secret
cat secret/file.txt # data
# 7) 소유자 변경은 root 권한 필요
# sudo chown alice:developers run.sh
# 정리
cd /
rm -rf "$workdir"stat의 옵션은 GNU(리눅스)와 BSD(macOS)가 달라서 위 예제에서는 두 형식을 순서대로 시도한다.
5. 시간 복잡도 또는 성능 특성
- 권한 검사는 파일을 열 때(
open등) 경로의 각 디렉터리를 거치며 이루어진다. 경로가 깊을수록 검사 횟수가 늘어나지만, 일반적인 작업에서 체감될 만한 비용은 아니다. - 모드는 inode에 저장된 소수의 비트(권한 9비트와 특수 비트 3비트)이므로 저장 공간 부담이 거의 없다.
- 한 번 파일을 연 뒤에는 열린 파일 디스크립터(file descriptor)로 읽고 쓰므로, 이후의
read/write마다 경로 기반 권한 검사를 반복하지 않는다. 따라서 파일을 연 뒤에chmod로 권한을 바꿔도 이미 열려 있는 디스크립터의 접근은 유지된다. chmod -R,chown -R은 하위 항목 수에 비례해 시간이 걸린다. 항목 수를 n이라 하면 O(n)이다.
6. 실무 사용 사례
- SSH 키:
~/.ssh디렉터리는700, 개인 키(id_ed25519등)는600이어야 한다. 권한이 느슨하면 OpenSSH가 키 사용을 거부한다. - 웹 서버 배포: Nginx나 Apache를 전용 계정(
www-data등)으로 실행하고, 정적 파일은 읽기만 가능하게 두며, 업로드 디렉터리에만 쓰기 권한을 준다. - 스크립트 실행: 배포 스크립트나 Git hook이 동작하지 않을 때 실행 비트 누락이 흔한 원인이다.
chmod +x로 해결한다. - 공유 디렉터리: 팀 디렉터리에 setgid를 설정하면 새 파일이 팀 그룹을 상속해 협업이 편해진다.
- Docker 볼륨: 컨테이너 내부 UID와 호스트 파일 소유자가 맞지 않아
Permission denied가 나는 경우가 많다. UID/GID를 맞추거나chown으로 조정한다.
7. 주의할 점
- `chmod 777` 남용: 모든 사용자에게 쓰기를 허용하므로 보안 위험이 크다. 오류가 나면 원인(소유자, 그룹, 상위 디렉터리 x 권한)을 먼저 확인한다.
- `chmod -R 755`로 전체 적용: 일반 파일에도 실행 비트가 붙는다. 파일과 디렉터리를 구분해 적용한다.
``shell find ./site -type d -exec chmod 755 {} + find ./site -type f -exec chmod 644 {} + ``
- 디렉터리의 w 권한: 디렉터리에 쓰기 권한이 있으면 그 안의 파일 권한과 무관하게 파일을 삭제할 수 있다. 공유 디렉터리에는 sticky 비트를 고려한다.
- setuid 주의: 소유자가 root인 setuid 프로그램은 취약점이 곧 권한 상승으로 이어질 수 있어 꼭 필요한 경우에만 쓴다.
- 스크립트의 setuid: 리눅스는 보안상 대부분 셸 스크립트의 setuid를 무시한다.
- `sudo`로 만든 파일:
sudo로 생성한 파일은 소유자가 root가 되어 이후 일반 계정으로 수정할 수 없을 수 있다. - ACL과 SELinux: 기본 9비트 모델 외에 ACL(
setfacl)이나 SELinux, AppArmor 같은 추가 접근 제어가 걸려 있으면 모드가 맞아도 거부될 수 있다.
8. 핵심 정리
- 권한은 user / group / other 세 부류에 대해 r(4), w(2), x(1)을 조합해 지정하며, 숫자 모드로는
754처럼 표기한다. - 커널은 소유자 → 그룹 → 기타 순으로 해당하는 부류 하나만 적용한다.
- 디렉터리의 x는 "진입 및 하위 항목 접근", w는 "항목 생성·삭제", r은 "목록 조회"를 뜻한다.
- 경로의 모든 상위 디렉터리에 x 권한이 있어야 파일에 접근할 수 있다.
chmod는 모드를,chown은 소유자와 그룹을 바꾸며,umask는 새 파일의 기본 권한을 결정한다.- 최소 권한 원칙에 따라 필요한 만큼만 부여하고,
777과 무분별한 재귀 적용은 피한다.