053. 계정 · 인증 보안 — /etc/shadow 해시 형식과 비밀번호 상태 판독

changseop lee·5일 전

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

선행 학습

1. 개념

/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 이후 일수)  ④ 최소 사용일  ⑤ 최대 사용일
⑥ 경고 기간  ⑦ 만료 후 비활성 기간  ⑧ 계정 만료일

2. 왜 중요한가

  • 해시 알고리즘이 약하면($1$) 해시가 유출됐을 때 크래킹이 훨씬 쉬워집니다. 기본값보다 약한 접두어가 나타나면 누군가 의도적으로 설정한 것입니다.
  • 잠겨 있던 계정(!)이 갑자기 해시를 갖게 되면 휴면 계정 재활성화를 의미합니다. 공격자가 새 계정 대신 기존 휴면 계정을 쓰는 이유는 눈에 덜 띄기 때문입니다.
  • passwd 명령 없이 shadow가 바뀌면 직접 편집이나 도구에 의한 변경으로, 정상 절차 밖의 행위입니다.

3. 핵심 명령어 / 설정

확인명령판독
계정별 상태 요약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.defsSHA512 / YESCRYPT
변경일 변환date -d "1970-01-01 +20362 days" +%F일수 → 날짜
계정 정책sudo chage -l devops만료·변경 주기(060편)

4. 실습 (실습 예시)

# 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

5. 정상 상태

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$), 서비스 계정은 잠김(!!/*), 마지막 변경일이 정책 범위 안인 상태가 정상입니다.

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 설정에 따라 무인증 로그인 위험

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

비밀번호 변경 경로별 로그입니다(가상의 예시 로그).

[정상 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의 표준 입력 내용(비밀번호)은 남지 않으며, 남아서도 안 됩니다. 분석은 명령·옵션·대상 계정까지만 합니다.

8. SOC 관제 포인트

  • 해시 접두어 분포를 기준선에 넣고, 기본 방식과 다른 접두어 등장을 탐지합니다.
  • 잠금 → 해제, 만료 정책 해제(99999), 빈 비밀번호는 각각 독립 Alert 대상입니다.
  • 비밀번호 변경은 누가 누구의 비밀번호를 바꿨는지(본인 vs 관리자) 구분해 기록합니다.

9. 탐지 규칙

<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) 관련 룰이 있으므로, 기본 룰은 정보성으로 두고 위험 조건만 위처럼 상향합니다.

10. 대응 방법

  1. 초기 확인 — 계정별 해시 접두어·상태·마지막 변경일을 기준선과 비교합니다.
  2. 범위 확인 — 같은 시간대 다른 계정·다른 서버의 비밀번호 변경·잠금 해제를 확인합니다.
  3. 증거 확보 — shadow 사본은 접근 제한 저장소에 보관하고, 보고서에는 접두어·상태만 기록합니다.
  4. 차단/조치 — 해당 계정 비밀번호 재설정(기본 방식), 휴면 계정 재잠금, 빈 비밀번호 제거를 진행합니다.
  5. 재발 방지 — 해시 방식·잠금 상태를 정기 점검하고 잠금 해제·약한 해시 룰을 운영합니다.

11. 핵심 정리

구분핵심 내용
해시 접두어yy yescrypt(Ubuntu) · 66 SHA-512(Rocky) · 11 MD5(약함)
상태 표시! / !! 잠김 · * 로그인 불가 · 빈 값 비밀번호 없음
위험 신호약한 접두어, 잠금 해제, 99999 만료 해제, 빈 비밀번호
판독 원칙해시 원문은 출력·보고하지 않음
면접 포인트"휴면 계정 재활성화는 신규 계정보다 눈에 덜 띈다"

12. 다음 편 예고

다음 편 054. 계정 · 인증 보안 — /etc/group·gshadow와 특권 그룹 점검 에서는 그룹 소속으로 권한이 결정되는 /etc/group·gshadow와 특권 그룹을 점검합니다.


이전 편: 052. 계정 · 인증 보안 — /etc/passwd 필드별 이상 징후 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글