파일 · 권한 · 사용자 관리 37 / 50 · Part 4. 사용자와 그룹 관리
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹
계정을 삭제하면 그 사용자가 만든 파일은 어떻게 될까? 많은 사람이 "함께 사라진다"고 생각하지만 그렇지 않다. userdel은 계정 정보(passwd·shadow·group)와, -r을 주면 홈 디렉터리만 지운다. 시스템 곳곳에 흩어진 그 사용자의 파일은 그대로 남는다. 다만 이름을 표시할 수 없어 UID 숫자 로 보인다.
더 위험한 것은 그다음이다. 같은 UID로 새 계정을 만들면, 남아 있던 파일들의 소유자가 새 계정으로 바뀐다. 커널은 이름이 아니라 UID로 소유를 판단하기 때문이다(31편). 이번 글에서는 이 승계 과정을 실제로 재현한다.
| 지우는 것 | 안 지우는 것 |
|---|---|
/etc/passwd·/etc/shadow·/etc/group의 항목 | 홈 밖 파일 (/data, /var, /tmp 등) |
-r 옵션 시 홈 디렉터리·메일 스풀 | cron 작업, 실행 중 프로세스 |
소유자 UID에 해당하는 계정이 없어진 파일을 orphan(고아) 파일이라 한다. ls -l에서 이름 대신 UID 숫자 로 표시되고, find -nouser로 찾을 수 있다.
UID는 재사용된다. 계정을 삭제하면 그 UID가 비고, 다음에 useradd하면 다시 할당될 수 있다. 이때 남아 있던 orphan 파일의 소유자가 새 계정 이 된다. 새 사용자가 이전 사용자의 파일을 읽고 쓸 수 있게 되는 것이다.

파일 inode에는 소유자가 UID 숫자 로 저장된다(13편). /etc/passwd는 그 숫자를 이름으로 바꿔 주는 매핑표일 뿐이다. 계정을 삭제하면 매핑만 사라지고 inode의 UID는 그대로다. 그래서:
olduser(UID 1500)가 /data/shared/file.txt를 소유userdel -r olduser → passwd에서 매핑 제거, 홈 삭제/data/shared/file.txt의 inode는 여전히 UID 1500 → ls -l이 이름을 못 찾아 1500으로 표시useradd -u 1500 newuser → UID 1500에 새 이름 매핑/data/shared/file.txt가 이제 newuser 소유로 표시이것은 버그가 아니라 UID 기반 설계의 자연스러운 결과다. 그래서 계정 삭제 전에 그 계정의 파일을 먼저 처리 하는 절차가 중요하다.
olduser(UID 1500)가/data/shared에 파일을 남긴 상황이다. root 권한 실습이다.
# 1) 삭제 전: 파일 소유자
ls -l /data/shared/olduser-file.txt
getent passwd olduser
# 2) 계정 삭제 (홈 포함)
userdel -r olduser
# 3) 삭제 후: 공유 파일은 남고 UID 숫자로 표시
ls -ln /data/shared/olduser-file.txt # 1500 1500
ls -l /data/shared/olduser-file.txt
# 4) orphan 파일 탐색
find /data -nouser 2>/dev/null
# 5) 같은 UID 로 새 계정 → 소유권 승계 재현
useradd -M -u 1500 newuser
ls -l /data/shared/olduser-file.txt # 이제 newuser 소유!

텍스트 원본(실제 출력):
[root@rocky9-lab ~]# echo "=== 삭제 전: 파일 소유자 ==="
=== 삭제 전: 파일 소유자 ===
[root@rocky9-lab ~]# ls -l /data/shared/olduser-file.txt
-rw-r--r-- 1 olduser olduser 12 Sep 24 14:52 /data/shared/olduser-file.txt
[root@rocky9-lab ~]# getent passwd olduser
olduser:x:1500:1500::/home/olduser:/bin/bash
[root@rocky9-lab ~]# echo "=== userdel (홈 삭제 -r) ==="
=== userdel (홈 삭제 -r) ===
[root@rocky9-lab ~]# userdel -r olduser 2>&1
[root@rocky9-lab ~]# echo "=== 삭제 후: 공유 파일은 남는다 (UID 숫자로) ==="
=== 삭제 후: 공유 파일은 남는다 (UID 숫자로) ===
[root@rocky9-lab ~]# ls -ln /data/shared/olduser-file.txt
-rw-r--r-- 1 1500 1500 12 Sep 24 14:52 /data/shared/olduser-file.txt
[root@rocky9-lab ~]# ls -l /data/shared/olduser-file.txt
-rw-r--r-- 1 1500 1500 12 Sep 24 14:52 /data/shared/olduser-file.txt
[root@rocky9-lab ~]# echo "=== 소유자 없는 파일 탐색 ==="
=== 소유자 없는 파일 탐색 ===
[root@rocky9-lab ~]# find /data -nouser 2>/dev/null
/data/shared/olduser-file.txt
[root@rocky9-lab ~]# echo "=== 같은 UID 로 새 계정 → 소유권 승계 (위험 재현) ==="
=== 같은 UID 로 새 계정 → 소유권 승계 (위험 재현) ===
[root@rocky9-lab ~]# useradd -M -u 1500 newuser 2>/dev/null
[root@rocky9-lab ~]# ls -l /data/shared/olduser-file.txt
-rw-r--r-- 1 newuser newuser 12 Sep 24 14:52 /data/shared/olduser-file.txt
[root@rocky9-lab ~]# echo " ↑ newuser 가 olduser 의 파일을 소유하게 됨"
↑ newuser 가 olduser 의 파일을 소유하게 됨
| 출력 | 해석 |
|---|---|
-rw-r--r-- olduser olduser | 삭제 전, 이름으로 표시 |
userdel -r olduser (출력 없음) | 계정·홈 삭제 성공 |
ls -ln → 1500 1500 | 매핑이 사라져 UID 숫자 로 표시 |
ls -l → 1500 1500 | 이름 변환 실패로 숫자 그대로 |
find /data -nouser → olduser-file.txt | orphan 파일 탐지 |
useradd -u 1500 newuser 후 ls -l → newuser newuser | 새 계정이 옛 파일을 소유 |
마지막 줄이 핵심이다. newuser는 olduser-file.txt를 만든 적이 없지만, 같은 UID를 받았다는 이유만으로 소유자가 됐다. 이것이 UID 재사용의 위험이다.
| 위험 | 설명 | 대응 |
|---|---|---|
| UID 승계 | 새 계정이 옛 계정 파일 접근 | 삭제 전 파일 처리, UID 재사용 지양 |
| orphan 파일 방치 | 소유자 불명 파일이 시스템에 남음 | find -nouser -nogroup 정기 점검 |
| 잔여 cron·프로세스 | 삭제된 계정의 작업이 계속 실행 | 삭제 전 cron·프로세스 정리 |
| 감사 이력 손실 | 즉시 삭제 시 조사 근거 소실 | 삭제 전 비활성화 기간 |
안전한 삭제 절차:
usermod -L user; usermod -s /usr/sbin/nologin user (비활성화, 36편)find / -uid <UID> -xdev (소유 파일 파악)chown)·삭제 결정userdel -r userfind / -nouser -nogroup (orphan 점검)[정기 점검] find / -xdev \( -nouser -o -nogroup \) 2>/dev/null # orphan 파일
↓
[판단] 삭제된 계정의 잔여 파일 / 곧 재사용될 UID 대역
↓
[Evidence] orphan 파일의 UID, 위치, 내용 → 이전 소유자 추정
↓
[Detection] userdel 실행(로그), /etc/passwd 항목 감소를 감시
↓
[Response] orphan 파일 처리, UID 재사용 정책 검토
| 관점 | 내용 |
|---|---|
| 점검 | orphan 파일은 계정 정리 미비의 신호. 정기 스캔 |
| UID 정책 | 삭제된 계정의 UID를 일정 기간 재할당하지 않는 정책으로 승계 방지 |
| Evidence | 침해 조사 시 orphan 파일의 UID로 "삭제된 계정이 무엇을 남겼는지" 추적 |
| 실수 | 결과 | 예방 |
|---|---|---|
파일 처리 없이 바로 userdel | orphan·UID 승계 | 삭제 전 find -uid |
-r 없이 삭제 | 홈 디렉터리 잔존 | 홈 처리 확인 후 -r |
| 삭제된 UID 즉시 재사용 | 소유권 승계 | UID 재사용 지연 정책 |
| cron·프로세스 미정리 | 삭제 후에도 작업 실행 | 삭제 전 정리 |
| 감사 없이 즉시 삭제 | 조사 근거 소실 | 비활성화 기간 후 삭제 |
[ ] userdel 이 홈 밖 파일을 지우지 않음을 확인했다
[ ] 삭제 후 파일이 UID 숫자로 표시되는 것을 확인했다
[ ] find -nouser 로 orphan 파일을 찾았다
[ ] 같은 UID 새 계정이 옛 파일을 승계하는 것을 재현했다
[ ] 안전한 삭제 절차 5단계를 설명할 수 있다
[ ] UID 재사용 위험을 이해했다
userdel은 계정 정보와 (-r 시) 홈만 지운다. 홈 밖 파일은 남는다.find -uid) → 처리 → 삭제 → orphan 점검 순이다.find -nouser)을 정기 점검하고 UID 재사용을 지연한다.다음 글 「38. groupadd와 그룹 관리」 에서는 그룹을 만들고(groupadd), 이름·GID를 바꾸고(groupmod), 구성원을 관리하고(gpasswd), 삭제하는(groupdel) 전 과정을 다룬다. 특히 사용자의 기본 그룹은 삭제할 수 없다 는 제약을 확인한다.
-nouser, -uid — https://man7.org/linux/man-pages/man1/find.1.html