파일 · 권한 · 사용자 관리 31 / 50 · Part 4. 사용자와 그룹 관리
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹

1. 들어가며

Part 4 「사용자와 그룹 관리」를 시작한다. Part 3에서 권한(rwx)과 소유자·그룹을 다뤘다면, Part 4는 그 주체인 사용자와 그룹 자체 를 파고든다.

이번 글의 핵심 메시지는 하나다. 커널은 사용자를 "이름"이 아니라 "UID 숫자"로 구분한다. analyst, root 같은 이름은 사람의 편의를 위해 /etc/passwd가 번호와 이름을 매핑할 뿐이다. 이 사실은 계정 보안의 여러 함정과 직결된다. 예를 들어 같은 UID를 가진 두 계정은 커널 입장에서 동일한 사용자 다.

이번 글에서는 계정을 이루는 5요소(UID·사용자명·기본 GID·홈·로그인 셸)를 id와 getent로 확인한다.


2. 핵심 개념

2-1. 계정을 이루는 5요소

요소의미확인
UID사용자 번호 (권한의 실제 주체)id -u
사용자명사람이 쓰는 이름id -un, whoami
기본 GID새 파일의 기본 그룹id -g
홈 디렉터리로그인 후 위치·개인 파일getent passwd 6번째 필드
로그인 셸로그인 시 실행 프로그램. 로그인 가능 여부 결정7번째 필드

2-2. UID 범위

UID용도
0root (슈퍼유저)
1~999시스템·서비스 계정 (Rocky·Ubuntu 공통 관례)
1000~일반 로그인 사용자
65534nobody (권한 최소 계정)

일반 사용자 시작 UID가 1000인 것은 /etc/login.defs의 UID_MIN으로 정해진다.

2-3. 로그인 가능 계정 vs 시스템 계정

로그인 셸이 /sbin/nologin이나 /bin/false면 그 계정으로는 대화형 로그인이 불가능 하다. 서비스 계정(웹서버, DB 등)은 대부분 이렇게 설정되어, 계정이 탈취돼도 셸을 얻지 못하게 한다.


3. 동작 원리

Linux 사용자 계정 구조

로그인 과정을 보면 UID의 역할이 분명해진다.

  1. 사용자가 이름과 비밀번호를 입력한다.
  2. 시스템이 /etc/passwd에서 이름 → UID를 찾고, /etc/shadow에서 비밀번호를 검증한다(33편).
  3. 검증되면 그 UID·GID로 셸 프로세스를 시작한다.
  4. 이후 모든 권한 검사는 UID·GID로 이루어진다. 이름은 더 이상 쓰이지 않는다.

그래서 파일 소유자도 UID로 저장되고(12편), ls -l이 이름으로 보여 주는 것은 그때그때 변환한 결과다. 이 구조의 함의:

  • 같은 UID = 같은 사용자: /etc/passwd에 UID 0인 계정을 하나 더 만들면 그것은 또 다른 root 다(32편). 공격자의 백도어 기법.
  • 계정 삭제 후 UID 재사용: 삭제된 계정의 파일이 남아 있는데 같은 UID로 새 계정이 생기면, 새 계정이 그 파일들을 소유하게 된다(37편).

4. 명령어 실습

# 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

5. 실행 결과

Rocky Linux 9.8

실제 실행 결과 — Rocky Linux 9.8 · analyst@rocky9-lab — 계정 구조

Ubuntu 24.04.5

실제 실행 결과 — Ubuntu 24.04.5 · analyst@ubuntu-lab — 계정 구조

텍스트 원본(실제 출력) — 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

6. 결과 해석

출력해석
uid=1000(analyst) gid=1000(analyst)UID·GID가 1000. 괄호 안이 이름
id -u → 1000커널이 쓰는 실제 값
getent passwd analyst → analyst:x:1000:1000::/home/analyst:/bin/bash7개 필드 (32편에서 상세)
root:x:0:0:root:/root:/bin/bashroot의 UID·GID = 0
로그인 가능 셸 계정 = root, analyst이 컨테이너에는 대화형 로그인 계정이 둘뿐
Rocky 로그인 불가 셸 계정 = 11, Ubuntu = 21배포판마다 기본 시스템 계정 수가 다르다. Ubuntu가 더 많은 서비스 계정을 기본 포함

Rocky와 Ubuntu의 시스템 계정 수 차이(11 vs 21)가 실무 포인트다. 계정 점검 시 "정상 계정 목록"은 배포판·설치 구성마다 다르므로, 시스템별 기준값(Baseline) 을 따로 관리해야 한다(48편).


7. 보안 관점

주제내용
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 하나뿐인지 확인한다. 둘 이상이면 즉시 조사 대상이다.


8. 보안관제 관점

[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으로 감시
IOCUID 0 추가 계정, 서비스 계정의 대화형 셸, 비정상 홈 경로
Baseline배포판별로 정상 계정이 다르므로 시스템별 기준값 관리

9. 실무에서 자주 발생하는 실수

실수결과예방
이름만으로 계정 식별UID 재사용·중복 UID 놓침UID 함께 확인
서비스 계정에 로그인 셸 부여탈취 시 셸 획득nologin/false
UID 0 중복 미점검백도어 root 방치awk '$3==0' 점검
배포판 공통 계정 목록 가정오탐/누락시스템별 Baseline
nobody로 서비스 실행 후 안심여전히 일부 접근 가능전용 최소 권한 계정

10. 실습 체크리스트

[ ] id 로 UID·GID·그룹을 확인했다
[ ] 커널이 UID 로 사용자를 구분한다는 것을 이해했다
[ ] getent passwd 로 계정 필드를 확인했다
[ ] 로그인 가능 계정과 시스템 계정을 구분했다
[ ] UID 0 계정이 root 뿐인지 점검하는 방법을 안다
[ ] 배포판마다 시스템 계정 수가 다름을 확인했다

11. 핵심 정리

  • 계정은 UID·사용자명·기본 GID·홈·로그인 셸 로 이루어진다.
  • 커널은 사용자를 UID 숫자 로 구분한다. 이름은 매핑일 뿐이다.
  • UID 0 = root. 같은 UID는 커널 입장에서 동일 사용자다.
  • 서비스 계정은 nologin/false 셸로 로그인을 차단한다.
  • 일반 사용자는 UID 1000부터, 시스템 계정 수는 배포판마다 다르다.
  • UID 0 중복·서비스 계정 셸·UID 재사용을 점검한다.

12. 다음 편 예고

다음 글 「32. /etc/passwd 분석」 에서는 계정 정보를 담은 /etc/passwd의 7개 필드를 한 칸씩 해석하고, 이 파일에서 읽어 낼 수 있는 백도어 계정·권한 이상 신호를 정리한다.


참고 자료


시리즈 이동

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글