Elastic SIEM – 역시 기대를 저버린다.

시그널 92개에 브라우저가 죽을려고 한다. 크롬을 쓰고 있는데도 이러면 IE에서는 동작도 안할 것 같다. 역시 ELK는 오픈소스라서 QC를 제대로 거치지 않고 나오는것 같다. SIEM에서 사용하는 Alert는 Elasticsearch에서 동작하는게 아니라 Kibana에서 동작한다. 그래서 Kibana 프로세스가 죽으면 동작하지 않게 된다.

SIEM 운영자 입장에선 이건 납득 못하는 구조다.

이걸 쓸바엔 https://github.com/GamjaPower/ELP 이걸 조금 더 개선시키는게 좋을것 같다.

하지만, ECS는 너무 잘 만들었다. 게다가 filebeat에서 알아서 필드 표준화까지 해준다.

Filebeat로 fortinet 장비 로그 수집하기

최근 버전에서 Filebeat에서 fortinet 장비 로그를 수집할 수 있는 모듈이 추가되었습니다.

7.8.0에는 기본 포함되어 있고, 그 이하 버전에서도 아래 두개 디렉토리만 복사하면 사용할 수 있습니다.

modules.d/fortinet.yml, module/fortinet

파일비트 다운로드 및 설치
이 부분은 워낙 많이 자료가 많이 나와 있어서 생략하겠습니다.

  • filebeat의 output 설정

  • filebeat의 kibana 설정

  • modules.d/fortinet.yml 파일 수정

  • filebeat modules list

설치된 모듈 리스트에서 fortinet이 활성화 되어 있는지 확인

  • filebeat modules enable fortinet

만약 활성화되어 있지 않으면 enable 명령어로 활성화 시키면 됩니다.

  • filebeat setup -e 실행

setup을 실행하면 index template, Kibana dashboards, ingest pipelines 이 3가지를 Elasticsearch에 Load하게 됩니다.

  • filebeat -e 실행

  • 이렇게 하면 한후 포티넷 장비에서 설정을 수정하면 됩니다.

 

와우 이렇게 쉽게 수집을 할 수 있다니,, 이제 SIEM 앱에서 어떻게 보이는지 확인해봐야겠네요.

 

참고로 내 장비가 워낙 옛날꺼라 파싱이 제대로 안된다. 그래서 pipeline.yml 파일을 아래처럼 수정을 해줘야 한다. 일단 eventtime 이 없기 때문에 그부분 삭제해주고, timezone을 강제로 지정해줘버렸다.

Elastic SIEM 1차 검토 결과 – 60점 점수를 주고 싶다.

Elasitc SIEM이 Kibana에 추가되어서 이제 SIEM도 공짜로 쓸 수 있을까 싶어서 몇가지 설치하고 테스트를 해보았습니다.

설치 및 설정

  • 모든 구간에서 https 설정을 해줘야한다.
  • kibana에서 암호키를 설정해줘야 한다.
    xpack.encryptedSavedObjects.encryptionKey: ‘fhjskloppd678ehkdfdlliverpoolfcr’

위 2가지만 잘하면 SIEM 사용이 가능하다.

Timeline 기능
참 재미있는 기능을 만들었다. 실무자 입장에서 유용할 것 같다. 하나의 이벤트에 대해서 도식화가 가능하니, 이 부분도 분석에 유용할 것 같다.

 

상관분석이 안된다. 단일 인덱스에 대해서 검색이 가능하고 타 SIEM 솔루션처럼 상관분석이 안된다. 이 부분은 개발사에서 많이 개선을 해야 겠다.(개발사 사이트를 보면 상관 분석이 될 수 있도록 처음부터 데이터 구조를 변경하라고 나오는데, 흠,,, 이상한 논리다. 그래서 외산 제품이 한국에 들어와서 잘 안된다.)

 

무려 92개의 탐지 룰을 제공한다. 그래서 하나씩 보니 다들 의미는 있는 거겠지만,,, 실무에서 도움이 될까 의심스럽다.

아쉬운 점은 경보 기능이다.

무료 버전에서는 경보 기능을 사용할 수 없는 것으로 보인다. 머신러닝은 유료버전에서만 가능하지만, 경보 기능정도는 넣어줬으면 좋았겠다. 스케줄링을 통해서 탐지만 하고 경보는 못한다면 무료 버전으로 SIEM을 사용하기엔 부담이 된다.

이 부분은 ELP 제품을 사용하면 좋을 것 같다.  Splunk의 SPL처럼 복잡한 분석도 가능하고, 경보 기능도 같이 제공한다.

https://github.com/GamjaPower/ELP/

 

Elasticsearch SSL 설정 – 9200 포트에 대해서 HTTPS 설정

Elasticsearch의 내부 통신은 암호화 했는데 9200 포트에 대해서 암호화를 아직 하지 않고 있다가 이번에 하게 되었습니다.

tmp 폴더 생성 및 instance.yml 파일 생성

mkdir -p ~/tmp/cert

vi  ~/tmp/cert/instance.yml

# yml 파일에 인스턴스 정보 추가

instances:

name: ‘node01’  

  dns: [ ‘node01.bundang.house’ ]

name: “node02”  

  dns: [ ‘node02.bundang.house’ ]

 

CA 및 서버 인증서 생성

bin/elasticsearchcertutil cert ca pem in ~/tmp/cert/instance.yml out ~/tmp/cert/certs.zip

 

인증서 압축 해제 및 Elasticsearch 설정 디렉토리에 복사

mkdir -p /etc/elasticsearch/cert cp certs.zip /etc/elasticsearch/cert cd /etc/elasticsearch/cert unzip certs.zip

 

elasticsearch.yml 파일 수정

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/node01/node01.key
xpack.security.http.ssl.certificate: certs/node01/node01.crt
xpack.security.http.ssl.certificate_authorities: certs/ca/ca.crt

 

kibana.yml 파일 수정

server.name: “my-kibana”
server.host: “kibana.local”
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/config/certs/my-kibana.crt
server.ssl.key: /etc/kibana/config/certs/my-kibana.key
elasticsearch.hosts: [“https://node1.elastic.test.com:9200”]
elasticsearch.username: “kibana”
elasticsearch.password: “”
elasticsearch.ssl.certificateAuthorities: [ “/etc/kibana/config/certs/ca.crt” ]

 

참고 사이트

https://www.elastic.co/kr/blog/configuring-ssl-tls-and-https-to-secure-elasticsearch-kibana-beats-and-logstash#create-ssl

 

 

Open Distro for Elasticsearch의 구조

Open Distro for Elasticsearch는 ELK의 oss 버전의 배포판에 플러그인을 추가한 형태입니다.

그래서 auditbeat의 경우 unix의 로그 파싱하는 일부 기능이 빠져 있습니다. 간단하게 사용하실거라면 문제 없지만, 더 깊은 기능까지 사용하시려면 좀 기다려야겠네요.

 

아래는 공식 사이트에서 제공하는 설명이니 참고하세요.

Elasticsearch용 Open Distro에 포함되는 기능에 간략하게 살펴보겠습니다. 이 중 일부는 현재 Amazon Elasticsearch Service에서 사용할 수 있으며 나머지는 추후 업데이트를 통해 제공될 것입니다.

보안 – 이 플러그인은 노드 대 노드 암호화, 5가지 유형의 인증(기본, Active Directory, LDAP, Kerberos 및 SAML), 다양한 수준(클러스터, 인덱스, 문서 및 필드)의 역할 기반 액세스 제어 및 감사 로깅을 지원하며 클러스터 내의 어떤 노드도 클러스터 내의 다른 노드에 대한 검색 요청을 실행할 수 있도록 클러스터 간 검색을 지원합니다. 자세한 내용

이벤트 모니터링 및 알림 – 이 기능은 하나 이상의 Elasticsearch 인덱스가 특정 조건을 충족할 때 알림을 전송합니다. 예를 들어 애플리케이션이 한 시간에 5개가 넘는 HTTP 503 오류를 로깅하는 경우 Slack 채널에 이를 알릴 수 있습니다. 정의된 일정에 따라 실행되는 작업을 기반으로 구현되는 모니터링은 트리거 조건과 인덱스를 비교하여 조건이 트리거되었을 때 알림을 표시합니다. 자세한 내용

심층 성능 분석 – 이 기능은 REST API를 사용하여 클러스터의 수많은 성능 지표를 쿼리할 수 있게 해 줍니다. 지표는 프로그래밍적으로 액세스하거나 perf top 및 기타 perf 도구를 사용하여 시각화할 수 있습니다. 자세한 내용

SQL 지원 – 이 기능은 SQL 문을 사용하여 클러스터를 쿼리할 수 있게 해 줍니다. elasticsearch-sql 플러그인의 개선된 버전으로서 다양한 을 지원합니다.

AWS에서는 다양한 기능을 계획하고 있으며 여러분의 참여와 제안도 기다리고 있습니다! 참고로 왜 이러한 오픈소스 프로젝트를 시작하게 되었는지 자세히 알고 싶은 분은 Adrian Cockcroft의 오픈 소스가 지속되기 위한 노력 – Open Distro for Elasticsearch라는 글을 꼭 읽어보시기 바랍니다.

ELK에서 알람 기능을 무료로 사용하는 방법

ELK 무료 버전에서는 알람 기능을 사용할 수 없습니다.

만약 알람 기능을 사용하고 싶으면 X-Pack 유료 버전을 구매해야 합니다.

하지만,, Kibana는 플러그인을 마음대로 설치할 수 있습니다.

 Open Distro Alert

위 플러그인을 Kibana에 설치해서 사용하면 됩니다. 음… Open Distro 이건 아마존에서 밀고 있는 프로젝트라서 없어지진 않을 것 같습니다.

상세 설치 방법은 아래 사이트를 참고 하시면 됩니다.

참조 사이트

https://woowabros.github.io/experience/2020/01/16/set-elk-with-alarm.html

Kibana plugin 제작 – Elastic Layer for Phantom

일단 결론 부터 말씀드리면 Kibana 플러그인 형태로 개발하는 것은 아주 비효율적인 일이네요.

ELK 각 버전별로 설치파일을 만들어야 합니다. 개발자 입장에서 그리고 운영자 입장에서 이건 아주 귀찮은 일입니다.
그리고 ELK 버전 업그레이드할때 같이 업그레이드를 해줘야 합니다. 이것 또한 불편한 일입니다.

그래서 Kibana 플러그인 형태로 제공하지 않을 것입니다.

작업하면서 참고한 사이트와 작업 내용을 정리한 것입니다. 다른 작업하실때 참고하시면 될것 같네요.

플러그인을 개발하기 위해서 가장 먼저 해야할 일은 generator-kibana-plugin 를 설치하는 것입니다. 그러나,,, 최근 버전에서는 이게 안됩니다. 개발 방식이 변경되었네요.

git clone https://github.com/elastic/kibana.git
cd kibana
git checkout -b v7.8.0 v7.8.0 
nvm install "$(cat .node-version)" 
nvm use v10.21.0 
yarn kbn bootstrap 
node scripts/generate_plugin elp  
cd plugins/elp  
yarn start

 

위 명령어를 실행하고 http://localhost:5603/ 로 접속하면 생성된 플러그인을 확인할 수 있다.

 

 

참고 사이트

 

https://github.com/elastic/kibana/tree/master/packages/kbn-plugin-generator

https://www.elastic.co/kr/elasticon/conf/2016/sf/how-to-build-your-own-kibana-plugins

https://github.com/elastic/generator-kibana-plugin#getting-started

http://www.kwangsiklee.com/tag/kibana-plugin/

자바로 Hello, world! 출력하기

이번 포스트에서는 자바(Java)로 Hello, world!를 출력하는 예제를 서술해 보겠습니다.

일단 코드는 이렇게 됩니다.

package bundang.house.java;

/**
 * @author jason96
 *
 */
public class HelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        System.out.println("Hello, world!");

    }

}

public class HelloWorld를 먼저 선 그 블록 안에서 또 public static void main(String[] args) 선언을 하고 그 안에서 Hello, world! 출력 명령문을 작성하게 되어 있습니다.

System.out.println(“Hello, world!”); 핵심 코드는 이것 밖에 없는데 아래 위로 많은 코드가 있네요.

이 코드를 실행해 보려면 컴파일러 언어인 자바의 특성상 컴파일하는 과정이 필요합니다.

일단 위의 코드를 HelloWorld.java라는 파일명으로 저장한 후 CMD 창를 열어서 HelloWorld.java 코드를 저장한 디렉터리로 이동합니다.

 

javac HelloWorld.java 

오타가 없다면 HelloWorld.class 파일이 생성 됩니다. 만약 에러가 발생한다면 코드 상의 오타를 확인해보시면 됩니다.

컴파일된 HelloWorld.class 파일을 실행하기 위해서 아래 명령어를 실행하면 됩니다.

java HelloWorld

Hello, world!
이렇게 뜰 것입니다. 이러면 컴파일이 성공한 것입니다.

주의 사항으로는 public class로 선언한 클래스명과 코드의 파일 이름이 동일해야 합니다. 예를 들어 public class HiWorld { … } 이렇게 선언했으면 파일명도 HiWorld.java로 해야 합니다. 만약 클래스명과 파일명이 일치하지 않을 경우 컴파일 오류가 발생합니다.

 

 

Dataframe 메모리 사이즈 계산

Python에서 데이터 관리할때 Dataframe을 사용하는게 좋을까 아니면 Array형태가 좋을까?

그래서 직접 코드를 만들어서 계산해보니 1000만건 데이터 기준으로 Array는 78MB, Dataframe은 381MB를 차지한다. Dataframe이 무려 5배 메모리를 사용한다.

그래서 기본적으로 Array를 사용하고 필요할때만 Dataframe을 사용해야 한다.

# -*- coding: utf-8 -*-

import os
import sys
import pandas as pd

headers = ['a','b','c','d','e']
rows = []
for x in range(0,10000000):
    rows.append(['a'*5,'b'*5,'c'*5,'d'*5,'e'*5])

df = pd.DataFrame(rows, columns=headers)
print('Dataframe size : ', round(df.memory_usage().sum()/1024/1024))

with open('test_pandas.bin', 'wb') as f:
    pickle.dump(rows, f)
    
print('Binary size : ', round(os.path.getsize('test_pandas.bin')/1024/1024))

print('Array size : ', round(sys.getsizeof(rows)/1024/1024))

Dataframe size :  381MB

Binary size :  172MB

Array size :  78MB

Avoiding Split Brain

elasticsearch – 7.6.0

네트웍 단절로 클러스터내부에 여러개의 마스터 노드가 생기는 것을 방지하기 위한 방법으로 최소 마스터 노드 수를 제한해서 이 문제를 해결한다. 7 버전으로 올라오면서 이 부분을 설정안해도 알아서 되도록 변경되었다.

 

Hadoop – 2.8.1

저널노드를 사용해서 이 문제를 해결하고, 저널노드 자체 문제는 Zookeeper를 사용해서 해결한다.

 

zookeeper – 3.4.10

 

kafka – 2.12
[java]
acks – 0
[server.properties]
log.retention.hours – 24