003. Linux 서버 보안 — 사용자·그룹 설정 점검 — UID 0과 빈 패스워드

changseop lee·5일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 3/50편 (전체 003/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

계정 점검은 "권한이 너무 큰 계정"과 "인증이 너무 약한 계정" 을 찾는 작업입니다. /etc/passwd·/etc/shadow 구조 자체는 선행 글에서 다뤘으므로, 여기서는 점검 쿼리와 판정 기준에 집중합니다.

점검 대상 계정
   ├─ UID 0 인가?            → root 외에는 즉시 확인
   ├─ 패스워드 필드가 비었나? → 무인증 로그인 위험
   ├─ 로그인 셸을 가졌나?     → 서비스 계정이면 nologin이어야 함
   └─ 최근 생성/변경되었나?   → 변경 로그와 대조

2. 왜 중요한가

  • 공격자가 지속성을 확보하는 가장 단순한 방법은 UID 0 계정 추가나 기존 서비스 계정에 셸 부여입니다.
  • 이런 변경은 프로세스나 네트워크 흔적이 거의 없어, 계정 파일 점검이 아니면 놓치기 쉽습니다.
  • 정보보안산업기사·주요정보통신기반시설 점검 항목에서도 "root 이외 UID 0 금지", "패스워드 미설정 계정 금지"는 기본 항목입니다.

3. 핵심 명령어 / 설정

점검명령어기대값
UID 0 계정awk -F: '$3==0{print $1}' /etc/passwdroot만
빈 패스워드sudo awk -F: '$2==""{print $1}' /etc/shadow출력 없음
셸 보유 계정awk -F: '7!~/(nologin|false)/{print $1,$7}' /etc/passwd사람 계정 + root
GID 0 계정awk -F: '$4==0{print $1}' /etc/passwdroot (배포판별 소수 예외)
중복 UIDcut -d: -f3 /etc/passwd | sort | uniq -d출력 없음

4. 실습 (실습 예시)

# 한 번에 판정하는 점검 예시
echo "[UID0]";    awk -F: '$3==0{print $1}' /etc/passwd
echo "[EMPTYPW]"; sudo awk -F: '$2==""{print $1}' /etc/shadow
echo "[DUPUID]";  cut -d: -f3 /etc/passwd | sort | uniq -d
echo "[SHELL]";   awk -F: '$3>=1000 || $3==0 {print $1, $7}' /etc/passwd
echo "[SVC-SHELL]"; awk -F: '$3>0 && $3<1000 && $7!~/(nologin|false|sync|shutdown|halt)$/{print $1,$7}' /etc/passwd

Rocky/Ubuntu 모두 일반 사용자 UID는 기본 1000부터 시작합니다(/etc/login.defs의 UID_MIN).

5. 정상 상태

[UID0]
root
[EMPTYPW]
[DUPUID]
[SHELL]
root /bin/bash
admin1 /bin/bash
[SVC-SHELL]

6. 이상 상태

[UID0]
root
sysbak
[EMPTYPW]
sysbak
[SVC-SHELL]
apache /bin/bash
결과의심 이유
sysbak가 UID 0 + 빈 패스워드무인증 root 백도어 계정의 전형
apache에 /bin/bash웹 침해 후 서비스 계정으로 셸 확보 시도 가능성

sysbak처럼 시스템 계정처럼 보이는 이름은 눈속임 목적일 수 있으므로 이름이 아니라 UID·셸·생성 시점으로 판단합니다.

7. 로그 분석 (분석 방법)

계정 생성·변경은 useradd/usermod가 남기는 로그로 추적합니다(가상의 예시 로그, Rocky /var/log/secure).

Oct  1 02:14:09 rocky9-web01 useradd[3120]: new user: name=sysbak, UID=0, GID=0, home=/home/sysbak, shell=/bin/bash, from=/dev/pts/1
Oct  1 02:15:40 rocky9-web01 usermod[3141]: change user 'apache' shell from '/sbin/nologin' to '/bin/bash'
  • UID=0으로 useradd가 실행되면 -o -u 0 옵션 사용을 의미합니다.
  • 새벽 시간대 + pts/1(원격 세션) → 같은 시각 SSH 로그인 기록과 연결해 출발지 IP를 확인합니다.
  • 파일을 vi로 직접 수정한 경우 위 로그가 남지 않으므로 auditd의 파일 감시가 함께 필요합니다.

8. SOC 관제 포인트

  • useradd/usermod/userdel/groupmod 로그는 모두 수집 대상으로 지정합니다.
  • UID 0 생성, 서비스 계정 셸 변경은 업무상 거의 발생하지 않으므로 높은 레벨로 분류합니다.
  • 계정 파일 직접 수정(useradd 로그 없음 + 파일 해시 변경)은 은폐 의도가 있을 수 있어 더 높게 봅니다.

9. 탐지 규칙

<group name="local,account,">
  <rule id="100110" level="12">
    <match>new user: name=</match>
    <regex>UID=0,</regex>
    <description>UID 0 계정 생성 탐지</description>
  </rule>
  <rule id="100111" level="10">
    <match>change user</match>
    <regex>shell from '\S+nologin' to '\S+sh'</regex>
    <description>서비스 계정에 로그인 셸 부여</description>
  </rule>
</group>

Wazuh 기본 룰셋에도 5902(New user added to the system)가 있습니다. 위 룰은 그중 위험도가 높은 조건만 별도로 상향하는 예시이며, 실제 적용 전 wazuh-logtest로 매칭을 확인해야 합니다.

10. 대응 방법

  1. 초기 확인 — 비인가 UID 0·빈 패스워드 계정의 생성 시각과 생성 세션을 확인합니다.
  2. 범위 확인 — 같은 시간대 다른 서버에도 동일 계정이 생겼는지 SIEM에서 검색합니다.
  3. 증거 확보 — /etc/passwd, /etc/shadow 사본과 secure/audit.log를 보존합니다.
  4. 차단/조치 — 계정을 즉시 잠그고(usermod -L, chage -E 0) 셸을 회수합니다. 삭제는 증거 확보 후 진행합니다.
  5. 재발 방지 — 계정 파일을 FIM 대상에 등록하고 UID 0 생성 룰을 상시 운영합니다.

11. 핵심 정리

점검 항목기대값
UID 0root만
빈 패스워드없음
서비스 계정 셸nologin/false
관련 로그useradd·usermod (secure/auth.log)
면접 포인트"이름이 아니라 UID·셸·생성 시점으로 판단"

12. 다음 편 예고

다음 편 004. Linux 서버 보안 — 주요 파일 권한 기준 점검 매트릭스 에서는 계정 다음으로 중요한 주요 파일 권한을 기대값 매트릭스로 점검합니다.


이전 편: 002. Linux 서버 보안 — 보안 설정 기준선(Baseline) 만들기
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글