시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 5/50편 (전체 055/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
/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 → 홈·그룹 생성 규칙
정확한 범위 값은 배포판·버전마다 다르므로 실측값을 기준으로 삼습니다.
login.defs를 약화시키면(예: PASS_MAX_DAYS 99999, ENCRYPT_METHOD MD5) 이후 만들어지는 계정이 모두 약한 정책을 갖게 됩니다. 단일 계정 조작보다 영향 범위가 넓은 변경입니다.| 항목 | 권장·확인 기준 | 확인 |
|---|---|---|
UID_MIN / UID_MAX | 1000 / 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_METHOD | SHA512 또는 YESCRYPT | grep ^ENCRYPT_METHOD /etc/login.defs |
UMASK | 022 또는 027 | grep ^UMASK /etc/login.defs |
# 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
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 실습 예시).
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
useradd -r(시스템 계정)으로 만들고 셸을 준 dbsync → 서비스 계정처럼 보이게 위장한 대화형 계정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편).
login.defs는 auth_conf 감사 키와 FIM으로 감시하고, 정책 값을 기준선에 넣습니다.<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 실측값에 맞춰 조정합니다.
| 구분 | 핵심 내용 |
|---|---|
| UID 범위 | 0 root · 시스템(201~999 등) · 사람(1000~) · 65534 nobody |
| login.defs 역할 | 이후 생성·변경 계정의 기본 정책 |
| 위험 변경 | PASS_MAX_DAYS 99999, ENCRYPT_METHOD MD5 |
| 위장 패턴 | 시스템 범위 UID + 로그인 셸 + 홈 디렉터리 |
| 면접 포인트 | "login.defs 약화는 이후 모든 계정에 영향 — 범위가 넓은 변경" |
다음 편 056. 계정 · 인증 보안 — root 계정 사용 패턴 분석 에서는 가장 강력한 계정인 root의 사용 패턴을 분석합니다.
이전 편: 054. 계정 · 인증 보안 — /etc/group·gshadow와 특권 그룹 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점