Linux 시스템 보안 기초 · 11/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
구조를 알았으니 이제 흐름을 봅니다. SSH로 비밀번호 로그인할 때 PAM이 어떤 순서로 모듈을 거치는지 따라가면, 로그 한 줄 한 줄이 어느 단계에서 나온 것인지 해석할 수 있습니다.
SSH 비밀번호 로그인의 PAM 여정은 크게 네 단계입니다.
pam_unix) + 실패 카운트(pam_faillock)pam_unix, pam_nologin)pam_limits), 로그인 기록각 단계가 성공해야 다음으로 넘어가며, 어느 단계에서 막혔는지에 따라 로그 메시지가 달라집니다.
SSH 클라이언트
│ password
▼
sshd
│
▼
PAM
├── auth → 실패: 'Failed password'
├── account → 실패: 'account expired'
├── session → 'session opened for user'
└── (logout) → 'session closed'
│ 모두 성공
▼
로그인 성공: 'Accepted password'
sshd는 인증 방식이 결정되면 PAM에 위임합니다. auth 단계에서 pam_unix가 shadow 해시와 비교하고, 실패하면 pam_faillock이 카운트를 올립니다. auth 통과 후 account 단계에서 만료·nologin 등을 검사하고, 마지막으로 session 단계에서 pam_systemd/pam_loginuid가 로그인 UID(auid) 를 설정합니다.
이 auid 설정이 감사의 핵심입니다. 이후 그 세션에서 실행되는 모든 행위는 이 auid로 추적됩니다(43편). 그래서 정상 로그인 세션과 비로그인 컨텍스트(예: 일부 su, 데몬)는 auid 값으로 구분됩니다.
# PAM/SSH 관련 인증 이벤트만 추려 흐름 관찰 (Ubuntu)
sudo grep -E 'sshd|pam' /var/log/auth.log | tail -20
# RHEL 계열
# sudo grep -E 'sshd|pam' /var/log/secure | tail -20
# journald로 sshd 유닛 로그만
sudo journalctl -u ssh --since today | tail -20
정상 로그인 성공과 실패의 전형적 로그 흐름입니다. (예시 출력 — 표준 sshd/PAM 로그 형식)
# 실패한 로그인
sshd[2101]: Failed password for alice from 203.0.113.10 port 51512 ssh2
sshd[2101]: pam_unix(sshd:auth): authentication failure; ... rhost=203.0.113.10 user=alice
# 성공한 로그인
sshd[2140]: Accepted password for alice from 192.168.10.5 port 51999 ssh2
sshd[2140]: pam_unix(sshd:session): session opened for user alice(uid=1001) by (uid=0)
pam_unix(sshd:auth)는 auth 단계, pam_unix(sshd:session)은 session 단계 메시지입니다. 괄호 안의 sshd:auth/sshd:session을 보면 어느 PAM 단계에서 나온 로그인지 즉시 알 수 있습니다.
Accepted 뒤에 session opened가 한 세트로 이어짐.Failed password가 대량으로 이어지다 갑자기 Accepted → 무차별 대입 성공(14편)session opened만 있고 대응하는 정상 auth가 불명확 → 키 인증/우회 여부 확인Invalid user 다수 → 계정 열거(enumeration)로그 흐름을 '세트'로 읽는 습관이 중요합니다. 실패→성공→세션→명령 실행의 연쇄가 침해 타임라인의 골격입니다.
Failed/Accepted/Invalid user 패턴 집계session opened for user 로 실제 성립된 세션 파악-u ssh로 유닛 단위 상관SIEM 파서는 sshd 로그에서 user·rhost·result·port를 필드로 추출합니다. 이 필드들이 있어야 '동일 IP의 실패 N회 후 성공' 같은 상관분석이 가능합니다. Wazuh는 sshd 디코더로 이를 자동 파싱하며, Accepted와 직전 다수 Failed의 결합을 무차별 대입 성공(고위험)으로 분류합니다.
[ ] auth 로그에서 auth/session 단계 메시지 구분
[ ] 성공 로그인의 session opened 확인
[ ] 실패→성공 전환 패턴 관찰
[ ] journalctl -u ssh로 유닛 로그 확인
다음 편에서는 12. SSH 인증 방식 를 다룹니다. 인증 방식 자체를 비교합니다 — 비밀번호 vs 공개키 vs 키보드 인터랙티브.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.