📄 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 실습 전 네트워크 연결 상태 확인
실습 단계:
- IP 주소 확인: ip addr show 또는 ifconfig
- 기본 게이트웨이(라우터) 확인: ip route show (출력 예시: default via 192.168.1.1 dev ens33)
- 구글 DNS 연결 테스트: ping 8.8.8.8 -c 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)
실습 단계:
- Splunk .deb 패키지 설치: sudo dpkg -i splunk-8.2.0-e053ef3c985f-linux-2.6-amd64.deb (설치 경로: /opt/splunk)
- SWID 태그 복사: sudo mkdir -p /usr/share/regid.2001-12.com.splunk 후 swidtag 파일 복사
- 부팅 시 자동 시작 설정: sudo /opt/splunk/bin/splunk enable boot-start (라이선스 약관: ‘q’ 후 ‘y’ 입력)
- 관리자 계정 생성: username admin, password 12345678 (최소 8자)
- Splunk 상태 확인 및 시작: sudo /opt/splunk/bin/splunk status / start
- 웹 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 설치
실습 단계:
- Nginx 설치: sudo apt update && sudo apt install nginx -y
- 서비스 시작: sudo systemctl start nginx && sudo systemctl enable nginx
- 방화벽 설정: sudo ufw allow ‘Nginx Full’
- 설치 확인: curl http://localhost (Welcome to nginx! 메시지 확인)
- 로그 파일 위치: /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 검색 실습 준비
실습 단계:
- Splunk 웹 UI 로그인 (http://[Ubuntu_IP]:8000)
- 샘플 데이터: Settings > Add Data > Upload (tutorialdata.zip)
- 인덱스 생성: Settings > Indexes > New Index (Index Name: test_index, Max Size: 500MB)
- 데이터 업로드 설정: Source type Automatic, Host ubuntu, Index test_index
- 데이터 확인: 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 키워드 검색 및 연산자 사용법 학습
실습 단계:
- 단순 키워드 검색: source=“tutorialdata.zip:*” host=“ubuntu” index=“test_index” port (결과: “port” 문자열이 포함된 모든 이벤트)
- 와일드카드 검색: … por* (결과: port, portal, pork 등 “por"로 시작하는 모든 단어)
- 다중 키워드 검색 (AND 암묵적): … port mongodb (결과: “port"와 “mongodb” 둘 다 포함)
- 정확한 문자열 검색: … “mongodb from” (결과: 정확히 이 순서로 포함된 이벤트만)
- 부울 연산자 AND: … mongodb AND 194.8.74.23
- 부울 연산자 OR (괄호 그룹핑): … mongodb AND (194.8.74.23 OR 85.62.218.82)
- 호스트 와일드카드: … host=u*
SPL 검색 처리 과정:
- 인덱스에서 키워드 매칭 이벤트 추출 (역인덱스 활용)
- 부울 연산자로 필터링 (AND, OR, NOT)
- 필드 추출 (자동 또는 정규표현식)
- 타임스탬프 순서로 정렬
- 결과 반환 (기본 10,000개 제한)
검색 최적화 팁:
- 가능한 인덱스와 sourcetype 명시 (검색 범위 축소)
- 시간 범위 제한 (Last 24 hours, Last 7 days 등)
- 와일드카드는 필요한 경우에만 사용 (성능 저하)
실습 2-3: Splunk 파이프라인 명령어 실습
목표: table, sort, top, rare 명령어로 데이터 변환
실습 단계:
-
table - 특정 필드만 테이블 형식으로 출력:
- host=”*” index=“test_index” | table Code, AcctID, sourcetype
-
sort - 정렬:
- host="*" index=“test_index” | table Code, AcctID, source, sourcetype | sort Code
-
top - 빈도수 상위 항목:
- host="*" index=“test_index” | table Code, AcctID, source, sourcetype | top Code
-
top limit - 개수 제한:
- host="*" index=“test_index” | top Code limit=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”
서브검색 실행 순서:
- 안의 서브검색 먼저 실행
- 서브검색 결과가 메인 검색의 조건으로 삽입
- 메인 검색 실행
- 통계 및 변환 명령어 순차 처리
제약사항:
- 서브검색 결과는 최대 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: 대시보드 생성
목표: 검색 결과를 대시보드 패널로 저장
실습 단계:
- 검색 실행: index=“test_index” sourcetype=access_* status=200 action=purchase | top categoryId
- 검색 결과 우측 상단 “Save As” > Dashboard Panel 선택
- Dashboard: “Sales Dashboard” (신규 생성), Panel Title: “Top Categories”, Panel Content: Visualization 또는 Statistics
- 차트 유형 선택 (Pie Chart), 색상·레이블 커스터마이징
- 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로 내보내기 및 정기 보고서 예약
보고서 저장 단계:
- 검색 실행 후 Save As > Report
- Title: “Daily Purchase Report”, Description, Time Range Picker 설정
- Edit > Edit Schedule: Daily at 9:00 AM, Previous day, Email(수신자), PDF 또는 CSV 형식
- 즉시 내보내기: Export > PDF 또는 CSV
보고서 유형:
- 일일 보고서: 전날 보안 이벤트 요약
- 주간 보고서: 주간 TOP 10 위협, 트렌드 분석
- 월간 보고서: 월별 침해사고 통계, 대응 현황
- 연간 보고서: 연간 보안 투자 대비 효과 분석
실습 5-1: Splunk Forwarder 개념 학습
Splunk Forwarder 개념:
- 원격 서버에 설치하는 경량 에이전트
- 로컬 로그 파일을 Splunk Indexer로 전송
- CPU/메모리 사용량 최소화 (약 50MB RAM)
- 데이터 압축 및 암호화 전송 (SSL/TLS)
Forwarder 종류:
- Universal Forwarder (가장 많이 사용): 데이터 수집 및 전송만 수행, 파싱 및 인덱싱은 Indexer에서 처리
- Heavy Forwarder: 데이터 파싱 및 필터링 가능, 민감 정보 마스킹·데이터 변환 등
Forwarder 설치 과정 (이론):
- sudo dpkg -i splunkforwarder-8.2.0-*.deb
- sudo /opt/splunkforwarder/bin/splunk enable boot-start
- sudo /opt/splunkforwarder/bin/splunk add forward-server 192.168.x.x:9997
- 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
- 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 체계를 구축할 수 있을 것 같습니다.