백엔드/Elastic & Splunk

Elastic & Splunk를 활용한 이상징후 탐지(3)

짱뚱짱 2025. 4. 17. 11:18

익숙해지려면 계속해서 사용해보는 수밖에 없다.

 

splunk접속정보는 localhost:8000

포트, 세션타임아웃같은 항목 변경 가능

설정 -> 서버 설정 -> 검색 기본 설정에서 검색 관련 설정도 변경이 가능하다.

 

Search & Reporting - 작업을 눌러 검색에 걸린 시간도 알 수 있다.

기본적으로 index=apachelog만 입력하면 모든 필드를 보여주고

index=apachelog
| fields uri 

이렇게 원하는 필드를 볼수도 있다.

여러가지 차트를 그려보는 시도를 해볼 필요가 있다.

 

index=apachelog
| timechart count by method

sql의 groupby와 비슷한 문법. 메소드별로 보겠다는 뜻.

시각화-차트에서 보고싶은 차트 종류(라인, 스택 등등) 선택 가능

필드 구조에 대한 공부가 필요함.

이래서 내가 만든 데이터는 분석하기가 쉬운데, 남이 만든 데이터는 분석하기가 어렵다.

 

중복제거. 역시 sql문과 비슷하다.

 

 

url고유개수가 증가할 때마다, 404에러가 같이 증가했다는 걸 알  수 있음.

내가 어떤 데이터를 봐야 되고, 어떤 식으로 계산해야 되는지 계획이 세워져 있으면 분석은 어렵지 않다.

 

파일의 확장자를 ext필드로 추출하기

확장자가 있는 경우엔 잘 추출되고, 없는 경우엔 그냥 원래 값 그대로 남는다.

확장자를 기준으로 시각화하거나 필터링할 수 있게 됨.

 

index=apachelog
| eval ext=if(match(필드, "검색"), 참, 거짓)

매치함수를 포함한 조건문 

 

설정-필드-계산된필드-새 계산된 필드

eval명령어의 gui버전. 반복적으로 자주 쓰는 필터나 계산식을 매번 입력하는 게 번거롭다면, 이렇게 필드 변환 설정 메뉴에서 새 필드를 만들어두는 것도 좋은 방법이다.

 

필드-필드별칭-새 필드 별칭

내가 쓰기 쉬운 이름(별명)을 줄 수 있다.

 

 

param 필드의 문자열 길이를 재서 paramlen 이라는 새 필드에 저장.

 

 

 

상단 메뉴 중 대시보드 - 새 대시보드 만들기 

대시보드 ID는 대시보드끼리 구분할 수 있도록 중복되지 않는 식별자이며, 내가 직접 지정할 수 있다.

 

 

패널추가-새로만들기-컬럼차트

대시보드에 추가 하기 전, 검색 실행 버튼을 눌러서 명령어를 테스트 해볼 수 있다.

 

추가한 상태. 이런식으로 내가 보고싶은 차트를 대시보드에 추가 가능.

 

여러가지 옵션들을 바꿔볼 수 있다.

 

이 상태로 대시보드 상단 우측 저장을 누르면 저장.

 

대시보드 소스코드는 xml포맷으로 되어있다.

 

입력 추가에서 "시간"은 UI에서 클릭만 해도 코드가 자동으로 생성된다.
하지만 라디오나 드롭다운 같은 항목은 명령어 부분을 직접 수정해야 할 때가 있어서, 경우에 따라 소스코드를 건드릴 필요도 있다. .

 

 

 

 

iis데이터도 스플렁크에 연동해보자.

파일 업로드 기능 이용해서 iis.log 선택

iis같은 경우는 소스타입을 자동으로 안해준다.(아파치만 해줌)

소스타입 지정
원본데이터의 시간과 스플렁크의 _time이 다르므로 이대로 진행하면 안됨
다른이름으로 저장

시간정보를 바꾼 iis를 앱을 서치 앤 리포팅으로 선택해주고 저장.

앱을 바꾼 이유는 검색할때 분류가 달라지므로 좀 더 편함

 

설정-소스타입에서 확인 가능

 

 

마찬가지로 내가 분석하기 편한 환경 만들기

 

 

사용자 편의성 면에서는 엘라스틱은 로그스태이시니, 키바나니 분산되어 있는데, 스플렁크는 구조가 하나로 되어있어서 사용자 입장에선 더 사용하기가 좋은 것 같다. 단, 비용 부분은 충분히 검토가 필요하다.

 

index=iislog NOT status=* 이런식으로 status가 없는 항목을 찾을 수도 있다. (NOT은 대문자로 해야 함)

 

 

검색결과에 포함되지 않는 값을 지우는 작.

 

데이터를 살펴보면 잘못된 구조가 발견될 수도 있고, 그걸 직접 찾아내는 것도 중요한 작업이다.
물론 전체 데이터 중 1%의 오류라도 무시하기엔 애매하다.
하지만 그걸 고치기 위해 들이는 공수가, 실제로 가치가 있는지 따져볼 필요도 있다.
괜히 시간 낭비하는 게 아니라, 효율적인 선에서 품질을 챙기는 게 더 중요할 수도 있다.
결국, 이런 판단을 잘 하려면, 결국 툴에 익숙해져야 한다.
데이터에 대한 관심과 욕심이 있어야 이런 툴에도 자연스럽게 익숙해지는 것.

 

 

index=iislog
| eval file=if(match(url, "\."), replace(url, ".*\/(.*)", "\1"), null())
| stats count by file

점이 있는 애들만 추출 후 집계

맨 위에 보면 빈칸이 있는데, 점(.)이 들어간 건 파일 뿐 아니라 경로(url)에도 있다. 그래서 점이 있으면 가지고 와서 replace함수로 검사를 하는데, 파일이 없으니 빈 문자열로 된 것이다. 이런 경우도 제외하고 싶다면 정규표현식을 좀 더 정교하고 세밀하게 만들어야 한다. 이 작업도 할지 말지 그 영향에 따라 의사결정을 해야 함.

맨 위에 보면 빈값도 있고, 점(.)이 들어간 건 실제 파일뿐 아니라 경로(URL)에도 존재한다.
그래서 단순히 점이 있다고 해서 무조건 파일이라고 보면 곤란하다.

점이 있으면 가지고 와서 replace함수로 검사를 하는데, 파일이 없으니 빈 문자열이 결과에 섞여 버린 것이다.

이런 경우를 제외하고 싶다면 정규표현식을 더 정교하게 조정해야 한다.

이런 작업 또한 분석 목적과 기대 효과를 따져보고, 굳이 필요 없다면 생략하는 것도 현명한 선택이다.

 

다시 짠 정규표현식 .*\/[^\/]+\.[^\/]+$

빈칸 사라진걸 볼수있다

 

index=iislog
| eval file=if(match(url, "\."), replace(url, ".*\/(.*)", "\1"), null())
| eval file2=if(match(url, "\."), replace(url, ".*\/([^\/]+\.[^\/]+$)", "\1"), null())
| timechart dc(file), dc(file2) span=1h

이런식으로 두개의 차트를 그려볼 수도 있음

 

 

iis log는 이렇게 마무리~

이제 secure log 연동 ㄱ

파일업로드로 secure.log파일 업로드 source type 은 linux_secure로 선택

 

 

새 필드 추출

 

로그 하나 선택

 

정규식 선택
드래그해서 필드 이름 줄 수 있다

 

데이터 구조가 복잡할 수록 활용하기 어려운 기능

 

여기서도 선택 가능
호스트정보 추출

 

 

 

필드-계산된 필드에 추가 가능

 

집계 함수만 써도 나옴.

 

 

 

추가 앱 찾기 선택

참고로, 스플렁크에도 일종의 아이폰 앱 생태계처럼 다양한 확장기능을 앱 형식으로 제공하고 있다.

Search & Reporting 뿐만 아니라 여러가지 기능들이 앱으로 만들어져 있음.

 

Splunkbase에서보기 클릭

 

스플렁크 직원 뿐 아니라 외부에서도 스플렁크와 연동되는 기능들을 만들어서 올릴 수 있다. 

찾으려고 하는 앱은 linux secure인데, 현재는 스플렁크에서는 직접 검색이 되지 않는다.

tgz파일로 설치.

스플렁크 - 앱 - 앱관리로 이동

파일에서 앱 설치 클릭해서 설치파일로 설치

설치 완료

 

해당 경로에서 설치된거 확인할 수 있다.

 

스플렁크 재시작하면 사용 가능.

 

설정 - source type에 가보면 확인 가능

기존 securelog index는 삭제

다시 데이터추가 - upload로 secure.log 선택

sourcetype - 운영체제 - linux-secure 선택

안쓴것보다는 좀 더 나은 테이블 구조를 볼 수 있다.

 

계산된필드에 새로 추가

마찬가지로 계산된 필드에 추가하고, 편히 쓸 수 있다. 

스플렁크의 앱기능을 잘 찾아보면 내 목적에 맞는 앱을 찾을 수 있다.

 

keyword는 linux secure 앱을 설치해서 만든 필드

누군가가 원격 접속을 시도했다가 실패했다는 걸 알 수 있음.

 

150명정도의 사용자가 지속적으로 원격접속을 시도했다.

 

대부분의 사용자들이 로그인에 실패했다는 걸 알 수 있음.

내가 어떤 상태를 보고싶은가에 따라서 여러가지 차트를 그릴 수 있다.

날짜 간격을 좁히고 싶으면 span 옵션 사용

사용자와 ip의 고유개수 변화 추이 알 수 있음

 

 

join명령 써보기

 

pid, user로만 조인했을때 결과

 

조인은 목적에 따라서는 굉장히 유용하지만, 동타임에 발생한 같은 세션의 이벤트를 보고싶다는 목적엔 딱 맞지 않음.

이럴 땐 좀 더 정확하게 쓰기 위해 transaction 명령어로 묶어준다.

transaction을 사용하면 eventcount 필드가 생김.

 

 

누가 로그인에 성공했는지, 합쳐진
성공한 사용자의 id와 ip는 이렇다

 

 

 

이번엔 Splunk의 필드 추출과 대시보드 구성까지 다뤄봤다.  
GUI로도 꽤 많은 걸 할 수 있어서 입문자에게 접근성이 좋다는 걸 체감했다.  
하지만 역시 복잡한 분석은 결국 쿼리로 정교하게 짜야 하니까 툴에 익숙해지는 것도 중요하지만 결국 '무엇을 보고 싶은가'가 더 중요하다.