시스템 보안 · 취약점 › B. 계정 · 인증 보안 강화 · 26/50편 (전체 076/450)
학습 단계: 2단계 · 설정 및 점검
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
"이상 로그인"을 탐지하려면 먼저 "정상 로그인"이 무엇인지 정의해야 합니다(A영역 002편의 기준선 개념을 계정·인증에 적용). 계정별로 평소 패턴을 데이터로 만듭니다.
계정별 로그인 프로필
├─ 시간대 : 주로 언제 로그인하나 (업무 시간? 특정 시간?)
├─ 출발지 : 어느 IP/대역에서 오나 (관리망? 고정 IP?)
├─ 방식 : publickey? password? 2FA?
├─ 빈도 : 하루 몇 회 수준
└─ 요일 : 평일만? 주말도?
→ 이 프로필에서 벗어나는 로그인이 "이상"의 후보 (027·028편)
기준선은 한 번 만들고 끝이 아니라, 주기적으로 갱신하며 조직 변화(새 직원, 근무 형태 변경)를 반영합니다.
| 항목 | 산출 방법 |
|---|---|
| 시간대 분포 | 성공 로그인의 시(hour)별 집계 |
| 출발지 집합 | 계정별 distinct 출발지 IP/대역 |
| 인증 방식 | publickey/password 비율 |
| 빈도 | 일평균 로그인 수 |
| 데이터 원천 | last(wtmp), secure/auth.log, Wazuh 인덱스 |
LOG=/var/log/secure # Ubuntu: /var/log/auth.log
# 1) 계정별 시간대 분포 (최근 로그 기준)
for u in admin1 devops; do
echo "== $u 시간대"; sudo grep "Accepted .* for $u " $LOG | awk '{print substr($3,1,2)}' | sort | uniq -c
done
# 2) 계정별 출발지 집합
for u in admin1 devops; do
echo "== $u 출발지"; sudo grep "Accepted .* for $u " $LOG | grep -oE 'from [0-9.]+' | sort | uniq -c | sort -rn
done
# 3) 계정별 인증 방식 비율
sudo grep 'Accepted' $LOG | sed -E 's/.*Accepted ([a-z-]+) for ([^ ]+).*/\2 \1/' | sort | uniq -c
# 4) 기준선 파일로 저장
{ for u in $(sudo awk -F: '$3>=1000{print $1}' /etc/passwd); do
ips=$(sudo grep "Accepted .* for $u " $LOG | grep -oE 'from [0-9.]+' | sort -u | tr '\n' ',')
hrs=$(sudo grep "Accepted .* for $u " $LOG | awk '{print substr($3,1,2)}' | sort -u | tr '\n' ',')
[ -n "$ips" ] && echo "$u | ips=$ips | hours=$hrs"
done; } | sudo tee /root/baseline/login-profile-$(date +%F).txt
== devops 시간대
40 09
12 10
8 14
== devops 출발지
60 from 192.168.56.5
$ (방식) 60 devops publickey
[기준선 파일]
devops | ips=192.168.56.5, | hours=09,10,14,
admin1 | ips=192.168.56.5, | hours=08,09,13,16,
계정별로 출발지·시간대·방식이 좁고 일관된 프로필이 만들어진 상태가 정상입니다.
기준선을 만드는 과정에서 이미 이상이 드러나기도 합니다.
== devops 출발지
60 from 192.168.56.5
1 from 192.168.56.77 ← 기준선에 없던 출발지
== devops 시간대
40 09
1 02 ← 평소에 없던 새벽
기준선은 이후 탐지의 비교 대상으로 쓰입니다(활용 예시).
[기준선] devops: 출발지 {192.168.56.5}, 시간 {09,10,14}, 방식 {publickey}
[신규 로그인] devops: 192.168.56.77, 02시, password
비교 결과: 출발지 NEW, 시간 OUT, 방식 CHANGED → 3개 축 모두 벗어남 → 높은 이상 점수
| 축 | 기준선 | 신규 | 판정 |
|---|---|---|---|
| 출발지 | 56.5 | 56.77 | 신규 |
| 시간 | 09~14 | 02 | 벗어남 |
| 방식 | publickey | password | 변경 |
세 축이 동시에 벗어나면 단일 축보다 이상 가능성이 훨씬 높습니다(027·028편에서 탐지 룰로 구현).
기준선은 탐지 룰보다 SIEM의 집계·비교에 적합합니다.
# Kibana: 계정별 출발지 집합 (지난 30일) → 기준선 시각화
data.dstuser : * and rule.id : 5715 → Terms(dstuser) × Terms(srcip)
# 신규 출발지 탐지(개념): 계정의 과거 출발지 집합에 없는 IP로 성공
→ Wazuh CDB(계정별 허용 IP) 또는 ML/이상탐지 기능 활용
Wazuh만으로 "계정별 과거에 없던 IP"를 상태 비교하기는 번거로우므로, 기준선 CDB 리스트(계정→허용 대역)로 "목록 밖 로그인"을 탐지하는 방식이 실용적입니다(027편).
| 축 | 기준선 내용 |
|---|---|
| 시간대 | 계정이 주로 로그인하는 시(hour) |
| 출발지 | 계정별 IP/대역 집합 |
| 방식 | publickey / password 비율 |
| 빈도·요일 | 일평균 로그인, 평일/주말 |
| 면접 포인트 | "정상을 정의해야 이상을 탐지한다 — 계정별 기준선이 핵심" |
다음 편 077. 계정 · 인증 보안 — 비정상 시간대·신규 출발지 로그인 탐지 에서는 기준선을 벗어나는 비정상 시간대·신규 출발지 로그인 탐지를 다룹니다.
이전 편: 075. 계정 · 인증 보안 — 로그인 기록 — wtmp·btmp·lastlog 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점