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

User / Group: UID·GID로 프로세스와 파일의 접근 주체를 구분하는 리눅스 권한 모델

리눅스는 사용자 이름이 아니라 숫자 식별자인 UID와 GID로 접근 주체를 구분한다. 파일과 프로세스는 소유자(user)와 소유 그룹(group)을 가지며, 커널은 이 값을 기반으로 읽기·쓰기·실행 권한을 판단한다. 이 글에서는 /etc/passwd, /etc/group의 구조와 주요 명령어, 실무에서 자주 만나는 권한 문제를 다룬다.

By 송민성

1. 개념

사용자(User)는 시스템 자원에 접근하는 주체를 나타내는 계정이다. 각 사용자는 고유한 숫자인 UID(User ID)를 가진다. 그룹(Group)은 여러 사용자를 묶어 권한을 한꺼번에 부여하기 위한 단위이며, 고유한 숫자인 GID(Group ID)를 가진다.

  • 사용자 이름(alice)은 사람이 읽기 위한 라벨이고, 커널이 실제로 비교하는 값은 UID/GID이다.
  • 관례상 UID 0은 슈퍼유저 root이다.
  • 많은 배포판에서 일반 사용자 UID는 1000부터 시작하고, 1000 미만은 시스템 계정용으로 쓰인다. (배포판별 설정 /etc/login.defs에 따라 다를 수 있다.)
  • 한 사용자는 기본 그룹(primary group) 하나와 0개 이상의 보조 그룹(supplementary group)에 속한다.

2. 왜 사용하는가

  • 접근 제어(Access Control): 파일마다 "누가 무엇을 할 수 있는지"를 정해야 한다.
  • 최소 권한 원칙(Principle of Least Privilege): 웹 서버, DB 같은 서비스를 root가 아닌 전용 계정으로 실행하면 취약점이 악용되어도 피해 범위가 제한된다.
  • 협업: 같은 팀원을 그룹으로 묶으면 파일 하나하나에 개별 사용자 권한을 설정하지 않아도 된다.
  • 격리: 사용자별 홈 디렉터리와 프로세스 소유권으로 서로의 작업을 분리한다.

3. 동작 원리

계정 정보 저장 위치

파일내용
/etc/passwd사용자 이름, UID, 기본 GID, 홈 디렉터리, 로그인 셸
/etc/shadow암호 해시 (root만 읽기 가능)
/etc/group그룹 이름, GID, 소속 사용자 목록

/etc/passwd의 한 줄은 콜론(:)으로 구분된 7개 필드이다.

text
alice:x:1001:1001:Alice:/home/alice:/bin/bash
이름 :암호:UID :GID :설명 :홈          :셸

암호 필드의 x는 실제 해시가 /etc/shadow에 있다는 뜻이다.

권한 검사

파일에는 소유자(user), 소유 그룹(group), 그 외(other)에 대한 읽기(r)·쓰기(w)·실행(x) 비트가 있다.

text
-rw-r----- 1 alice devs 120 Oct 25 10:00 report.txt

프로세스가 파일에 접근하면 커널은 대략 다음 순서로 판단한다.

  1. 프로세스의 유효 UID(effective UID)가 0이면 대부분 허용한다. (root는 일반 권한 검사를 우회한다.)
  2. 유효 UID가 파일 소유자와 같으면 소유자 비트를 적용한다.
  3. 프로세스의 유효 GID 또는 보조 그룹 중 파일의 소유 그룹과 같은 것이 있으면 그룹 비트를 적용한다.
  4. 그 외에는 other 비트를 적용한다.

소유자 비트가 먼저 적용되므로, 소유자이면서 그룹 구성원이어도 소유자 비트가 우선한다.

4. 코드 예제

현재 사용자 확인

shell
id # uid=1001(alice) gid=1001(alice) groups=1001(alice),1002(devs) whoami groups

사용자·그룹 생성과 소속 변경

shell
# 그룹 생성 sudo groupadd devs # 홈 디렉터리(-m)를 가진 사용자 생성, 기본 그룹 devs sudo useradd -m -g devs -s /bin/bash bob # 기존 사용자를 보조 그룹에 추가 (-a 필수) sudo usermod -aG devs alice # 암호 설정 sudo passwd bob # 확인 getent passwd bob getent group devs

파일 소유권과 권한 변경

shell
mkdir shared sudo chown alice:devs shared # 소유자:그룹 변경 sudo chmod 2770 shared # rwxrws---, setgid 비트 포함 ls -ld shared # drwxrws--- 2 alice devs 4096 Oct 25 10:00 shared

setgid 비트(2xxx)가 디렉터리에 설정되면 그 안에서 새로 만든 파일이 생성자의 기본 그룹이 아니라 디렉터리의 그룹을 상속한다. 팀 공유 디렉터리에서 유용하다.

프로그램에서 UID/GID 확인 (Python)

python
import os import pwd import grp uid = os.getuid() gid = os.getgid() print("UID:", uid, "이름:", pwd.getpwuid(uid).pw_name) print("GID:", gid, "이름:", grp.getgrgid(gid).gr_name) # 보조 그룹 목록 for g in os.getgroups(): print("보조 그룹:", g, grp.getgrgid(g).gr_name) # 특정 파일의 소유자 확인 st = os.stat("/etc/passwd") print("소유자:", pwd.getpwuid(st.st_uid).pw_name) print("그룹:", grp.getgrgid(st.st_gid).gr_name)

5. 시간 복잡도 또는 성능 특성

  • /etc/passwd와 /etc/group은 텍스트 파일이므로, 이름으로 조회하는 기본 방식은 파일을 순차 탐색하는 것과 같아 계정 수 n에 대해 O(n)이다.
  • 권한 검사 자체는 inode에 저장된 UID/GID/모드 비트를 프로세스 자격 증명(credentials)과 비교하는 작업이다. 보조 그룹을 확인할 때는 프로세스가 가진 그룹 수만큼 비교가 늘어날 수 있다.
  • 조회 경로는 nsswitch.conf 설정에 따라 LDAP, SSSD 등 외부 디렉터리를 거칠 수 있고, 이 경우 네트워크 지연이 ls -l 같은 명령의 응답 시간에 영향을 줄 수 있다.

6. 실무 사용 사례

  • 서비스 전용 계정: nginx, postgres 같은 데몬은 전용 계정으로 실행한다. 로그인 셸은 /usr/sbin/nologin으로 막는 경우가 많다.
  • 배포 디렉터리 공유: 배포 담당 그룹에 쓰기 권한을 주고 디렉터리에 setgid를 설정한다.
  • Docker 그룹: 사용자를 docker 그룹에 추가하면 sudo 없이 Docker를 쓸 수 있다. 다만 사실상 root에 준하는 권한이므로 신중해야 한다.
  • 컨테이너 볼륨 권한 문제: 컨테이너 안의 UID와 호스트 UID가 이름이 아닌 숫자로 매칭되기 때문에, 볼륨 파일의 소유자가 의도와 다르게 보이는 일이 흔하다.
  • sudo 설정: sudo 그룹이나 /etc/sudoers로 특정 사용자·그룹에 관리자 명령 실행 권한을 위임한다.

7. 주의할 점

  • `usermod -G`만 쓰면 기존 보조 그룹이 덮어씌워진다. 추가할 때는 반드시 -aG를 쓴다.
  • 그룹 변경은 새 로그인 세션부터 적용된다. 이미 실행 중인 셸에는 반영되지 않으므로 재로그인하거나 newgrp devs를 사용한다.
  • 계정 삭제 시 파일이 남는다. userdel은 기본적으로 홈 디렉터리를 지우지 않으며(-r 옵션 필요), 남은 파일은 숫자 UID로만 표시되어 나중에 같은 UID를 받은 다른 사용자가 소유하게 될 수 있다.
  • `/etc/passwd`를 직접 수정하지 않는다. 잘못 편집하면 로그인이 불가능해질 수 있다. 수정이 필요하면 vipw, vigr 또는 표준 명령어를 사용한다.
  • root 상시 사용 금지. 평소에는 일반 계정을 쓰고 필요할 때만 sudo를 사용한다.
  • `chmod 777`로 문제를 해결하지 않는다. 권한 오류의 원인은 대개 소유자나 그룹이 잘못된 것이므로 ls -l과 id로 먼저 확인한다.

8. 핵심 정리

  • 커널은 이름이 아니라 숫자인 UID/GID로 주체를 구분한다.
  • 계정 정보는 /etc/passwd, /etc/shadow, /etc/group에 저장된다.
  • 파일 권한은 소유자 → 그룹 → 기타 순서로 검사하며, 먼저 일치하는 범주의 비트가 적용된다.
  • 사용자는 기본 그룹 1개와 여러 보조 그룹에 속할 수 있고, 그룹 추가는 usermod -aG를 쓴다.
  • 서비스는 전용 계정으로 실행해 최소 권한 원칙을 지키고, 공유 디렉터리에는 setgid를 활용한다.