📄 2026.01.22 (Day 61) - Splunk SIEM 기본 실습 및 데이터 분석


1. 핵심 개념 정리

SIEM 및 Splunk 기초

# 핵심 개념 설명 실무/보안 관점
1 SIEM Security Information and Event Management, 보안 정보 및 이벤트 관리 시스템 다양한 소스의 로그를 중앙 집중식으로 수집, 분석하여 보안 위협 탐지
2 Splunk 엔터프라이즈급 빅데이터 수집 및 분석 플랫폼 머신 데이터 인덱싱 및 실시간 검색으로 인프라/보안 모니터링
3 SPL Splunk Processing Language, Splunk 전용 쿼리 언어 SQL과 유사하지만 파이프라인 기반으로 데이터 변환 및 통계 처리
4 Index Splunk가 데이터를 저장하는 논리적 컨테이너 로그 타입별로 인덱스 분리하여 검색 성능 최적화
5 Sourcetype 로그 데이터의 형식 정의 access_combined, syslog 등 파싱 규칙 자동 적용

Splunk 아키텍처 구성 요소

# 핵심 개념 설명 실무/보안 관점
6 Forwarder 데이터 수집 에이전트 원격 서버에 설치하여 로그를 Splunk 서버로 전송
7 Indexer 데이터를 인덱싱하고 저장하는 서버 대용량 로그 고속 검색을 위한 역인덱스 생성
8 Search Head 사용자 검색 인터페이스 제공 웹 UI에서 SPL 쿼리 실행 및 대시보드 관리
9 Management Console Splunk 클러스터 중앙 관리 분산 환경에서 설정 배포 및 모니터링
10 분산 아키텍처 Forwarder -> Indexer -> Search Head 구조 대규모 환경에서 수평 확장 가능

Splunk 검색 기본 개념

# 핵심 개념 설명 실무/보안 관점
11 키워드 검색 로그 내 단어 직접 검색 port, mongodb 등 문자열 포함 이벤트 필터링
12 와일드카드 * 사용으로 부분 일치 검색 por* -> port, portal, pork 등 모두 매칭
13 부울 연산자 AND, OR, NOT으로 조건 조합 mongodb AND 194.8.74.23 두 조건 모두 만족
14 파이프라인 기호로 명령어 체이닝
15 서브검색 [ ] 안의 검색 결과를 외부 쿼리에 사용 VIP 고객 찾기 후 해당 고객 상세 분석

2. 실습 내용 정리

실습 0-1: 네트워크 기본 점검

목표: Splunk 실습 전 네트워크 연결 상태 확인

실습 단계:

  1. IP 주소 확인: ip addr show 또는 ifconfig
  2. 기본 게이트웨이(라우터) 확인: ip route show (출력 예시: default via 192.168.1.1 dev ens33)
  3. 구글 DNS 연결 테스트: ping 8.8.8.8 -c 4
  4. DNS 서버 정상 작동 확인: ping www.google.com -c 4

확인 항목:

  • IP 주소 정상 할당 (DHCP 또는 고정 IP)
  • 게이트웨이 연결 가능 (내부 네트워크 통신)
  • 인터넷 연결 가능 (외부 통신)
  • DNS 서버 정상 작동 (도메인 이름 해석)

보안 인사이트:

  • Splunk는 원격 Forwarder와 통신하므로 네트워크 연결 필수
  • 방화벽 정책으로 포트 9997(Forwarder 통신) 허용 필요
  • DNS 장애 시 호스트명 기반 로그 수집 실패 가능

실습 1-1: Splunk 8.2.0 설치 및 초기 설정

목표: Ubuntu 20.04에 Splunk Enterprise 설치 및 웹 UI 접속

실습 환경:

  • Ubuntu 20.04
  • Splunk 8.2.0 (splunk-8.2.0-e053ef3c985f-linux-2.6-amd64.deb)

실습 단계:

  1. Splunk .deb 패키지 설치: sudo dpkg -i splunk-8.2.0-e053ef3c985f-linux-2.6-amd64.deb (설치 경로: /opt/splunk)
  2. SWID 태그 복사: sudo mkdir -p /usr/share/regid.2001-12.com.splunk 후 swidtag 파일 복사
  3. 부팅 시 자동 시작 설정: sudo /opt/splunk/bin/splunk enable boot-start (라이선스 약관: ‘q’ 후 ‘y’ 입력)
  4. 관리자 계정 생성: username admin, password 12345678 (최소 8자)
  5. Splunk 상태 확인 및 시작: sudo /opt/splunk/bin/splunk status / start
  6. 웹 UI 접속: 브라우저에서 http://[Ubuntu_IP]:8000 (admin / 12345678)

Splunk 디렉토리 구조:

  • /opt/splunk/bin/ - splunk 실행 파일
  • /opt/splunk/etc/ - 설정 파일 (inputs.conf, outputs.conf 등)
  • /opt/splunk/var/ - 인덱스 데이터 저장소
  • /opt/splunk/share/ - 문서 및 리소스

확인 항목:

  • Splunk 서비스 정상 실행 (splunkd, splunkweb)
  • 웹 UI 포트 8000 접속 가능
  • 관리자 계정 로그인 성공
  • 라이선스: Free License (일일 500MB 제한)

보안 설정:

  • 기본 포트 8000, 8089 방화벽 규칙 설정
  • 관리자 비밀번호 강화 (프로덕션 환경)
  • HTTPS 활성화 (SSL 인증서 적용)
  • 최소 권한 원칙 (Role-Based Access Control)

실습 1-2: Nginx 웹 서버 설치

목표: WAS(Web Application Server) 역할의 Nginx 설치

실습 단계:

  1. Nginx 설치: sudo apt update && sudo apt install nginx -y
  2. 서비스 시작: sudo systemctl start nginx && sudo systemctl enable nginx
  3. 방화벽 설정: sudo ufw allow ‘Nginx Full’
  4. 설치 확인: curl http://localhost (Welcome to nginx! 메시지 확인)
  5. 로그 파일 위치: /var/log/nginx/access.log, /var/log/nginx/error.log

Nginx 로그 형식:

  • 192.168.1.100 - - [21/Jan/2025:14:23:45 +0900] “GET / HTTP/1.1” 200 615 “-” “Mozilla/5.0”
  • 형식: IP - - [시간] “메소드 URI 프로토콜” 상태코드 바이트 “리퍼러” “User-Agent”

보안 인사이트:

  • Nginx 로그는 Splunk Forwarder로 수집하여 웹 공격 패턴 분석 가능
  • access.log에서 404 다발 시 디렉토리 탐색 공격 의심
  • 비정상적인 User-Agent는 자동화 공격 도구 시그니처

실습 2-1: Splunk 샘플 데이터 업로드

목표: tutorialdata.zip을 이용한 Splunk 검색 실습 준비

실습 단계:

  1. Splunk 웹 UI 로그인 (http://[Ubuntu_IP]:8000)
  2. 샘플 데이터: Settings > Add Data > Upload (tutorialdata.zip)
  3. 인덱스 생성: Settings > Indexes > New Index (Index Name: test_index, Max Size: 500MB)
  4. 데이터 업로드 설정: Source type Automatic, Host ubuntu, Index test_index
  5. 데이터 확인: Search & Reporting 앱 > index=“test_index”

tutorialdata.zip 데이터 구조:

  • access_combined_wcookie: 웹 서버 접근 로그 (Apache Combined + 쿠키)
  • secure-2: Linux 보안 로그 (/var/log/secure 형식)
  • vendor_sales: 판매/영업 데이터 (CSV 형식)

주요 필드:

  • clientip: 클라이언트 IP 주소
  • status: HTTP 상태 코드 (200, 404, 500 등)
  • action: 사용자 행동 (purchase, addtocart, view 등)
  • product_name, productId: 상품 정보, price: 가격

실습 2-2: Splunk 기본 검색 실습

목표: SPL 키워드 검색 및 연산자 사용법 학습

실습 단계:

  1. 단순 키워드 검색: source=“tutorialdata.zip:*” host=“ubuntu” index=“test_index” port (결과: “port” 문자열이 포함된 모든 이벤트)
  2. 와일드카드 검색: … por* (결과: port, portal, pork 등 “por"로 시작하는 모든 단어)
  3. 다중 키워드 검색 (AND 암묵적): … port mongodb (결과: “port"와 “mongodb” 둘 다 포함)
  4. 정확한 문자열 검색: … “mongodb from” (결과: 정확히 이 순서로 포함된 이벤트만)
  5. 부울 연산자 AND: … mongodb AND 194.8.74.23
  6. 부울 연산자 OR (괄호 그룹핑): … mongodb AND (194.8.74.23 OR 85.62.218.82)
  7. 호스트 와일드카드: … host=u*

SPL 검색 처리 과정:

  1. 인덱스에서 키워드 매칭 이벤트 추출 (역인덱스 활용)
  2. 부울 연산자로 필터링 (AND, OR, NOT)
  3. 필드 추출 (자동 또는 정규표현식)
  4. 타임스탬프 순서로 정렬
  5. 결과 반환 (기본 10,000개 제한)

검색 최적화 팁:

  • 가능한 인덱스와 sourcetype 명시 (검색 범위 축소)
  • 시간 범위 제한 (Last 24 hours, Last 7 days 등)
  • 와일드카드는 필요한 경우에만 사용 (성능 저하)

실습 2-3: Splunk 파이프라인 명령어 실습

목표: table, sort, top, rare 명령어로 데이터 변환

실습 단계:

  1. table - 특정 필드만 테이블 형식으로 출력:

    • host=”*” index=“test_index” | table Code, AcctID, sourcetype
  2. sort - 정렬:

    • host="*" index=“test_index” | table Code, AcctID, source, sourcetype | sort Code
  3. top - 빈도수 상위 항목:

    • host="*" index=“test_index” | table Code, AcctID, source, sourcetype | top Code
  4. top limit - 개수 제한:

    • host="*" index=“test_index” | top Code limit=5
  5. rare - 빈도수 하위 항목:

    • host="*" index=“test_index” | rare Code limit=5

파이프라인 명령어 체이닝 원리:

  • 검색 결과 -> | table -> | sort -> | top -> 최종 출력
  • 각 단계마다 이전 결과를 입력으로 받아 변환

주요 명령어 비교:

명령어 기능 사용 예시 출력 형식
table 특정 필드만 선택 table clientip, status 원본 데이터 그대로
sort 정렬 sort -_time (최신순) 정렬된 테이블
top 빈도수 상위 top clientip limit=10 개수, 비율 포함
rare 빈도수 하위 rare uri limit=5 개수, 비율 포함
stats 통계 계산 stats count by status 집계 결과

보안 인사이트:

  • top clientip 로 가장 많이 접속한 IP 탐지 (DDoS 의심)
  • rare uri 로 비정상적인 접근 경로 발견 (웹쉘, 백도어)
  • top status=404 로 디렉토리 스캔 공격 탐지

실습 3-1: 고급 SPL - VIP 고객 분석 쿼리

목표: 서브검색과 통계 명령어로 복잡한 분석 수행

전체 쿼리: index=test_index sourcetype=access_* status=200 action=purchase [search index=test_index sourcetype=access_* status=200 action=purchase | top limit=1 clientip | table clientip] | stats count AS “Total Purchased”, dc(productId) AS “Total Products”, values(product_name) AS “Product Names” BY clientip | rename clientip AS “VIP Customer”

실행 결과 예시:

  • VIP Customer: 87.194.216.51 / Total Purchased: 47 / Total Products: 12 / Product Names: Laptop, Mouse, Keyboard, Monitor…

쿼리 단계별 분해: 1단계: 서브검색 (가장 많이 구매한 고객 1명 찾기)

  • [search index=test_index sourcetype=access_* status=200 action=purchase | top limit=1 clientip | table clientip]
  • 결과: clientip=“87.194.216.51”

2단계: 메인 검색 (해당 고객의 구매 이벤트만 필터링)

  • 서브검색 결과가 자동으로 clientip=“87.194.216.51” 조건으로 삽입

3단계: 통계 계산

  • count AS “Total Purchased” (총 구매 횟수)
  • dc(productId) AS “Total Products” (고유 상품 개수, distinct count)
  • values(product_name) AS “Product Names” (구매한 상품 목록)

4단계: 필드명 변경

  • rename clientip AS “VIP Customer”

서브검색 실행 순서:

  1. 안의 서브검색 먼저 실행
  2. 서브검색 결과가 메인 검색의 조건으로 삽입
  3. 메인 검색 실행
  4. 통계 및 변환 명령어 순차 처리

제약사항:

  • 서브검색 결과는 최대 10,000개 제한
  • 중첩 서브검색은 최대 2단계까지
  • 성능 부하 주의 (큰 데이터셋에서는 join 또는 lookup 사용)

보안 인사이트:

  • VIP 고객 행동 패턴 분석으로 계정 탈취 탐지
  • 비정상적인 대량 구매는 카드 도용 의심
  • 고객별 접속 국가 변화 모니터링 (지리적 이상 탐지)

실습 3-2: 상품 전환율 분석 쿼리

목표: 조회 -> 장바구니 -> 구매 단계별 전환율 계산

전체 쿼리: index=“test_index” sourcetype=access_* status=200 | stats count AS views, count(eval(action=“addtocart”)) AS addtocart, count(eval(action=“purchase”)) AS purchases by product_name | eval viewsToPurchases = round((purchases/views)*100, 2), cartToPurchases = round((purchases/addtocart)*100, 2) | table product_name, views, addtocart, purchases, viewsToPurchases, cartToPurchases | rename product_name AS “Product Name”, views AS “Views”, addtocart AS “Adds To Cart”, purchases AS “Purchases”, viewsToPurchases AS “View->Purchase(%)”, cartToPurchases AS “Cart->Purchase(%)”

쿼리 단계별 분해: 1단계: 조건부 카운트 (eval 함수 사용)

  • count AS views (전체 조회수)
  • count(eval(action=“addtocart”)) AS addtocart (action이 “addtocart"인 것만 카운트)
  • count(eval(action=“purchase”)) AS purchases

2단계: 전환율 계산 (eval 명령어)

  • viewsToPurchases = round((purchases/views)*100, 2) (조회->구매: (구매/조회)*100)
  • cartToPurchases = round((purchases/addtocart)*100, 2) (장바구니->구매)
  • round() 함수: 소수점 둘째 자리까지 반올림

실행 결과 예시:

  • Laptop: Views 523 / Adds To Cart 87 / Purchases 23 / View->Purchase 4.40% / Cart->Purchase 26.44%
  • Mouse: Views 891 / Adds To Cart 134 / Purchases 67 / View->Purchase 7.52% / Cart->Purchase 50.00%

eval 함수 활용:

  • round(값, 자리수): 반올림
  • if(조건, 참, 거짓): 조건부 값
  • case(): 다중 조건 처리
  • tonumber(), tostring(): 형변환

보안 인사이트:

  • 전환율 급락 시 웹 사이트 장애 또는 공격 의심
  • 특정 상품만 장바구니 추가 후 구매 안 하면 가격 조작 시도 가능
  • 비정상적으로 높은 전환율은 봇 활동 의심

실습 3-3: 시계열 차트 생성

목표: timechart 명령어로 시간대별 추이 시각화

시간대별 상품 구매 추이:

  • index=“test_index” sourcetype=access_* | timechart count(eval(action=“purchase”)) by product_name usenull=f useother=f
  • X축: 시간, Y축: 구매 횟수, 선(Series): 각 상품별

timechart 옵션:

  • span=1m: 1분 단위로 집계
  • usenull=f: NULL 값 제외
  • useother=f: 기타(Other) 그룹 제외
  • by 필드명: 필드별로 시리즈 분리

보안 인사이트:

  • 시간대별 트래픽 급증은 DDoS 공격 징후
  • 특정 시간대 특정 상품 구매 폭증은 봇 활동
  • 평소와 다른 패턴 탐지 (Anomaly Detection)

실습 4-1: 대시보드 생성

목표: 검색 결과를 대시보드 패널로 저장

실습 단계:

  1. 검색 실행: index=“test_index” sourcetype=access_* status=200 action=purchase | top categoryId
  2. 검색 결과 우측 상단 “Save As” > Dashboard Panel 선택
  3. Dashboard: “Sales Dashboard” (신규 생성), Panel Title: “Top Categories”, Panel Content: Visualization 또는 Statistics
  4. 차트 유형 선택 (Pie Chart), 색상·레이블 커스터마이징
  5. Dashboards 메뉴 > Sales Dashboard 확인

대시보드 구성 예시:

Sales Dashboard (24시간):

  • 상단: Top Categories(Pie Chart) / Hourly Purchases(Line Chart)
  • 중단: Product Conversion Rate(Column Chart)
  • 하단: Top 10 Customers(Table)

대시보드 고급 기능:

  • 드릴다운: 차트 클릭 시 상세 검색으로 이동
  • 시간 범위 선택기: 실시간, 1시간, 24시간, 7일 등
  • 입력 필터: 드롭다운, 텍스트 입력으로 동적 검색
  • 자동 새로고침: 30초, 1분, 5분 간격

보안 인사이트:

  • SOC 대시보드: 실시간 공격 탐지, 알림 현황, TOP 10 위협
  • 임원 대시보드: 월간 침해사고 건수, 보안 투자 ROI
  • 운영 대시보드: 시스템 가용성, 로그 수집량, 인덱서 상태

실습 4-2: 보고서 저장 및 예약

목표: 검색 결과를 PDF/CSV로 내보내기 및 정기 보고서 예약

보고서 저장 단계:

  1. 검색 실행 후 Save As > Report
  2. Title: “Daily Purchase Report”, Description, Time Range Picker 설정
  3. Edit > Edit Schedule: Daily at 9:00 AM, Previous day, Email(수신자), PDF 또는 CSV 형식
  4. 즉시 내보내기: Export > PDF 또는 CSV

보고서 유형:

  • 일일 보고서: 전날 보안 이벤트 요약
  • 주간 보고서: 주간 TOP 10 위협, 트렌드 분석
  • 월간 보고서: 월별 침해사고 통계, 대응 현황
  • 연간 보고서: 연간 보안 투자 대비 효과 분석

실습 5-1: Splunk Forwarder 개념 학습

Splunk Forwarder 개념:

  • 원격 서버에 설치하는 경량 에이전트
  • 로컬 로그 파일을 Splunk Indexer로 전송
  • CPU/메모리 사용량 최소화 (약 50MB RAM)
  • 데이터 압축 및 암호화 전송 (SSL/TLS)

Forwarder 종류:

  1. Universal Forwarder (가장 많이 사용): 데이터 수집 및 전송만 수행, 파싱 및 인덱싱은 Indexer에서 처리
  2. Heavy Forwarder: 데이터 파싱 및 필터링 가능, 민감 정보 마스킹·데이터 변환 등

Forwarder 설치 과정 (이론):

  1. sudo dpkg -i splunkforwarder-8.2.0-*.deb
  2. sudo /opt/splunkforwarder/bin/splunk enable boot-start
  3. sudo /opt/splunkforwarder/bin/splunk add forward-server 192.168.x.x:9997
  4. inputs.conf 설정:
    • [monitor:///var/log/nginx/access.log] / disabled = false / index = web / sourcetype = access_combined
    • [monitor:///var/log/auth.log] / disabled = false / index = security / sourcetype = syslog
  5. sudo /opt/splunkforwarder/bin/splunk restart

Forwarder 통신 포트:

  • 9997: Forwarder -> Indexer (기본 수신 포트)
  • 8089: Splunk Management Port (설정 변경용)

보안 인사이트:

  • Forwarder는 읽기 전용 권한만 필요 (로그 파일 변조 방지)
  • SSL 암호화로 전송 중 데이터 보호
  • 네트워크 세그먼테이션: DMZ 서버는 별도 Forwarder 사용

3. Splunk 명령어 비교표

검색 및 필터링 명령어

명령어 기능 사용 예시 출력 결과
search 기본 검색 (생략 가능) search port 키워드 포함 이벤트
where 조건 필터링 where status=200 조건 만족 이벤트만
fields 필드 선택/제외 fields clientip, status 선택된 필드만 표시
dedup 중복 제거 dedup clientip 고유 IP만 표시
head 상위 N개 head 10 처음 10개 이벤트
tail 하위 N개 tail 10 마지막 10개 이벤트

통계 및 집계 명령어

명령어 기능 사용 예시 출력 결과
stats 통계 계산 stats count by status 상태별 개수
count 이벤트 개수 stats count 총 이벤트 수
dc() 고유값 개수 stats dc(clientip) 고유 IP 개수
values() 고유값 목록 stats values(uri) 고유 URI 목록
sum() 합계 stats sum(bytes) 바이트 총합
avg() 평균 stats avg(response_time) 평균 응답 시간

시각화 명령어

명령어 기능 사용 예시 차트 유형
timechart 시계열 차트 timechart count by status Line Chart
chart 일반 차트 chart count by product, status Column Chart
top 빈도수 상위 top clientip limit=10 Pie Chart
rare 빈도수 하위 rare uri limit=5 Table

4. 심화 분석

SPL 쿼리 패턴 분석

쿼리 패턴 설명 사용 사례 보안 적용
서브검색 [ ] 안의 검색 결과를 외부 쿼리 조건으로 사용 VIP 고객의 행동 분석 공격자 IP 찾기 후 전체 활동 추적
조건부 집계 count(eval(조건)) 특정 조건 만족하는 이벤트만 카운트 실패한 로그인 횟수 집계
필드 계산 eval 필드명 = 수식 전환율, 비율 계산 성공률, 탐지율 계산
파이프라인 검색 -> 변환 -> 집계 -> 정렬 다단계 데이터 변환 공격 IP -> 국가 -> 통계

실전 보안 쿼리 예시

HTTP 상태 코드별 통계 (공격 탐지):

  • index=web sourcetype=“access_combined” | stats count as hits by status | sort - hits

상위 20개 공격 IP (DDoS 탐지):

  • index=web sourcetype=“access_combined” | stats count as hits by clientip | sort - hits | head 20

404 에러 많은 URI (디렉토리 스캔 탐지):

  • index=web sourcetype=“access_combined” status=404 | stats count as notfound_cnt by uri | sort - notfound_cnt | head 20

SQL Injection/XSS 페이로드 탐지:

  • index=web sourcetype=“access_combined” (“union select” OR “select * from” OR “etc/passwd” OR “script”) | stats count by clientip, uri | sort - count

SSH 로그인 실패 시도 (Brute Force 탐지):

  • index=waf sourcetype=“access_combined” “Failed password” | rex “from (?<src_ip>\d+.\d+.\d+.\d+)” | stats count as fail_cnt by src_ip | sort - fail_cnt | head 20

Windows 보안 이벤트 집계:

  • index=* host=“윈도우시스템이름” source=“WinEventLog:Security” | stats count by EventCode | sort - count

5. 실무/보안 적용

SOC 분석가 관점 - Splunk 활용 시나리오

시나리오 탐지 쿼리 대응 방안
웹 공격 탐지 index=web (sql OR xss OR ../) stats count by clientip
DDoS 공격 탐지 index=web timechart span=1m count (급격한 트래픽 증가 확인)
Brute Force 탐지 index=security “Failed password” stats count by src_ip
내부자 위협 탐지 index=security (copy OR download) stats sum(bytes) by user
랜섬웨어 탐지 index=endpoint (*.encrypted OR ransom) stats count by hostname

Splunk 검색 최적화 체크리스트

성능 최적화:

  • 인덱스 명시 (index=web 대신 index=* 지양)
  • Sourcetype 명시 (sourcetype=access_combined)
  • 시간 범위 제한 (Last 24 hours, Last 7 days)
  • 필드 추출 최소화 (필요한 필드만 fields 명령어로 선택)
  • 서브검색 결과 10,000개 이하 유지

쿼리 작성:

  • 키워드 검색 우선 (정규표현식은 최후 수단)
  • 파이프라인 순서 최적화 (필터링 -> 집계 -> 정렬)
  • 복잡한 쿼리는 Saved Search로 저장 후 재사용

6. 배운 점 및 인사이트

새로 알게 된 점

  • Splunk의 강력한 검색 엔진: SQL보다 직관적인 파이프라인 기반 SPL로 복잡한 로그 분석도 몇 줄로 가능
  • 서브검색의 유연성: VIP 고객 찾기 -> 해당 고객 상세 분석처럼 2단계 쿼리를 하나로 통합 가능
  • eval의 다재다능함: 단순 사칙연산부터 조건부 집계, 전환율 계산까지 모두 처리
  • 대시보드의 실시간성: 자동 새로고침으로 SOC에서 실시간 위협 모니터링 가능
  • Forwarder의 경량성: 50MB RAM으로 수백 대 서버 로그 수집 가능, 중앙 집중식 관리의 효율성

이전 학습과의 연결고리

  • Wireshark 패킷 분석 -> Splunk 로그 분석: 수동 패킷 분석을 넘어 자동화된 대규모 로그 분석 체계
  • Snort IDS 이벤트 -> Splunk 통합: Snort 알림을 Splunk로 수집하여 종합 분석 가능
  • 웹쉘 공격 탐지 연계: 이전에 학습한 SQL Injection 패턴을 Splunk 쿼리로 탐지
  • ISMS-P 로그 관리 요구사항: Splunk로 중앙 집중식 로그 수집 및 보존 의무 이행

실무 적용 아이디어

보안 전문가 관점:

  • 침해사고 대응 플랫폼: Splunk를 SIEM으로 활용하여 전체 인프라 로그 통합 분석
  • 위협 헌팅: 정상 패턴 학습 후 이상 징후 탐지 (Anomaly Detection)
  • 컴플라이언스 보고: ISMS-P, 개인정보보호법 준수 증빙 자료 자동 생성
  • 보안 대시보드 구축: 경영진용 월간 보안 현황, SOC용 실시간 위협 모니터링

7. Quick Reference

Splunk 명령어 치트시트

기본 검색:

  • index=web sourcetype=access_combined status=200

시간 범위:

  • earliest=-24h latest=now

필드 선택:

  • | fields clientip, status, uri

정렬:

  • | sort -_time (최신순) / | sort +status (오름차순)

통계:

  • | stats count by status
  • | stats count AS total, avg(bytes) AS avg_bytes

상위/하위:

  • | top clientip limit=10 / | rare uri limit=5

테이블 형식:

  • | table _time, clientip, status, uri

시계열:

  • | timechart span=1h count by status

조건부 집계:

  • | stats count(eval(status=404)) AS not_found

필드 계산:

  • | eval response_time_ms = response_time * 1000

서브검색:

  • … [search … | top limit=1 clientip | table clientip]

정규표현식 추출:

  • | rex field=_raw “IP: (?\d+.\d+.\d+.\d+)”

Splunk 관리 명령어

  • /opt/splunk/bin/splunk start / stop / restart / status
  • /opt/splunk/bin/splunk enable boot-start
  • /opt/splunkforwarder/bin/splunk add forward-server [IP]:9997
  • Settings > Licensing (라이선스 확인)
  • Settings > Indexes (인덱스 관리)
  • Settings > Users and Authentication (사용자 관리)

주요 디렉토리 및 파일

경로 설명
/opt/splunk/bin/ 실행 파일
/opt/splunk/etc/system/local/ 로컬 설정 파일
/opt/splunk/var/lib/splunk/ 인덱스 데이터 저장소
/opt/splunk/var/log/splunk/ Splunk 자체 로그
/opt/splunkforwarder/etc/system/local/inputs.conf Forwarder 입력 설정

8. 트러블슈팅

문제 원인 해결 방법
웹 UI 접속 안 됨 (8000 포트) Splunk 서비스 중지, 방화벽 차단, 포트 충돌 splunk status 확인 후 splunk start, sudo ufw allow 8000, netstat -tuln 로 포트 사용 확인
검색 결과 없음 인덱스명 오타, 시간 범위 잘못 설정, 데이터 미수집 index=* 로 전체 검색 테스트, Time Picker에서 “All time” 선택, Settings > Indexes에서 데이터 크기 확인
Forwarder 데이터 수집 안 됨 Forwarder 서비스 중지, Indexer 연결 실패, 로그 파일 권한 부족 splunkforwarder status 확인, inputs.conf 에서 forward-server 확인, chmod 644 /var/log/nginx/access.log
검색 속도 느림 시간 범위 너무 넓음, 인덱스 미지정, 복잡한 정규표현식 시간 범위 좁히기, 인덱스와 sourcetype 명시, rex 대신 기본 필드 추출 사용

Today’s Insight:

Splunk는 단순한 로그 검색 도구를 넘어 비즈니스 인텔리전스와 보안 분석을 통합하는 강력한 플랫폼임을 체감했습니다. tutorialdata.zip 샘플 데이터로 VIP 고객 분석, 상품 전환율 계산, 시간대별 구매 추이 시각화 등을 실습하며, 파이프라인 기반 SPL의 직관성과 유연성에 놀랐습니다. 특히 서브검색 [ ]을 사용하여 “가장 많이 구매한 고객 1명을 찾은 후, 그 고객의 모든 활동 분석"을 단일 쿼리로 처리할 수 있다는 점이 인상적이었습니다. 대시보드와 보고서를 직접 만들어보며, SOC 분석가가 실시간으로 위협을 모니터링하고 경영진에게 보안 현황을 가시화하는 방식을 이해하게 되었습니다. 향후 실무에서는 Splunk Forwarder로 수백 대 서버의 로그를 중앙 집중식으로 수집하고, 커스텀 쿼리로 조직 특화 위협을 탐지하는 SIEM 체계를 구축할 수 있을 것 같습니다.