본문 바로가기
TYLER SONGBlog
← Blog index
CS학습6 min read

Permission: 소유자·그룹·기타로 파일 접근을 제어하는 리눅스 권한 모델

리눅스 퍼미션(Permission)은 파일과 디렉터리에 대해 소유자(user), 그룹(group), 기타 사용자(other)별로 읽기·쓰기·실행 권한을 지정하는 접근 제어 방식이다. 권한은 9비트의 모드(mode)로 저장되며 `chmod`, `chown` 명령으로 바꾼다. 웹 서버 배포, SSH 키 관리, 스크립트 실행 같은 실무 상황에서 자주 마주치는 오

By 송민성

1. 개념

리눅스 퍼미션(Permission)은 파일 시스템의 각 객체(파일, 디렉터리)에 붙은 접근 제어 정보다. 모든 객체는 소유자(owner)와 소유 그룹(group)을 하나씩 가지며, 다음 세 부류에 대해 각각 권한을 따로 지정한다.

부류약자대상
소유자(user)u파일을 소유한 사용자
그룹(group)g파일의 소유 그룹에 속한 사용자
기타(other)o위 둘에 해당하지 않는 모든 사용자

권한 종류는 세 가지다.

권한기호숫자파일에서의 의미디렉터리에서의 의미
읽기(read)r4내용 읽기목록 조회(ls)
쓰기(write)w2내용 수정항목 생성·삭제·이름 변경
실행(execute)x1프로그램으로 실행진입(cd) 및 하위 항목 접근

2. 왜 사용하는가

리눅스는 다중 사용자(multi-user) 운영체제다. 한 시스템에서 여러 사용자와 프로세스가 같은 파일 시스템을 공유하므로 다음이 필요하다.

  • 다른 사용자의 개인 파일을 읽거나 수정하지 못하게 막는다.
  • 시스템 설정 파일을 일반 사용자가 변경하지 못하게 보호한다.
  • 웹 서버처럼 권한을 최소화한 계정으로 서비스를 돌려, 취약점이 있어도 피해 범위를 줄인다(최소 권한 원칙, principle of least privilege).

3. 동작 원리

모드(mode) 표기

ls -l의 출력 첫 열은 10글자다.

text
-rwxr-xr--
  • 첫 글자: 파일 종류 (- 일반 파일, d 디렉터리, l 심볼릭 링크)
  • 다음 9글자: 3글자씩 user / group / other 권한

위 예시는 소유자 rwx(7), 그룹 r-x(5), 기타 r--(4)이므로 숫자로 754다.

검사 순서

프로세스가 파일에 접근하면 커널은 프로세스의 유효 사용자 ID(effective UID)와 그룹 ID를 보고 다음 순서로 하나의 부류만 적용한다.

  1. 프로세스의 UID가 파일 소유자와 같으면 user 권한만 본다.
  2. 아니고 프로세스의 그룹이 파일의 소유 그룹과 일치하면 group 권한만 본다.
  3. 둘 다 아니면 other 권한을 본다.

즉 소유자인데 user 권한이 ---이고 other가 rwx여도, 소유자는 접근할 수 없다. 슈퍼유저 root(UID 0)는 대체로 이 검사를 우회한다.

디렉터리 경로 탐색

/a/b/c.txt를 열려면 /a와 /a/b에 대한 실행(x) 권한이 모두 필요하다. 파일 자체의 권한이 열려 있어도 상위 디렉터리에 x가 없으면 접근할 수 없다.

특수 비트

비트숫자효과
setuid4000실행 시 파일 소유자의 권한으로 실행
setgid2000실행 시 파일 그룹 권한으로 실행, 디렉터리에서는 새 파일이 디렉터리의 그룹을 상속
sticky1000디렉터리 안의 파일을 소유자(또는 root)만 삭제·이름 변경 가능 (예: /tmp)

기본 권한과 umask

새 파일을 만들 때 요청된 모드에서 umask에 해당하는 비트가 제거된다. 일반 파일의 기본 요청 모드는 666, 디렉터리는 777이다. umask가 022이면 파일은 644, 디렉터리는 755가 된다.

4. 코드 예제

shell
#!/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과 무분별한 재귀 적용은 피한다.