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

1. 들어가며

계정을 삭제하면 그 사용자가 만든 파일은 어떻게 될까? 많은 사람이 "함께 사라진다"고 생각하지만 그렇지 않다. userdel은 계정 정보(passwd·shadow·group)와, -r을 주면 홈 디렉터리만 지운다. 시스템 곳곳에 흩어진 그 사용자의 파일은 그대로 남는다. 다만 이름을 표시할 수 없어 UID 숫자 로 보인다.

더 위험한 것은 그다음이다. 같은 UID로 새 계정을 만들면, 남아 있던 파일들의 소유자가 새 계정으로 바뀐다. 커널은 이름이 아니라 UID로 소유를 판단하기 때문이다(31편). 이번 글에서는 이 승계 과정을 실제로 재현한다.


2. 핵심 개념

2-1. userdel이 지우는 것과 안 지우는 것

지우는 것안 지우는 것
/etc/passwd·/etc/shadow·/etc/group의 항목홈 밖 파일 (/data, /var, /tmp 등)
-r 옵션 시 홈 디렉터리·메일 스풀cron 작업, 실행 중 프로세스

2-2. orphan 파일

소유자 UID에 해당하는 계정이 없어진 파일을 orphan(고아) 파일이라 한다. ls -l에서 이름 대신 UID 숫자 로 표시되고, find -nouser로 찾을 수 있다.

2-3. UID 재사용의 위험

UID는 재사용된다. 계정을 삭제하면 그 UID가 비고, 다음에 useradd하면 다시 할당될 수 있다. 이때 남아 있던 orphan 파일의 소유자가 새 계정 이 된다. 새 사용자가 이전 사용자의 파일을 읽고 쓸 수 있게 되는 것이다.


3. 동작 원리

userdel — 계정은 지워도 파일은 UID 로 남는다

파일 inode에는 소유자가 UID 숫자 로 저장된다(13편). /etc/passwd는 그 숫자를 이름으로 바꿔 주는 매핑표일 뿐이다. 계정을 삭제하면 매핑만 사라지고 inode의 UID는 그대로다. 그래서:

  1. olduser(UID 1500)가 /data/shared/file.txt를 소유
  2. userdel -r olduser → passwd에서 매핑 제거, 홈 삭제
  3. /data/shared/file.txt의 inode는 여전히 UID 1500 → ls -l이 이름을 못 찾아 1500으로 표시
  4. useradd -u 1500 newuser → UID 1500에 새 이름 매핑
  5. /data/shared/file.txt가 이제 newuser 소유로 표시

이것은 버그가 아니라 UID 기반 설계의 자연스러운 결과다. 그래서 계정 삭제 전에 그 계정의 파일을 먼저 처리 하는 절차가 중요하다.


4. 명령어 실습

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 소유!

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 계정 삭제와 UID 승계

텍스트 원본(실제 출력):

[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 의 파일을 소유하게 됨

6. 결과 해석

출력해석
-rw-r--r-- olduser olduser삭제 전, 이름으로 표시
userdel -r olduser (출력 없음)계정·홈 삭제 성공
ls -ln → 1500 1500매핑이 사라져 UID 숫자 로 표시
ls -l → 1500 1500이름 변환 실패로 숫자 그대로
find /data -nouser → olduser-file.txtorphan 파일 탐지
useradd -u 1500 newuser 후 ls -l → newuser newuser새 계정이 옛 파일을 소유

마지막 줄이 핵심이다. newuser는 olduser-file.txt를 만든 적이 없지만, 같은 UID를 받았다는 이유만으로 소유자가 됐다. 이것이 UID 재사용의 위험이다.


7. 보안 관점

위험설명대응
UID 승계새 계정이 옛 계정 파일 접근삭제 전 파일 처리, UID 재사용 지양
orphan 파일 방치소유자 불명 파일이 시스템에 남음find -nouser -nogroup 정기 점검
잔여 cron·프로세스삭제된 계정의 작업이 계속 실행삭제 전 cron·프로세스 정리
감사 이력 손실즉시 삭제 시 조사 근거 소실삭제 전 비활성화 기간

안전한 삭제 절차:

  1. usermod -L user; usermod -s /usr/sbin/nologin user (비활성화, 36편)
  2. find / -uid <UID> -xdev (소유 파일 파악)
  3. 파일 보존·이관(chown)·삭제 결정
  4. cron·프로세스 정리
  5. userdel -r user
  6. find / -nouser -nogroup (orphan 점검)

8. 보안관제 관점

[정기 점검]  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로 "삭제된 계정이 무엇을 남겼는지" 추적

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

실수결과예방
파일 처리 없이 바로 userdelorphan·UID 승계삭제 전 find -uid
-r 없이 삭제홈 디렉터리 잔존홈 처리 확인 후 -r
삭제된 UID 즉시 재사용소유권 승계UID 재사용 지연 정책
cron·프로세스 미정리삭제 후에도 작업 실행삭제 전 정리
감사 없이 즉시 삭제조사 근거 소실비활성화 기간 후 삭제

10. 실습 체크리스트

[ ] userdel 이 홈 밖 파일을 지우지 않음을 확인했다
[ ] 삭제 후 파일이 UID 숫자로 표시되는 것을 확인했다
[ ] find -nouser 로 orphan 파일을 찾았다
[ ] 같은 UID 새 계정이 옛 파일을 승계하는 것을 재현했다
[ ] 안전한 삭제 절차 5단계를 설명할 수 있다
[ ] UID 재사용 위험을 이해했다

11. 핵심 정리

  • userdel은 계정 정보와 (-r 시) 홈만 지운다. 홈 밖 파일은 남는다.
  • 남은 파일은 소유자 이름을 못 찾아 UID 숫자 로 표시된다(orphan).
  • 같은 UID로 새 계정을 만들면 그 파일들을 승계 한다.
  • 안전한 삭제는 비활성화 → 파일 파악(find -uid) → 처리 → 삭제 → orphan 점검 순이다.
  • orphan 파일(find -nouser)을 정기 점검하고 UID 재사용을 지연한다.
  • 침해 조사에서 orphan 파일의 UID로 삭제된 계정의 흔적을 추적한다.

12. 다음 편 예고

다음 글 「38. groupadd와 그룹 관리」 에서는 그룹을 만들고(groupadd), 이름·GID를 바꾸고(groupmod), 구성원을 관리하고(gpasswd), 삭제하는(groupdel) 전 과정을 다룬다. 특히 사용자의 기본 그룹은 삭제할 수 없다 는 제약을 확인한다.


참고 자료


시리즈 이동

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

0개의 댓글