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프로세스가 파일에 접근하면 커널은 대략 다음 순서로 판단한다.
- 프로세스의 유효 UID(effective UID)가 0이면 대부분 허용한다. (root는 일반 권한 검사를 우회한다.)
- 유효 UID가 파일 소유자와 같으면 소유자 비트를 적용한다.
- 프로세스의 유효 GID 또는 보조 그룹 중 파일의 소유 그룹과 같은 것이 있으면 그룹 비트를 적용한다.
- 그 외에는 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 sharedsetgid 비트(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를 활용한다.