2021년 12월 30일 목요일

데이터 분석에 필요한 자질은 뭘까?

빅데이터가 대세 키워드였던 몇 년 전만 해도 하둡 등의 인프라가 모든 것을 해결해줄 듯한 분위기였다면 알파고 이후엔 수학 및 통계학, 그리고 그런 지식에 기반한 모델링 능력이 필수 자질로 꼽히는 세상이 되었다.


2021년 12월 26일 일요일

Logstash input jdbc error

다음은 Mysql 7.0 연결을 위한 로그스태시 파이프라인.
input {
 jdbc {
  jdbc_driver_library => "D:/mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar"
  jdbc_driver_class => "com.mysql.jdbc.Driver"
  jdbc_connection_string => "jdbc:mysql://localhost:3306/snort"
  jdbc_user => "user"
  jdbc_password => "password"
  schedule => "* * * * *"

2021년 11월 12일 금요일

네트워크 관계망 그리기

엘라스틱은 네트워크 관계망을 그려주는 graph 기능을 제공한다. (유료 라이센스 필요)


2021년 10월 30일 토요일

하위 디렉토리 재귀 접근

C:\log 하위 디렉토리의 모든 로그를 가져와보자.
C:\log>dir /b/s
C:\log\1001
C:\log\1002
C:\log\1003
C:\log\1004
C:\log\1005
C:\log\1001\1001.log
C:\log\1002\1002.log
C:\log\1003\1003.log
C:\log\1004\1004.log
C:\log\1005\1005.log
C:\log\1005\last
C:\log\1005\last\last.log

2021년 10월 24일 일요일

디렉토리 및 파일 동시 생성

윈도우
C:\log>for /l %i in (1001, 1, 1023) do (mkdir %i && echo %i > %i\%i.log)
C:\log>dir /s/b *.log
C:\log\1001\1001.log
C:\log\1002\1002.log
C:\log\1003\1003.log
C:\log\1004\1004.log
C:\log\1005\1005.log
C:\log\1006\1006.log
C:\log\1007\1007.log
C:\log\1008\1008.log
C:\log\1009\1009.log
C:\log\1010\1010.log

2021년 10월 17일 일요일

엘라스틱의 key-value 처리

스플렁크는 key-value 구조를 갖는 데이터에 대한 동적 필드 생성을 자동으로 처리해준다. 이게 싫으면 props.conf의 KV_MODE 설정을 바꾸면 됨.


2021년 10월 11일 월요일

엘라스틱 Runtime field - 4th

읽기 스키마 맛을 본 뒤론 가급적 런타임 필드를 사용하려고 한다. 다음은 URI 필드에서 url과 변수 정보를 런타임 필드로 추출하는 구문.
PUT test/_mapping
{
  "runtime": {
    "url": {
      "type": "keyword",
      "script": "emit(grok('(?<url>[^?]+)').extract(doc['uri.keyword'].value).url)"
    },
    "param": {
      "type": "keyword",
      "script": "emit(grok('[^?]+\\\\??(?<param>.*)').extract(doc['uri.keyword'].value).param)"
    }
  }
}

2021년 10월 5일 화요일

엘라스틱 Runtime field - 3rd

다음은 url 필드에서 추출한 파일과 확장자 정보를 이용해서 런타임 필드를 만드는 painless 스크립트. 정보 추출 범위는 .을 포함한 url만으로 제한했다.
PUT iislog/_mapping
{
  "runtime": {
    "file": {
      "type": "keyword",
      "script": """
        if (doc['url'].value.contains('.')) {
          String result = grok('.*\\/(?<file>.*)').extract(doc['url'].value).file;
          emit(result);
        }
      """
    },

2021년 10월 4일 월요일

블로그 접속 추이 변화(feat. 코로나)

본격적으로 블로그를 시작한 게 15년이니 햇수로 7년이 되어간다. 나름 우상향하는 페이지뷰 보는 재미에 꾸준할 수 있었지 않나 싶다. 17년부터 시작한 엘라스틱 관련 포스팅이 유입을 늘리는 데 도움이 됐다는 게 개인적인 생각. 그런데 20년 이후 하향세가 두드러진다(..)


2021년 9월 26일 일요일

Filebeat 웹 로그 모듈 버그?

대략 20만 개의 iis 웹 로그 중 실제 변수를 포함한 로그는 7,757개. (로그 헤더 제외)


2021년 9월 12일 일요일

정규표현식 몰라도 된다 - 2nd

정규표현식보다 데이터 이해도가 더 중요함은 엘라스틱도 마찬가지. 일단 간단한 예제 인덱스 생성.
POST _bulk
{"index": {"_index": "test"}}
{"url": "/path1/a.php"}
{"index": {"_index": "test"}}
{"url": "/path1/path2/b.php"}
{"index": {"_index": "test"}}
{"url": "/path1/path2/path3/c.php"}

2021년 9월 11일 토요일

정규표현식 몰라도 된다

5일 중 3일을 정규표현식에 할애한 과정을 진행하다가 아차(?) 싶었던 첫 강의가 생각난다. 그렇게 정규표현식 비중을 줄이고 줄여서 현재 정규표현식 과정은 반나절 정도(..) 그럼에도 빠지지 않는 질문이 쉬운 정규표현식? 대체 방법? 

정규표현식이 쉬워지는 방법은 많이 써보는 수밖에 없다 보니 정규표현식을 사용하지 않고 원하는 테이블 구조를 만드는 방법에 대한 고민을 자주 한다. 일단 예제 데이터 생성.
| makeresults 
| eval url="/path1/a.php /path1/path2/b.php /path1/path2/path3/c.php"
| makemv delim=" " url
| mvexpand url
| table url

2021년 9월 10일 금요일

Splunk의 진입장벽

엘라스틱 익숙해지는 데 6개월쯤 걸렸었다. 스플렁크는 한 달? 의외로 진입이 쉬웠다. (데이터 분석툴 관점에서) 엘라스틱도 쉽다고 생각했는데 더 쉬워서 놀람. 읽기 스키마와 특히 리눅스에 익숙할수록 친숙한 SPL(Search Processing Language)의 동작 방식 때문에 그러지 않았나 싶다.

다음은 간단한 테스트를 위해 makeresults 구문으로 예제 데이터를 생성하는 과정. | 기호를 이용해서 SPL이 데이터를 단계적으로 처리함을 알 수 있다.
① | makeresults 
② | eval url="/path1/a.php /path1/path2/b.php /path1/path2/path3/c.php"
③ | table url

2021년 9월 6일 월요일

CentOS의 Splunk

스플렁크 RPM 설치는 간단하다.
[root@Centos7 ~] rpm -i splunk-8.2.2-87344edfcdb4-linux-2.6-x86_64.rpm
warning: splunk-8.2.2-87344edfcdb4-linux-2.6-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID b3cd4420: NOKEY
useradd: cannot create directory /opt/splunk
complate
[root@Centos7 ~]
[root@Centos7 ~] whereis splunk
splunk: /opt/splunk/bin/splunk

2021년 8월 29일 일요일

Splunk로 알아보는 이상징후 분석

네 번째 책을 출간했다. 사실 스플렁크는 상업용이고, 프리 버전은 1일 500MB 저장 용량 제한이 있어서 관심 밖이었다.

그런데 엘라스틱의 조인 기능에 답답해하던 중 스플렁크는 조인을 지원한다는 얘기를 듣고 써보다가 책까지 쓰게 됨(..)

특히 데이터를 저장한 후에도 분석 목적에 따라 테이블 구조를 마음대로 바꿀 수 있는 스플렁크의 읽기 스키마는 신선한 충격으로 다가왔다.

물론 엘라스틱도 최신 버전은 읽기 스카마를 지원하지만 적용 방식이 개발자 친화적?이라 좀 까다로울 수 있다.

반면 스플렁크의 읽기 스키마는 기본 베이스라 아예 의식할 필요가 없음. 그냥 (조인 기능을 대수롭지 않게 만들어버릴 만큼 뛰어난 데이터 접근성을 보여주는) SPL을 이용해서 마치 리눅스의 grep이나 sed 명령어 사용하듯 데이터에만 집중하면 된다.

2021년 8월 16일 월요일

Splunk의 eval과 rex

SPL 명령어 중 evalrex는 둘 다 정규표현식을 이용한 필드 추출 기능을 제공한다. 그런데 동작 방식이 약간 다름.


2021년 7월 27일 화요일

Splunk와 Winlogbeat 차이 - 2nd

winlogbeat는 ignore_older 옵션으로 수집 시간 범위를 결정할 수 있는 반면, 스플렁크는 좀 까다롭다. current_only와 checkpointInterval 조합을 통해 수집 데이터의 시간 범위를 결정하는 건 맞는데, 좀 더 정확히 하면 

 ① 처음부터(current_only=0, 디폴트) 또는 
 ② 스플렁크 실행 이후 시점부터(current_only=1) 수집, 두 가지만 선택할 수 있다.

다음 설정(Splunk\etc\system\local\inputs.conf)을 사용하면 'current_only=0'이 디폴트이기 때문에 전체 데이터를 수집한다.
[WinEventLog://Security]
index = winevent

2021년 7월 26일 월요일

ignore_older

ignore_older는 수집 대상 로그의 시간 범위를 결정할 수 있게 해준다. 그런데 filebeat의 ignore_olderwinlogbeat의 ignore_older는 좀 다르다.

filebeat

filebeat의 ignore_older는 수집 대상 파일이 수정된 시간을 검사한다. 다음은 filebeat input 설정.
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - D:\ELK\filebeat-7.12.0-windows-x86_64\logs\*
  ignore_older: 24h

2021년 7월 20일 화요일

Splunk의 lookup

네트워크 사용 이벤트(eventid: 5156)와 sysmon의 프로세스 실행 이벤트(eventid: 1) 조인 결과는 이렇다.


2021년 7월 19일 월요일

enrich processor

다음은 네트워크를 사용하는 프로세스 현황. 고작 1시간짜리 데이터인데 프로세스별 현황 파악이 쉽지 않다. 프로세스 범주를 좁힐 수는 없을까? 개발사별로 묶으면 딱인데. 하지만 네트워크 사용 이벤트(eventid: 5156)는 프로세스 개발사 정보를 가지고 있지 않다.
 

2021년 6월 24일 목요일

도메인 정규화 Processor: registered_domain

상태를 쪼개면 쪼갤수록 그 상태에 대해서 더 잘 알게 된다. 도메인 정보도 마찬가지. 그래서 엘라스틱은 서브 도메인과 상위 도메인을 쪼개주는 registered_domain processor를 제공한다. 다음은 beat processor 설정.
processors:
  - include_fields:
      fields: [ "winlog.event_data.QueryName", "winlog.event_id" ]
  - registered_domain:
      field: winlog.event_data.QueryName
      target_field: top_url
      target_etld_field: root_url
      target_subdomain_field: sub_url

2021년 6월 20일 일요일

Splunk 시계열 차트와 timezone

스플렁크에서 시계열 차트를 그릴 땐 주로 timechart 명령을 사용한다. 시간 필드가 X축으로 자동 지정되기 때문에 편함.

Asia/Seoul 시간대

2021년 6월 13일 일요일

엘라스틱 Runtime field - 2nd

엘라스틱이 7.12 버전부터 읽기 스키마를 사용하는 런타임 필드를 지원하더니


2021년 6월 10일 목요일

Winlogbeat 7.13의 변화

다음은 7.12 버전의 input 설정.
winlogbeat.event_logs:
  - name: 'D:\eventlog\sample.evtx'
    processors:
      - script:
          lang: javascript
          id: sysmon
          file: ${path.home}/module/sysmon/config/winlogbeat-sysmon.js

2021년 6월 8일 화요일

대중의 직관

복잡계를 연구하는 수학자 존 L 캐스티의 2010년 저서. '사건이 분위기를 만든다'는 사회 통념(?)에 반하는, '분위기가 사건을 만든다'는 게 이 책의 주제.

일단 이 책은 거시경제학을 창시한 존 메이너드 케인즈로 시작한다. 케인즈 경제 이론의 기본 개념은 다음과 같다. (19페이지)

1. 외부 '충격 '은 없다: 오늘날 경제시장을 난타하는 폭풍우는 금융제도 자체... 시장의 안전성 자체가 불안정성의 불씨...

2. 네트워크: 사회는 여러 집단으로 구성... 사회는 '구구단 표의 항목들이 아니다. ' 이는 '동물적 감각'을 다르게 설명한 것...
(다양한 변수들의 복잡한 상호작용이 특징인 복잡계 사회는 이성적으로 설명하기 힘든 변화를 보일 때가 많다는 것. 저자는 이 부분에 꽂힌 듯)

2021년 5월 20일 목요일

2021년 5월 19일 수요일

Splunk의 대소문자 구분

스플렁크는 대소문자를 구분한다고 했는데 딱 하나 예외상황이 있다. 바로 search 명령을 사용할 때. 다음은 특정 index, EventCode, process_name 조건의 검색 결과. 소문자를 검색해도 대문자 검색 결과를 얻을 수 있다.


2021년 5월 9일 일요일

2021년 5월 7일 금요일

머신러닝의 한계?

십억 단위의 숫자에서 사람은 알아차리기 어려운 몇 만 단위의 크기 차이를 기계는 알아차릴 수 있을까?


2021년 5월 6일 목요일

데이터 시인성 - 3rd

다음은 root 사용자의 IP별 접속 현황. 5월 14~16일 및 6월 12일의 IP 변화가 눈에 띈다.


2021년 4월 28일 수요일

Winlogbeat의 powershell 이벤트 연동

winlogbeat는 powershell 이벤트 로그 연동을 기본 지원한다. 그런데 데이터가 안 들어옴.


2021년 4월 19일 월요일

Filebeat: mapper_parsing_exception

시계열 분석 기반이 마련됐으면 분석다운 분석을 위해 나머지 데이터도 성격별로 분리를 해보자.


2021년 4월 18일 일요일

Filebeat의 processors

filebeat의 system 모듈은 윈도우에서 동작하지 않는다. system 모듈이 처리하는 messages나 secure 로그는 윈도우랑 관계가 없기 때문인 듯. 쓸 데 없이 엄격하네

모듈 처리를 못하니 로그스태시로 보내든가, 직접 처리해야 한다. 로그스태시는 실컷 써봤으니 로그스태시 필터 역할을 하는 filebeat의 processors 옵션을 사용해보자. 다음은 input 설정.
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - d:\test.log

2021년 3월 29일 월요일

엘라스틱 Runtime field

흔히들 엘라스틱은 쓰기, 스플렁크는 읽기 스키마라고 하는데 이제 엘라스틱도 읽기 스키마를 지원한다. 스키마 구조를 디스크에 써야만 읽을 수 있으면 쓰기 스키마(전통적인 RDB 방식), 디스크에 쓰지 않고도 읽을 수 있으면 읽기 스키마. 

스플렁크 문서를 보면 search-time field, index-time field란 용어가 자주 나오는데, srarch-time field에 해당하는 것이 엘라스틱의 런타임 필드. 사례를 보자. 다음은 timestamp만을 추출하는 필터 설정.
filter {
 mutate { remove_field => [ "path", "host", "@timestamp", "@version" ] }
 grok { match => { "message" => "^(?<timestamp>.{15})" } }
 date {
  match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  remove_field => "timestamp"
 }
}

2021년 3월 18일 목요일

Splunk의 Join

스플렁크는 조인 기능을 지원한대서 써보는 중인데 진짜 된다. 일단 Sysmon 이벤트 중 네트워크 연결(eventcode=3) 이벤트 발생 통계.
index=sysmon EventCode=3
| stats count as sysmon_count by img_name
| sort sysmon_count desc

① sysmon 인덱스에서 eventcode=3인 데이터만 불러온 후,
② img_name(프로세스)별로 집계한 다음,
③ 내림차순으로 정렬해주는 SPL(Search Process Language) 쿼리문을 사용했다.

2021년 3월 8일 월요일

카프카와 로그스태시 연동 시 참고

로그스태시 장애 발생 시 데이터 유실을 방지하기 위해 카프카를 많이 쓰는 듯하다. 그런데 카프카는 데이터를 보낼 때 직렬화(?) 과정을 거친다고.

Filebeat > Logstash
input {
 beats {
  port => 5044
 }
}

output {
 stdout {}
}

2021년 3월 4일 목요일

Splunk의 데이터 전처리 자동화

다음은 Filebeat의 아파치 모듈을 이용한 웹로그 연동 결과. URL과 변수가 포함된 URI 필드(url_original)가 보인다.


2021년 2월 23일 화요일

Filebeat의 데이터 전처리 자동화

엘라스틱은 로그스태시 없이도 데이터를 연동할 수 있는데, 이미 살펴본 Upload a file을 제외한 나머지 두 기능은 모두 Beat 에이전트를 이용한다. 


2021년 2월 22일 월요일

데이터 분석이 쉬워지는 비법 - 2nd

종종 데이터 전처리를 쉽게 또는 자동으로 해주는 기능 없냐는 질문을 받을 때가 있다. 그런 기능 비슷한 게 있긴 있다. (Machine Learning > Data Visualizaer > Import data)


2021년 2월 8일 월요일

Elasticsearch SQL - 2nd

엘라스틱이 sql을 지원하기 시작한지 꽤 됐는데 조인은 아직이다. 


2021년 2월 7일 일요일

Logstash 필터 date - 3rd

간단한 파이프라인 설정.
filter {
 mutate { remove_field => [ "@timestamp", "@version", "path", "host" ] }
 dissect { mapping => { "message" => "%{timestamp} %{+timestamp} %{}" } }
 date { 
  match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ] 
  remove_field => "timestamp" 
 }
}

2021년 1월 24일 일요일

가치관의 탄생 - 시대의 필요가 우리의 생각을 정한다

경제학자 같은 역사학자 이언 모리스의 2015년작. 문명사를 해석하는 빅히스토리 계열인데 '총균쇠'나 '사피엔스'에 비해 잘 읽히지는 않는다. 가치관이란 주제는 좀 어려운 듯.

가치관은 어떻게 탄생했을까? 일단 저자는 가치관의 범위를 '정치적, 경제적, 성별 위계(수직적 불평등)와 폭력에 대한 태도'로 제한한다. (25페이지)

그리고 인류사의 발전 과정을 에너지(칼로리) 획득 방식에 따라 수렵채집, 농경, 화석연료 단계로 나누고, 각 단계별 에너지 획득량의 증가와 함께 가치관도 변해왔다고 주장한다.

내용을 살펴보면,

수렵채집 가치관: 위계보다 평등을 중시하고, 폭력에 관대하다 (대략 20만 년 지속)

2021년 1월 21일 목요일

Sysmon을 이용한 DNS 트래픽 추적

다음은 winlogbeat의 sysmon 이벤트 모듈 설정 내역. dns 관련 정보가 보인다. sysmon이 dns 이벤트를 기록했었나?


2021년 1월 14일 목요일

Logstash 필터 mutate - 3rd

데이터 분석 수준을 높이려다 보면 하나의 데이터를 이렇게도 바꿔보고, 저렇게도 바꿔보는 과정을 거치게 되는데, 이때 보통은 원본을 보존하기 위해 복사본을 사용한다.

filter {
 mutate { 
  copy => { "원본" => "복사본" }
 }
}

다음은 테스트 파이프라인과 실행 결과.

2021년 1월 12일 화요일

2021년 1월 1일 금요일

2020년에 있었던 일

작년 말쯤, 내년은 쥐의 해라며 은근 2020년을 기대했었다. 하지만 상상도 못한 코로나(..) 

크리에이티브 커먼즈 라이선스