파일 · 권한 · 사용자 관리 48 / 50 · Part 5. 권한 상승과 Linux 보안
실습 환경: Rocky Linux 9.8 · Ubuntu 24.04.5 (Docker 격리 컨테이너, 테스트 계정 analyst)
기초편 연계: 「리눅스 시스템 기초」 18. Linux 사용자와 그룹 · 30. Linux 명령어를 활용한 보안 점검

1. 들어가며

47편이 파일(SUID) 측면의 점검이었다면, 이번 글은 계정 측면의 종합 점검 이다. Part 4에서 배운 계정 지식을 하나의 점검 체크리스트로 묶는다.

점검 항목:

  1. UID 0 계정 (root 외 = 백도어)
  2. 빈 비밀번호 계정
  3. 로그인 셸을 가진 시스템 계정
  4. 중복 UID
  5. sudo 권한 보유자
  6. 잠긴 계정 상태

이 중 UID 0 중복 이 최우선이다. 이름이 무엇이든 UID가 0이면 root이기 때문이다(31편). 이번 글에서는 백도어 계정·무암호 계정·시스템 계정 셸을 심어 둔 테스트 환경에서 이들을 모두 찾아낸다.


2. 핵심 개념

2-1. 점검 항목과 명령

항목명령정상
UID 0 계정awk -F: '$3==0' /etc/passwdroot 뿐
무암호 계정awk -F: '$2==""' /etc/shadow없음
시스템 계정 셸awk -F: '$3<1000 && $7~/sh$/'sync 류 외 없음
중복 UIDcut -d: -f3 /etc/passwd \| sort \| uniq -d없음
sudo 권한getent group wheel, ls /etc/sudoers.d/최소

2-2. 우선순위

우선순위발견대응
1UID 0 추가 계정즉시 격리·조사
2무암호 계정즉시 잠금
3시스템 계정 로그인 셸nologin으로 변경
4과도한 sudo규칙 축소

2-3. 중복 UID

useradd -o -u로 같은 UID의 계정을 만들 수 있다. 특히 UID 0의 중복 은 백도어 root의 전형적 형태다. 커널은 UID로 판단하므로 이름이 달라도 동등한 root다.


3. 동작 원리

Linux 계정 보안 점검 체크리스트

계정 점검은 /etc/passwd와 /etc/shadow를 awk로 분석하는 것이 핵심이다. 각 점검은 특정 필드의 이상값을 찾는다.

  • UID 0: passwd 3번 필드가 0인 행. root만 있어야 한다.
  • 무암호: shadow 2번 필드가 빈 값. 비밀번호 없이 로그인된다.
  • 시스템 계정 셸: UID 1000 미만인데 7번 필드가 셸. 서비스 계정에 대화형 셸이 있으면 이상.
  • 중복 UID: 3번 필드를 정렬해 중복 찾기.

이 점검들을 스크립트로 묶어 cron으로 정기 실행 하고, 결과를 기준값과 비교해 변화만 알리면 효과적인 계정 모니터링이 된다. SIEM에 연동하면 계정 이상을 실시간에 가깝게 탐지할 수 있다.

useradd -o -u 0처럼 중복 UID 0을 허용하는 옵션이 존재한다는 점을 아는 것도 중요하다. 공격자는 이 옵션으로 백도어 root를 만든다.


4. 명령어 실습

테스트 환경에 backdoor(UID 0 중복), nopw(무암호), svc-fake(시스템명이지만 셸 보유)를 심어 뒀다. root 권한 실습이다.

# ① UID 0 계정 (root 외 = 백도어)
awk -F: '$3==0 {print $1}' /etc/passwd

# ② 빈 비밀번호 계정
awk -F: '($2=="") {print "무암호: "$1}' /etc/shadow

# ③ 로그인 셸을 가진 계정
awk -F: '$7 ~ /(bash|sh)$/ {print $1" (uid="$3", "$7")"}' /etc/passwd

# ④ 시스템 계정(UID<1000)에 유효 셸?
awk -F: '$3<1000 && $7 ~ /(bash|sh)$/ {print "시스템계정 셸: "$1}' /etc/passwd

# ⑤ 중복 UID
awk -F: '{print $3}' /etc/passwd | sort | uniq -d | while read u; do
  echo "중복 UID $u: $(awk -F: -v u=$u '$3==u{print $1}' /etc/passwd | tr '\n' ' ')"
done

# ⑥ sudo 권한
getent group wheel
ls /etc/sudoers.d/

5. 실행 결과

실제 실행 결과 — Rocky Linux 9.8 · root@rocky9-lab — 계정 보안 점검

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

[root@rocky9-lab ~]# echo "=== ① UID 0 계정 (root 외 = 백도어) ==="
=== ① UID 0 계정 (root 외 = 백도어) ===
[root@rocky9-lab ~]# awk -F: '$3==0 {print $1}' /etc/passwd
root
backdoor
[root@rocky9-lab ~]# echo "=== ② 빈 비밀번호 계정 ==="
=== ② 빈 비밀번호 계정 ===
[root@rocky9-lab ~]# awk -F: '($2=="") {print "무암호: "$1}' /etc/shadow
무암호: nopw
[root@rocky9-lab ~]# echo "=== ③ 로그인 셸을 가진 계정 목록 ==="
=== ③ 로그인 셸을 가진 계정 목록 ===
[root@rocky9-lab ~]# awk -F: '$7 ~ /(bash|sh)$/ {print $1" (uid="$3", "$7")"}' /etc/passwd
root (uid=0, /bin/bash)
analyst (uid=1000, /bin/bash)
backdoor (uid=0, /bin/bash)
nopw (uid=1001, /bin/bash)
svc-fake (uid=1002, /bin/bash)
[root@rocky9-lab ~]# echo "=== ④ 잠기지 않은 계정 중 UID<1000 (시스템 계정에 유효 셸?) ==="
=== ④ 잠기지 않은 계정 중 UID<1000 (시스템 계정에 유효 셸?) ===
[root@rocky9-lab ~]# awk -F: '$3<1000 && $7 ~ /(bash|sh)$/ {print "시스템계정 셸: "$1}' /etc/passwd
시스템계정 셸: root
시스템계정 셸: backdoor
[root@rocky9-lab ~]# echo "=== ⑤ 중복 UID 탐지 ==="
=== ⑤ 중복 UID 탐지 ===
[root@rocky9-lab ~]# awk -F: '{print $3}' /etc/passwd | sort | uniq -d | while read u; do echo "중복 UID $u: $(awk -F: -v u=$u '$3==u{print $1}' /etc/passwd | tr '\n' ' ')"; done
중복 UID 0: root backdoor 
[root@rocky9-lab ~]# echo "=== ⑥ sudo 권한 계정 ==="
=== ⑥ sudo 권한 계정 ===
[root@rocky9-lab ~]# getent group wheel
wheel:x:10:
[root@rocky9-lab ~]# ls /etc/sudoers.d/ 2>/dev/null

6. 결과 해석

출력해석
awk '$3==0' → root, backdoorUID 0이 둘 → backdoor는 백도어 root
무암호: nopwnopw 계정은 비밀번호 없이 로그인 가능
로그인 셸 목록에 backdoor, nopw, svc-fake모두 대화형 셸 보유
시스템계정 셸: root, backdoorbackdoor가 UID 0(시스템 대역)이면서 셸 보유
중복 UID 0: root backdoor중복 UID 탐지가 backdoor를 정확히 지목
wheel:x:10:wheel 그룹 구성원 없음(이 환경)

중복 UID 0: root backdoor가 최우선 IOC다. backdoor는 이름만 다를 뿐 root와 동일한 권한을 가진 백도어 계정이다. 즉시 격리·조사·삭제 대상이다.

nopw(무암호)도 위험하다. 비밀번호 없이 로그인되므로 즉시 잠가야 한다.


7. 보안 관점

발견위험대응
UID 0 추가 계정백도어 rootpasswd -l → 조사 → 삭제
무암호 계정무인증 로그인즉시 passwd -l
시스템 계정 셸발판 제공usermod -s nologin
중복 UID소유권 혼란·은닉조사 후 정리
과도한 sudo권한 상승규칙 축소(42편)

대응 순서: UID 0 추가 계정과 무암호 계정은 발견 즉시 잠금 이 원칙이다. 조사보다 차단이 먼저다(추가 피해 방지). 잠근 뒤 생성 경위를 로그로 조사한다(49편).


8. 보안관제 관점

[정기 점검]  계정 점검 스크립트를 cron 으로 실행
   awk -F: '$3==0{print "UID0:",$1}' /etc/passwd
   awk -F: '$2==""{print "무암호:",$1}' /etc/shadow
   awk -F: '$3<1000 && $7~/sh$/{print "시스템셸:",$1}' /etc/passwd
   awk -F: '{print $3}' /etc/passwd | sort | uniq -d
     ↓
[비교]      결과를 Baseline 과 diff → 변화만 알림 (31편)
     ↓
[Detection] /etc/passwd·shadow 변경, UID 0 추가를 FIM·auditd 로 실시간
     ↓
[Evidence]  변경 시각(ctime), 계정 생성 로그(useradd), 로그인 이력(last)
     ↓
[Response]  즉시 잠금 → 조사 → 삭제(37편 안전 절차)
관점내용
자동화점검 스크립트 + cron + SIEM 연동
최우선 IOCUID 0 추가·중복, 무암호 계정
Baseline정상 계정·그룹 목록과 비교해 변화 탐지

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

실수결과예방
UID 0 중복 미점검백도어 방치정기 점검 최우선
조사부터 하고 차단 지연추가 피해즉시 잠금 우선
무암호 계정 방치무인증 접근즉시 잠금
점검을 수동으로만누락·지연스크립트+cron
Baseline 없이 점검변화 판단 곤란기준값 관리

10. 실습 체크리스트

[ ] UID 0 계정이 root 뿐인지 점검했다
[ ] 무암호 계정을 탐색했다
[ ] 시스템 계정의 로그인 셸을 점검했다
[ ] 중복 UID 를 탐지했다
[ ] sudo 권한 보유자를 확인했다
[ ] 발견 시 즉시 잠금이 우선임을 이해했다

11. 핵심 정리

  • 계정 점검은 UID 0 중복, 무암호, 시스템 계정 셸, 중복 UID, sudo 권한을 확인한다.
  • UID 0 추가·중복 계정이 최우선 IOC 다. 이름과 무관하게 root다.
  • 무암호 계정은 무인증 로그인 위험 — 즉시 잠금.
  • 발견 시 조사보다 차단(잠금)이 우선 이다.
  • 점검을 스크립트+cron+SIEM으로 자동화하고 Baseline과 비교한다.
  • 안전한 계정 삭제 절차(37편)로 마무리한다.

12. 다음 편 예고

다음 글 「49. Linux 권한 변경 로그 분석」 에서는 이번 글에서 찾은 이상 계정이 언제·누구에 의해 만들어졌는지 로그로 추적한다. sudo·useradd·usermod·passwd의 로그 형식과, chmod처럼 기본 로그에 남지 않는 행위를 auditd로 잡는 방법을 다룬다.


참고 자료


시리즈 이동

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

0개의 댓글