055. 계정 · 인증 보안 — UID·GID 범위 정책과 login.defs

changseop lee·3일 전

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

선행 학습

1. 개념

/etc/login.defs는 useradd, passwd, 로그인 관련 도구가 참고하는 계정 정책 기본값 파일입니다. 이미 만들어진 계정에는 소급 적용되지 않고, 이후 생성·변경되는 계정에 영향을 줍니다.

UID 공간 (Rocky 9 / Ubuntu 22.04 일반 기본값)
 0            root
 1 ~ 200      정적 시스템 계정 (배포판이 고정 할당, Rocky)
 201 ~ 999    SYS_UID_MIN ~ SYS_UID_MAX : 동적 시스템 계정 (useradd -r)
 1000 ~ 60000 UID_MIN ~ UID_MAX         : 사람 계정
 65534        nobody

login.defs 주요 항목
 PASS_MAX_DAYS / PASS_MIN_DAYS / PASS_WARN_AGE  → 새 계정의 비밀번호 주기
 ENCRYPT_METHOD                                 → 해시 방식(SHA512 / YESCRYPT)
 UMASK, CREATE_HOME, USERGROUPS_ENAB            → 홈·그룹 생성 규칙

정확한 범위 값은 배포판·버전마다 다르므로 실측값을 기준으로 삼습니다.

2. 왜 중요한가

  • UID 범위는 "사람 계정인가 서비스 계정인가"를 판단하는 기준입니다. 이 기준이 있어야 시스템 범위 UID에 로그인 셸을 가진 계정 같은 이상을 찾을 수 있습니다.
  • login.defs를 약화시키면(예: PASS_MAX_DAYS 99999, ENCRYPT_METHOD MD5) 이후 만들어지는 계정이 모두 약한 정책을 갖게 됩니다. 단일 계정 조작보다 영향 범위가 넓은 변경입니다.
  • 053편의 해시 방식 이상, 060편의 만료 정책 점검이 모두 이 파일의 기본값과 비교하는 방식입니다.

3. 핵심 명령어 / 설정

항목권장·확인 기준확인
UID_MIN / UID_MAX1000 / 60000 (실측 확인)grep -E '^(UID|GID)_(MIN|MAX)' /etc/login.defs
SYS_UID_MIN / SYS_UID_MAX시스템 계정 범위grep -E '^SYS_UID' /etc/login.defs
PASS_MAX_DAYS조직 정책(예: 90)grep ^PASS_ /etc/login.defs
ENCRYPT_METHODSHA512 또는 YESCRYPTgrep ^ENCRYPT_METHOD /etc/login.defs
UMASK022 또는 027grep ^UMASK /etc/login.defs

4. 실습 (실습 예시)

# 1) 정책 기본값 확인
grep -E '^(UID_MIN|UID_MAX|SYS_UID_MIN|SYS_UID_MAX|PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE|ENCRYPT_METHOD|UMASK|CREATE_HOME)' /etc/login.defs

# 2) 범위별 계정 분류와 이상 조합 찾기
UMIN=$(awk '/^UID_MIN/{print $2}' /etc/login.defs)
awk -F: -v m="$UMIN" '$3>0 && $3<m && $7 !~ /(nologin|false|sync|shutdown|halt)$/ {print "시스템범위+셸:", $1, $3, $7}' /etc/passwd
awk -F: -v m="$UMIN" '$3>=m && $3<65534 {print "사람계정:", $1, $3}' /etc/passwd

# 3) useradd 기본값 확인
sudo useradd -D

5. 정상 상태

UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999
PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_WARN_AGE   7
ENCRYPT_METHOD SHA512
UMASK           022
사람계정: admin1 1001
사람계정: devops 1002

시스템 범위 UID의 계정은 모두 nologin이고, 정책 값이 조직 기준과 일치하는 상태가 정상입니다(값은 Rocky 실습 예시).

6. 이상 상태

PASS_MAX_DAYS   99999
ENCRYPT_METHOD MD5
시스템범위+셸: dbsync 989 /bin/bash
$ stat -c '%y' /etc/login.defs
2026-10-02 02:31:10.000000000 +0900
  • 비밀번호 주기 해제 + MD5 기본값 → 이후 생성 계정 전체가 약한 정책
  • useradd -r(시스템 계정)으로 만들고 셸을 준 dbsync → 서비스 계정처럼 보이게 위장한 대화형 계정
  • 변경 시각이 앞선 편들의 새벽 계정 조작과 같은 시간대

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

login.defs 변경과 시스템 범위 계정 생성 흔적입니다(가상의 예시 로그).

type=PATH msg=audit(1759339870.050:3501): item=0 name="/etc/login.defs" nametype=NORMAL key="auth_conf"
type=SYSCALL msg=audit(1759339870.050:3501): syscall=257 success=yes auid=1002 uid=0 comm="sed" exe="/usr/bin/sed" key="auth_conf"
Oct  2 02:32:05 rocky9-web01 useradd[11601]: new group: name=dbsync, GID=989
Oct  2 02:32:05 rocky9-web01 useradd[11601]: new user: name=dbsync, UID=989, GID=989, home=/home/dbsync, shell=/bin/bash, from=/dev/pts/1
관찰해석
sed로 login.defs 수정정책 기본값 일괄 변경(sed -i)
UID=989 + shell=/bin/bash시스템 범위 UID인데 로그인 셸 보유
home=/home/dbsync시스템 계정은 보통 홈을 만들지 않음 → -m 옵션 함께 사용

이 계정이 실제로 쓰였는지는 이후 Accepted ... for dbsync 로그와 wtmp로 확인합니다(075편).

8. SOC 관제 포인트

  • login.defs는 auth_conf 감사 키와 FIM으로 감시하고, 정책 값을 기준선에 넣습니다.
  • "시스템 범위 UID + 로그인 셸 + 홈 디렉터리" 조합은 위장 계정 패턴으로 봅니다.
  • 정책 변경 이후 생성된 계정 목록을 뽑아 약한 정책이 적용된 계정을 함께 정리합니다.

9. 탐지 규칙

<group name="local,syssec_b,account,">
  <rule id="101040" level="10">
    <if_sid>550</if_sid>
    <field name="file">^/etc/login.defs$</field>
    <description>계정 정책 기본값(login.defs) 변경</description>
  </rule>
  <rule id="101041" level="11">
    <match>new user: name=</match>
    <regex type="pcre2">UID=([2-9]\d{2}),.*shell=/(usr/)?bin/(ba|z|k)?sh,</regex>
    <description>시스템 UID 범위(200~999) 계정에 로그인 셸 부여</description>
  </rule>
</group>

UID 범위 정규식은 배포판의 SYS_UID_MIN/MAX 실측값에 맞춰 조정합니다.

10. 대응 방법

  1. 초기 확인 — login.defs의 변경 항목·시각·행위자와 이후 생성된 계정을 확인합니다.
  2. 범위 확인 — 같은 변경이 다른 서버에 있는지, 위장 계정의 로그인 이력이 있는지 확인합니다.
  3. 증거 확보 — login.defs 사본, 계정 생성 로그, audit 로그를 보존합니다.
  4. 차단/조치 — 정책 값을 복원하고 약한 정책으로 생성된 계정의 비밀번호·만료 설정을 재적용합니다.
  5. 재발 방지 — 정책 값 기준선과 시스템 범위 대화형 계정 탐지 룰을 운영합니다.

11. 핵심 정리

구분핵심 내용
UID 범위0 root · 시스템(201~999 등) · 사람(1000~) · 65534 nobody
login.defs 역할이후 생성·변경 계정의 기본 정책
위험 변경PASS_MAX_DAYS 99999, ENCRYPT_METHOD MD5
위장 패턴시스템 범위 UID + 로그인 셸 + 홈 디렉터리
면접 포인트"login.defs 약화는 이후 모든 계정에 영향 — 범위가 넓은 변경"

12. 다음 편 예고

다음 편 056. 계정 · 인증 보안 — root 계정 사용 패턴 분석 에서는 가장 강력한 계정인 root의 사용 패턴을 분석합니다.


이전 편: 054. 계정 · 인증 보안 — /etc/group·gshadow와 특권 그룹 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글