시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 3/50편 (전체 003/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
계정 점검은 "권한이 너무 큰 계정"과 "인증이 너무 약한 계정" 을 찾는 작업입니다. /etc/passwd·/etc/shadow 구조 자체는 선행 글에서 다뤘으므로, 여기서는 점검 쿼리와 판정 기준에 집중합니다.
점검 대상 계정
├─ UID 0 인가? → root 외에는 즉시 확인
├─ 패스워드 필드가 비었나? → 무인증 로그인 위험
├─ 로그인 셸을 가졌나? → 서비스 계정이면 nologin이어야 함
└─ 최근 생성/변경되었나? → 변경 로그와 대조
| 점검 | 명령어 | 기대값 |
|---|---|---|
| UID 0 계정 | awk -F: '$3==0{print $1}' /etc/passwd | root만 |
| 빈 패스워드 | 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/passwd | root (배포판별 소수 예외) |
| 중복 UID | cut -d: -f3 /etc/passwd | sort | uniq -d | 출력 없음 |
# 한 번에 판정하는 점검 예시
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).
[UID0]
root
[EMPTYPW]
[DUPUID]
[SHELL]
root /bin/bash
admin1 /bin/bash
[SVC-SHELL]
[UID0]
root
sysbak
[EMPTYPW]
sysbak
[SVC-SHELL]
apache /bin/bash
| 결과 | 의심 이유 |
|---|---|
sysbak가 UID 0 + 빈 패스워드 | 무인증 root 백도어 계정의 전형 |
apache에 /bin/bash | 웹 침해 후 서비스 계정으로 셸 확보 시도 가능성 |
sysbak처럼 시스템 계정처럼 보이는 이름은 눈속임 목적일 수 있으므로 이름이 아니라 UID·셸·생성 시점으로 판단합니다.
계정 생성·변경은 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의 파일 감시가 함께 필요합니다.useradd/usermod/userdel/groupmod 로그는 모두 수집 대상으로 지정합니다.<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로 매칭을 확인해야 합니다.
/etc/passwd, /etc/shadow 사본과 secure/audit.log를 보존합니다.usermod -L, chage -E 0) 셸을 회수합니다. 삭제는 증거 확보 후 진행합니다.| 점검 항목 | 기대값 |
|---|---|
| UID 0 | root만 |
| 빈 패스워드 | 없음 |
| 서비스 계정 셸 | nologin/false |
| 관련 로그 | useradd·usermod (secure/auth.log) |
| 면접 포인트 | "이름이 아니라 UID·셸·생성 시점으로 판단" |
다음 편 004. Linux 서버 보안 — 주요 파일 권한 기준 점검 매트릭스 에서는 계정 다음으로 중요한 주요 파일 권한을 기대값 매트릭스로 점검합니다.
이전 편: 002. Linux 서버 보안 — 보안 설정 기준선(Baseline) 만들기
📚 시리즈 전체 보기: 시스템 보안 · 취약점