파일 · 권한 · 사용자 관리 31 / 50 · Part 4. 사용자와 그룹 관리
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹
Part 4 「사용자와 그룹 관리」를 시작한다. Part 3에서 권한(rwx)과 소유자·그룹을 다뤘다면, Part 4는 그 주체인 사용자와 그룹 자체 를 파고든다.
이번 글의 핵심 메시지는 하나다. 커널은 사용자를 "이름"이 아니라 "UID 숫자"로 구분한다. analyst, root 같은 이름은 사람의 편의를 위해 /etc/passwd가 번호와 이름을 매핑할 뿐이다. 이 사실은 계정 보안의 여러 함정과 직결된다. 예를 들어 같은 UID를 가진 두 계정은 커널 입장에서 동일한 사용자 다.
이번 글에서는 계정을 이루는 5요소(UID·사용자명·기본 GID·홈·로그인 셸)를 id와 getent로 확인한다.
| 요소 | 의미 | 확인 |
|---|---|---|
| UID | 사용자 번호 (권한의 실제 주체) | id -u |
| 사용자명 | 사람이 쓰는 이름 | id -un, whoami |
| 기본 GID | 새 파일의 기본 그룹 | id -g |
| 홈 디렉터리 | 로그인 후 위치·개인 파일 | getent passwd 6번째 필드 |
| 로그인 셸 | 로그인 시 실행 프로그램. 로그인 가능 여부 결정 | 7번째 필드 |
| UID | 용도 |
|---|---|
0 | root (슈퍼유저) |
1~999 | 시스템·서비스 계정 (Rocky·Ubuntu 공통 관례) |
1000~ | 일반 로그인 사용자 |
65534 | nobody (권한 최소 계정) |
일반 사용자 시작 UID가 1000인 것은 /etc/login.defs의 UID_MIN으로 정해진다.
로그인 셸이 /sbin/nologin이나 /bin/false면 그 계정으로는 대화형 로그인이 불가능 하다. 서비스 계정(웹서버, DB 등)은 대부분 이렇게 설정되어, 계정이 탈취돼도 셸을 얻지 못하게 한다.

로그인 과정을 보면 UID의 역할이 분명해진다.
/etc/passwd에서 이름 → UID를 찾고, /etc/shadow에서 비밀번호를 검증한다(33편).그래서 파일 소유자도 UID로 저장되고(12편), ls -l이 이름으로 보여 주는 것은 그때그때 변환한 결과다. 이 구조의 함의:
/etc/passwd에 UID 0인 계정을 하나 더 만들면 그것은 또 다른 root 다(32편). 공격자의 백도어 기법.# 1) 내 계정 정보
id
id -u; id -un; id -g; id -gn; id -G # UID, 이름, GID, 그룹명, 전체 그룹
whoami
# 2) 계정 항목 조회
getent passwd analyst
getent passwd root
# 3) 로그인 가능 셸을 가진 계정
grep -E ':/bin/bash$|:/bin/sh$' /etc/passwd | head
# 4) 일반 사용자(UID>=1000)와 로그인 불가 계정 구분
awk -F: '$3>=1000 && $3<65534 {print $1" (uid="$3")"}' /etc/passwd
awk -F: '$7 ~ /(nologin|false)$/ {c++} END {print "로그인 불가 셸 계정 수: "c}' /etc/passwd
Rocky Linux 9.8

Ubuntu 24.04.5

텍스트 원본(실제 출력) — Rocky:
[analyst@rocky9-lab ~]$ id
uid=1000(analyst) gid=1000(analyst) groups=1000(analyst)
[analyst@rocky9-lab ~]$ id -u; id -un; id -g; id -gn; id -G
1000
analyst
1000
analyst
1000
[analyst@rocky9-lab ~]$ whoami
analyst
[analyst@rocky9-lab ~]$ getent passwd analyst
analyst:x:1000:1000::/home/analyst:/bin/bash
[analyst@rocky9-lab ~]$ getent passwd root
root:x:0:0:root:/root:/bin/bash
[analyst@rocky9-lab ~]$ grep -E ':/bin/bash$|:/bin/sh$' /etc/passwd | head
root:x:0:0:root:/root:/bin/bash
analyst:x:1000:1000::/home/analyst:/bin/bash
[analyst@rocky9-lab ~]$ echo "=== 로그인 가능 계정 vs 시스템 계정 ==="
=== 로그인 가능 계정 vs 시스템 계정 ===
[analyst@rocky9-lab ~]$ awk -F: '$3>=1000 && $3<65534 {print $1" (uid="$3")"}' /etc/passwd
analyst (uid=1000)
[analyst@rocky9-lab ~]$ awk -F: '$7 ~ /(nologin|false)$/ {c++} END {print "로그인 불가 셸 계정 수: "c}' /etc/passwd
로그인 불가 셸 계정 수: 11
| 출력 | 해석 |
|---|---|
uid=1000(analyst) gid=1000(analyst) | UID·GID가 1000. 괄호 안이 이름 |
id -u → 1000 | 커널이 쓰는 실제 값 |
getent passwd analyst → analyst:x:1000:1000::/home/analyst:/bin/bash | 7개 필드 (32편에서 상세) |
root:x:0:0:root:/root:/bin/bash | root의 UID·GID = 0 |
| 로그인 가능 셸 계정 = root, analyst | 이 컨테이너에는 대화형 로그인 계정이 둘뿐 |
| Rocky 로그인 불가 셸 계정 = 11, Ubuntu = 21 | 배포판마다 기본 시스템 계정 수가 다르다. Ubuntu가 더 많은 서비스 계정을 기본 포함 |
Rocky와 Ubuntu의 시스템 계정 수 차이(11 vs 21)가 실무 포인트다. 계정 점검 시 "정상 계정 목록"은 배포판·설치 구성마다 다르므로, 시스템별 기준값(Baseline) 을 따로 관리해야 한다(48편).
| 주제 | 내용 |
|---|---|
| UID 0 = root | 이름과 무관하게 UID가 0이면 root 권한. toor:x:0:0 같은 백도어 계정 주의(32편) |
| 로그인 셸 | 서비스 계정은 nologin/false로 로그인 차단. 서비스 계정에 /bin/bash가 있으면 이상 신호 |
| nobody | 권한이 거의 없는 계정. 권한 최소화가 필요한 프로세스가 사용 |
| UID 재사용 | 계정 삭제 후 같은 UID 재할당 시 파일 소유권 승계 위험(37편) |
핵심 점검: awk -F: '($3==0)' /etc/passwd로 UID 0 계정이 root 하나뿐인지 확인한다. 둘 이상이면 즉시 조사 대상이다.
[Baseline] 정상 계정 목록·UID·셸 저장
getent passwd | awk -F: '{print $1,$3,$7}' | sort > /var/lib/baseline/accounts.txt
↓
[정기 점검] 신규·변경 계정 탐지
diff <(getent passwd | awk -F: '{print $1,$3,$7}' | sort) /var/lib/baseline/accounts.txt
↓
[이상 신호] UID 0 추가 계정 / 서비스 계정에 로그인 셸 / 예상 밖 UID>=1000 계정
↓
[Evidence] /etc/passwd 변경 시각(stat), useradd 로그(secure/auth.log)
↓
[Response] 비인가 계정 잠금·삭제, 생성 경위(sudo 로그, 49편) 조사
| 관점 | 내용 |
|---|---|
| Detection | /etc/passwd 변경, useradd/usermod 실행을 auditd·FIM으로 감시 |
| IOC | UID 0 추가 계정, 서비스 계정의 대화형 셸, 비정상 홈 경로 |
| Baseline | 배포판별로 정상 계정이 다르므로 시스템별 기준값 관리 |
| 실수 | 결과 | 예방 |
|---|---|---|
| 이름만으로 계정 식별 | UID 재사용·중복 UID 놓침 | UID 함께 확인 |
| 서비스 계정에 로그인 셸 부여 | 탈취 시 셸 획득 | nologin/false |
| UID 0 중복 미점검 | 백도어 root 방치 | awk '$3==0' 점검 |
| 배포판 공통 계정 목록 가정 | 오탐/누락 | 시스템별 Baseline |
| nobody로 서비스 실행 후 안심 | 여전히 일부 접근 가능 | 전용 최소 권한 계정 |
[ ] id 로 UID·GID·그룹을 확인했다
[ ] 커널이 UID 로 사용자를 구분한다는 것을 이해했다
[ ] getent passwd 로 계정 필드를 확인했다
[ ] 로그인 가능 계정과 시스템 계정을 구분했다
[ ] UID 0 계정이 root 뿐인지 점검하는 방법을 안다
[ ] 배포판마다 시스템 계정 수가 다름을 확인했다
nologin/false 셸로 로그인을 차단한다.다음 글 「32. /etc/passwd 분석」 에서는 계정 정보를 담은 /etc/passwd의 7개 필드를 한 칸씩 해석하고, 이 파일에서 읽어 낼 수 있는 백도어 계정·권한 이상 신호를 정리한다.