076. 계정 · 인증 보안 — 로그인 시간·출발지 기준선 만들기

changseop lee·3일 전

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

선행 학습

1. 개념

"이상 로그인"을 탐지하려면 먼저 "정상 로그인"이 무엇인지 정의해야 합니다(A영역 002편의 기준선 개념을 계정·인증에 적용). 계정별로 평소 패턴을 데이터로 만듭니다.

계정별 로그인 프로필
 ├─ 시간대   : 주로 언제 로그인하나 (업무 시간? 특정 시간?)
 ├─ 출발지   : 어느 IP/대역에서 오나 (관리망? 고정 IP?)
 ├─ 방식     : publickey? password? 2FA?
 ├─ 빈도     : 하루 몇 회 수준
 └─ 요일     : 평일만? 주말도?

→ 이 프로필에서 벗어나는 로그인이 "이상"의 후보 (027·028편)

기준선은 한 번 만들고 끝이 아니라, 주기적으로 갱신하며 조직 변화(새 직원, 근무 형태 변경)를 반영합니다.

2. 왜 중요한가

  • 기준선이 없으면 모든 로그인이 똑같이 보여 이상을 판별할 수 없습니다. "새벽 로그인이 이상한가?"는 그 계정의 평소 패턴을 알아야 답할 수 있습니다.
  • 계정마다 정상 패턴이 다릅니다(관리자는 다양한 IP, 서비스 계정은 특정 서버만). 계정별 기준선이 전체 일괄 기준보다 정확합니다.
  • 기준선은 정탐/오탐 판단(098편)의 근거가 됩니다.

3. 핵심 명령어 / 설정

항목산출 방법
시간대 분포성공 로그인의 시(hour)별 집계
출발지 집합계정별 distinct 출발지 IP/대역
인증 방식publickey/password 비율
빈도일평균 로그인 수
데이터 원천last(wtmp), secure/auth.log, Wazuh 인덱스

4. 실습 (실습 예시)

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

5. 정상 상태

== 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,

계정별로 출발지·시간대·방식이 좁고 일관된 프로필이 만들어진 상태가 정상입니다.

6. 이상 상태

기준선을 만드는 과정에서 이미 이상이 드러나기도 합니다.

== devops 출발지
     60 from 192.168.56.5
      1 from 192.168.56.77      ← 기준선에 없던 출발지
== devops 시간대
     40 09
      1 02                      ← 평소에 없던 새벽
  • 기준선 수집 구간에 이질적인 출발지·시간이 섞임 → 이미 이상 로그인이 포함됨
  • 기준선은 "깨끗한 기간"의 데이터로 만들어야 하므로, 이런 이상치는 제외하고 별도 조사합니다.

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

기준선은 이후 탐지의 비교 대상으로 쓰입니다(활용 예시).

[기준선] devops: 출발지 {192.168.56.5}, 시간 {09,10,14}, 방식 {publickey}
[신규 로그인] devops: 192.168.56.77, 02시, password
 비교 결과: 출발지 NEW, 시간 OUT, 방식 CHANGED → 3개 축 모두 벗어남 → 높은 이상 점수
축기준선신규판정
출발지56.556.77신규
시간09~1402벗어남
방식publickeypassword변경

세 축이 동시에 벗어나면 단일 축보다 이상 가능성이 훨씬 높습니다(027·028편에서 탐지 룰로 구현).

8. SOC 관제 포인트

  • 계정별 로그인 프로필(시간·출발지·방식·빈도)을 기준선으로 저장하고 주기적으로 갱신합니다.
  • 기준선은 이상치를 제외한 깨끗한 기간의 데이터로 만듭니다.
  • 기준선을 정탐/오탐 판단(098편)과 이상 로그인 룰(027·028편)의 근거로 사용합니다.

9. 탐지 규칙

기준선은 탐지 룰보다 SIEM의 집계·비교에 적합합니다.

# Kibana: 계정별 출발지 집합 (지난 30일) → 기준선 시각화
data.dstuser : * and rule.id : 5715  → Terms(dstuser) × Terms(srcip)

# 신규 출발지 탐지(개념): 계정의 과거 출발지 집합에 없는 IP로 성공
→ Wazuh CDB(계정별 허용 IP) 또는 ML/이상탐지 기능 활용

Wazuh만으로 "계정별 과거에 없던 IP"를 상태 비교하기는 번거로우므로, 기준선 CDB 리스트(계정→허용 대역)로 "목록 밖 로그인"을 탐지하는 방식이 실용적입니다(027편).

10. 대응 방법

  1. 초기 확인 — 깨끗한 기간의 로그인 데이터로 계정별 프로필을 산출합니다.
  2. 범위 확인 — 수집 구간의 이상치(이질적 출발지·시간)를 가려내 별도 조사합니다.
  3. 증거 확보 — 기준선 파일을 날짜별로 보존하고 변경 이력을 관리합니다.
  4. 차단/조치 — 기준선을 탐지 룰·판단 기준으로 배포하고 주기적으로 갱신합니다.
  5. 재발 방지 — 계정별 로그인 프로필을 운영 기준선으로 유지합니다.

11. 핵심 정리

축기준선 내용
시간대계정이 주로 로그인하는 시(hour)
출발지계정별 IP/대역 집합
방식publickey / password 비율
빈도·요일일평균 로그인, 평일/주말
면접 포인트"정상을 정의해야 이상을 탐지한다 — 계정별 기준선이 핵심"

12. 다음 편 예고

다음 편 077. 계정 · 인증 보안 — 비정상 시간대·신규 출발지 로그인 탐지 에서는 기준선을 벗어나는 비정상 시간대·신규 출발지 로그인 탐지를 다룹니다.


이전 편: 075. 계정 · 인증 보안 — 로그인 기록 — wtmp·btmp·lastlog 분석
📚 시리즈 전체 보기: 시스템 보안 · 취약점

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

0개의 댓글