시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 3/50편 (전체 053/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
/etc/shadow는 비밀번호 해시와 비밀번호 상태(잠금·만료·변경 주기) 를 담습니다. 해시 원문을 볼 필요 없이, 접두어와 상태 필드만으로도 많은 것을 판단할 수 있습니다.
devops:$6$Ab12...$<hash>:20362:0:90:7:14::
① ② ③ ④ ⑤ ⑥ ⑦ ⑧
② 패스워드 필드
$y$... yescrypt (Ubuntu 22.04 기본)
$6$... SHA-512 crypt (Rocky 9 기본)
$5$... SHA-256 crypt
$1$... MD5 crypt ← 오래된 약한 방식
! / !! 잠김 또는 비밀번호 미설정(앞에 !를 붙이면 잠금)
* 비밀번호 로그인 불가(시스템 계정)
(빈 값) 비밀번호 없음 ← 매우 위험
③ 마지막 변경일(1970-01-01 이후 일수) ④ 최소 사용일 ⑤ 최대 사용일
⑥ 경고 기간 ⑦ 만료 후 비활성 기간 ⑧ 계정 만료일
$1$) 해시가 유출됐을 때 크래킹이 훨씬 쉬워집니다. 기본값보다 약한 접두어가 나타나면 누군가 의도적으로 설정한 것입니다.!)이 갑자기 해시를 갖게 되면 휴면 계정 재활성화를 의미합니다. 공격자가 새 계정 대신 기존 휴면 계정을 쓰는 이유는 눈에 덜 띄기 때문입니다.passwd 명령 없이 shadow가 바뀌면 직접 편집이나 도구에 의한 변경으로, 정상 절차 밖의 행위입니다.| 확인 | 명령 | 판독 |
|---|---|---|
| 계정별 상태 요약 | sudo passwd -S 계정 (Ubuntu는 -a로 전체 계정) | PS/P 사용 가능, LK/L 잠김, NP 비밀번호 없음 |
| 해시 방식만 추출 | sudo awk -F: '{split($2,a,"$"); print $1, (a[2]?"$"a[2]"$":$2)}' /etc/shadow | 해시 원문 없이 접두어만 |
| 기본 해시 방식 | grep ENCRYPT_METHOD /etc/login.defs | SHA512 / YESCRYPT |
| 변경일 변환 | date -d "1970-01-01 +20362 days" +%F | 일수 → 날짜 |
| 계정 정책 | sudo chage -l devops | 만료·변경 주기(060편) |
# 1) 해시 접두어만 안전하게 확인 (원문 출력 금지)
sudo awk -F: '{split($2,a,"$"); t=(a[2]!="")?"$"a[2]"$":($2==""?"<EMPTY>":$2); print $1, t}' /etc/shadow | column -t
# 2) 기대 방식과 다른 계정 찾기 (Rocky 기대: $6$, Ubuntu 기대: $y$)
EXP='$6$'
sudo awk -F: -v e="$EXP" '$2 ~ /^\$/ && index($2,e)!=1 {print "WEAK/ODD:", $1}' /etc/shadow
# 3) 상태 요약과 마지막 변경일
sudo passwd -S devops
sudo awk -F: '$1=="devops"{print $3}' /etc/shadow | xargs -I{} date -d "1970-01-01 +{} days" +%F
root $6$
admin1 $6$
devops $6$
apache !!
sshd !!
$ sudo passwd -S devops
devops PS 2026-09-30 0 90 7 14 (Password set, SHA512 crypt.)
사람 계정은 기본 해시 방식($6$), 서비스 계정은 잠김(!!/*), 마지막 변경일이 정책 범위 안인 상태가 정상입니다.
devops $1$
backup $6$ ← 이전 점검에서는 !! (잠김)
testuser <EMPTY>
$ sudo passwd -S backup
backup PS 2026-10-02 0 99999 7 -1 (Password set, SHA512 crypt.)
| 계정 | 의미 |
|---|---|
devops $1$ | MD5 방식으로 비밀번호 재설정 → 크래킹 용이(기본 방식 우회 의도) |
backup 잠김 → 설정됨, 최대 사용일 99999 | 휴면 계정 재활성화 + 만료 정책 해제 |
testuser <EMPTY> | 비밀번호 없음 → PAM 설정에 따라 무인증 로그인 위험 |
비밀번호 변경 경로별 로그입니다(가상의 예시 로그).
[정상 passwd 명령]
Oct 2 09:40:02 rocky9-web01 passwd[11401]: pam_unix(passwd:chauthtok): password changed for devops
[관리자가 다른 계정 변경 - usermod/chpasswd]
Oct 2 02:25:13 rocky9-web01 chpasswd[11420]: pam_unix(chpasswd:chauthtok): password changed for backup
type=EXECVE msg=audit(1759339513.002:3301): argc=3 a0="chpasswd" a1="-c" a2="MD5"
[잠금 해제]
Oct 2 02:25:40 rocky9-web01 usermod[11431]: unlock user 'backup' password
| 관찰 | 해석 |
|---|---|
chpasswd -c MD5 | 해시 방식을 MD5로 지정해 변경 |
unlock user 'backup' | 잠긴 휴면 계정 해제 |
| 새벽, 같은 세션 | 052편의 계정 조작과 같은 흐름으로 묶어 분석 |
audit 로그로 chpasswd의 표준 입력 내용(비밀번호)은 남지 않으며, 남아서도 안 됩니다. 분석은 명령·옵션·대상 계정까지만 합니다.
<group name="local,syssec_b,account,">
<rule id="101020" level="10">
<match>unlock user '</match>
<description>잠긴 계정 비밀번호 잠금 해제: 휴면 계정 재활성화 확인</description>
</rule>
<rule id="101021" level="11">
<if_group>audit</if_group>
<match>a0="chpasswd"</match>
<regex type="pcre2">a2="(MD5|DES|NONE)"</regex>
<description>약한 해시 방식으로 비밀번호 설정</description>
</rule>
</group>
Wazuh 기본 룰셋에도 비밀번호 변경(password changed) 관련 룰이 있으므로, 기본 룰은 정보성으로 두고 위험 조건만 위처럼 상향합니다.
| 구분 | 핵심 내용 |
|---|---|
| 해시 접두어 | yescrypt(Ubuntu) · SHA-512(Rocky) · MD5(약함) |
| 상태 표시 | ! / !! 잠김 · * 로그인 불가 · 빈 값 비밀번호 없음 |
| 위험 신호 | 약한 접두어, 잠금 해제, 99999 만료 해제, 빈 비밀번호 |
| 판독 원칙 | 해시 원문은 출력·보고하지 않음 |
| 면접 포인트 | "휴면 계정 재활성화는 신규 계정보다 눈에 덜 띈다" |
다음 편 054. 계정 · 인증 보안 — /etc/group·gshadow와 특권 그룹 점검 에서는 그룹 소속으로 권한이 결정되는 /etc/group·gshadow와 특권 그룹을 점검합니다.
이전 편: 052. 계정 · 인증 보안 — /etc/passwd 필드별 이상 징후 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점