kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Cyber Security

[ELK] Elastic Stack(Filebeat, Logstash, Elasticsearch, Kibana) 구성 실습 (진행중)

까마기 2020. 12. 2. 13:57
반응형

로그 분석 및 시각화를 위해 ELK Stack(Elasticsearch, Logstash, Kibana + Filebeat)를 구성해보았다.

Elastic Stack이란 사용자가 서버로부터 원하는 모든 유형의 데이터를 수집하여 실시간으로 데이터 검색, 분석 및 시각화하여 업무에 활용할 수 있는 Elastic의 오픈소스 서비스이다.

ex) Elastic Stack = Elastic Search + Logstash + Kibana + Beats

→ influxDB + Grafana와도 비슷한 느낌의 서비스.

* Beats란?

- 데이터 수집기이다. ex) Filebeat / Metricbeat, Packetbeat, Winlogbeat 등 지원

- Fabric 네트워크의 로그는 파일 형태로 저장되기 때문에 로그 수집을 위해서 Filebeat가 필요하다.

Logstash
다양한 플러그인을 이용하여 데이터 집계 및 보관, 서버 데이터 처리
파이프라인으로 데이터를 수집하여 필터를 통해 변환 후 Elastic Search로 전송
Elastic Search
루씬 기반의 Full Text로 검색이 가능한 오픈소스 분석엔진
주로 REST API를 이용해 처리
대량의 데이터를 신속하고 거의 실시간으로 저장, 검색 및 분석 가능
Kibana
데이터를 시각화해주는 도구

 

Elatic Stack의 구조 [https://cloud-img.hosting.kr 참고]

 

Elastic Stack 개요

마스터 노드는 3대 이상 필요

REST API를 지원

로그인 관리나 보안쪽은 엔터프라이즈용을 구매해야 사용가능. 최근에 구글에서 무료로 오픈소스를 공개함. 연결해서 사용 가능.(Open Distro)

  • Beats : 데이터 수집기 e.g. Filebeat, Metricbeat, Packetbeat, Winlogbeat, etc (Fabric 네트워크의 로그는 파일 형태로 저장되기 때문에 Filebeat이 필요)

  • Logstash : 전처리 (Elasticsearch도 전처리가 가능하긴 하지만 부담이 되기 때문에 따로 처리)

  • Elasticsearch : 검색 및 분석 엔진

  • Kibana : 대시보드. 단순히 지켜보는것 뿐만 아니라 작업이 가능

Beats와 Logstash 사이에 Kafka를 사용하기도 함

Beats는 데이터를 수집하다가 오류가 나면 해당 위치에서 멈춰있다가 오류가 해결되면 해당 위치에서부터 다시 전송을 시작하기 때문에 딜레이가 걸릴 수 있음. Kafka를 이용해서 이런 문제를 해결 가능.

Elastic XPack이 엔터프라이즈용

Elastic Search는 7.x까지 나오긴 했는데, 아직 6.x를 쓰는 걸 권장 (Open Distro에서 아직 7.x를 지원하지 않음)

Elastic Search의 버전을 지정하면 Beats, Logstash, Kibana 등을 동일한 버전으로 맞춰줘야함

JDK는 Java 8 이상

클러스터에 노드를 추가할 때 마스터 노드 정보만 입력하면 알아서 설정됨.

 

Filebeat/Logstash/Elasticsearch 구성(Getting started with the Elastic Stack)

※ Elastic Stack은 자바로 구현 → 충분한 메모리 필요

Java 설치 링크 참고 : kkamagistory.tistory.com/1007

 

debian docker에 jdk 설치하기

windows10에서 debian docker를 운영하고 있는데, jdk 패키지를 설치할 일이 생겼다. apt-get 패키지 다운로드 하여 설치하려고 했으나, 저장소 관련 에러가 계속 발생하여 소스 설치하기로 하였다. apt-get

kkamagistory.tistory.com

* elasticsearch : 9200, 9300 / logstash : 5000, 9600  / kibana : 5601

Elastic Search 구성

1) elasticsearch / logstash / kibana download

* 공식 사이트에서 deb 패키지로 다운로드 및 설치

# dpkg -i 패키지명.deb

2) 구동

service elasticsearch start

service kibana start

service logstash start

# 구동 여부 확인 (ps -ef / netstat / curl 등으로 확인)
ex)
curl http://127.0.0.1:9200

ps -ef | grep kibana

  • cluster.name : 클러스터 이름

  • node.name : 노드 이름

  • path.data : 인덱스 경로 지정, 미설정 시에 기본 값은 ES밑 data 디렉토리에 인덱스 생성

  • path.logs : 로그를 저장할 경로 지정

  • path.repo : ES 인덱스 백업을 위한 스냅샷의 경로 지정

  • network.host : 접속 허용할 IP를 설정 / 0.0.0.0 은 모든 접근을 허용 | 127.0.0.1은 개발모드에서 프로덕트 모드로 변경

  • http.port : 엘라스틱서치 서버에 접근할 수 있는 HTTP API 호출을 위한 포트번호 설정 / 기본 값은 9200

  • transport.tcp.port : 엘라스틱서치 클라이언트가 접근할 수 있는 TCP 포트, 기본 값은 9300

  • discovery.zen.ping.unicast.hosts : 노드가 여러개인 경우 유니캐스트로 활성화된 다른 서버를 찾음. 노드의 아이피를 [1.1.1.1, 2.2.2.2]와 같은 형식으로 넣어주면 된다.

  • discovery.zen.minimum_master_nodes : 마스터 노드의 선출 기준이 되는 노드의 수를 지정.

  • node.master : 마스터 노드로 동작 여부를 지정 true or false

  • node.data : 데이터 노드로 동작 여부를 지정 true or false

Kibana 구성

Host에서 접속하기 위해 Binding Host 주소 변경

vi /etc/kibana.yml

server.host 설정

server.host: "0.0.0.0"

http://ip:5601

[kibana dashboard login]

 

kibana 설치 폴더/config/kibana.yml

 

## X-Pack security credentials

#

 

elasticsearch.username: elastic

elasticsearch.password: changeme

Beats 구성

chown -R root:root . (소유권 변경-실행 계정과 소유 계정이 동일하도록. 그렇지 않을 경우 오류 발생)

Kibana Dashboard(metricbeat) 초기화 - 템플릿 로드

sudo ./metricbeat setup -e

sudo ./metricbeat -e

Kibana Dashboard(metricbeat) 초기화(템플릿 로드)metricbeat 구동

Kibana Dashboard에서 'system'을 검색하면 다양한 템플릿이 뜸.

Logstash 구성

deb 패키지로 설치가 제대로 안되어 apt-get을 이용하여 설치 (www.elastic.co/guide/en/logstash/7.10/installing-logstash.html)

logstash-sample.conf를 conf.d에 복사

구동하기 (www.elastic.co/guide/en/logstash/7.10/first-event.html)

Path 추가

ex) ./bin/logstash -f config/logstash.conf

logstash -f 

filebeat 설치 및 세팅

docker container로 동작중인 nginx에 대하여 elasticsearch를 통해 로그 수집을 하고  kibana 대쉬보드로 구현하고자 docker 상에 filebeat 설치를 진행해보자.

1. filebeat download

https://www.elastic.co/kr/downloads/beats/filebeat

'DEB 64-BIT sha asc' 부분을 마우스 우클릭 후 링크주소를 복사하여 다운로드를 진행한다.

 

# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-amd64.deb

 

Docker 컨테이너의 로그를 수집하기 위해 filebeat을 구성합니다. (Docker 컨테이너의 로그는 파일로 저장되기 때문에 filebeat이 필요)

[root@ip-192-168-3-51 ec2-user]# filebeat modules enable system nginx mysql

Enabled system

Enabled nginx

Enabled mysql

 

# filebeat modules list

 

 

https://www.elastic.co/kr/downloads/kibana

https://www.elastic.co/kr/downloads/elasticsearch

https://www.elastic.co/kr/downloads/logstash

filebeat.yml 작성

# https://github.com/rmalchow/docker-json-filebeat-example

filebeat.autodiscover:

providers:

- type: docker

hints.enabled: true

json.message_key: log

templates:

- condition:

equals:

docker.container.labels.filebeat_enable: "true"

config:

- type: docker

containers.ids:

- "${data.docker.container.id}"

json.keys_under_root: true

json.add_error_key: false

processors:

- add_cloud_metadata: ~

- add_docker_metadata: ~

output.logstash:

hosts: ["${LOGSTASH_HOST}"]

filebeat의 정상 실행을 위해 설정 파일의 소유권과 권한을 변경합니다.

# 소유권 및 권한 변경

sudo chown root:root filebeat.yml

sudo chmod go-w filebeat.yml

filebeat을 docker로 실행하기 위해 docker-compose 파일을 작성합니다. byfn 네트워크의 로그를 수집해야하기 때문에 networks는 byfn으로 설정합니다.

# docker-compose 설정 파일

vi docker-compose-filebeat.yml

docker-compose-filebeat.yml 파일을 다음과 같이 작성합니다.

version: '2'

 

networks:

byfn:

 

services:

filebeat:

image: docker.elastic.co/beats/filebeat:6.7.2

container_name: filebeat

hostname: filebeat # Docker Hostname

environment:

- LOGSTASH_HOST=node1:5044 # Logstash Host(extra_hosts에서 정의한 node1의 IP로 연결)

user: root # root 계정 필요

volumes:

# Filebeat 설정 파일

- ./filebeat.yml:/usr/share/filebeat/filebeat.yml

# for accessing docker

- /var/run/docker.sock:/var/run/docker.sock

- /var/lib/docker/containers/:/var/lib/docker/containers/:ro

extra_hosts:

- "node1:192.168.133.129" # Logstash Host IP(자신의 IP 주소에 맞게 설정. ex: 192.168.133.129)

networks:

- byfn

extra_hosts의 node1의 IP 부분에는 Logstash가 실행중인 호스트의 IP를 적어줍니다. (※ Docker 컨테이너로 실행하기 때문에 127.0.0.1 등으로 설정할 수 없습니다.)

이제 filebeat을 구동합니다.

# 구동

docker-compose -f docker-compose-filebeat.yml up

filebeat 구동

 

byfn 네트워크와의 연결

peer, orderer의 로깅 형식을 json으로 변경합니다.

참고 - https://hyperledger-fabric.readthedocs.io/en/release-1.4/logging-control.html#overview

/opt/gopath/src/github.com/hyperledger/fabric-samples/first-network/base/peer-base.yaml 파일안에 services/peer-base/environment, services/orderer-base/environment 에 추가하세요!

environment:

- FABRIC_LOGGING_FORMAT=json

 

peer, orderer 로깅 형식 변경

# byfn 네트워크 실행

cd /opt/gopath/src/github.com/hyperledger/fabric-samples/first-network

./byfn.sh up

Kibana 웹 페이지 > Management > Index Patterns > Create index pattern을 클릭해 docker_log_index를 추가합니다.

  • Index pattern : docker_log_index-*

  • Time Filter field name : @timestamp

index pattern 생성(docker_log_index-*)

이제 Discover 메뉴에서 docker_log_index에 대한 내용을 확인할 수 있습니다

 

 

packetbeat 설치 및 실행

https://brunch.co.kr/@alden/31

https://www.elastic.co/guide/en/beats/packetbeat/current/packetbeat-starting.html

(생략)

packetbeat setup -e \

  -E output.logstash.enabled=false \

  -E output.elasticsearch.hosts=['192.168.13.140:9200'] \

  -E output.elasticsearch.username=packetbeat_internal \

  -E output.elasticsearch.password=YOUR_PASSWORD \

  -E setup.kibana.host=192.168.13.140:5601

 

 

 

 

# wget https://artifacts.elastic.co/downloads/beats/packetbeat/packetbeat-7.2.0-amd64.deb

# wget https://artifacts.elastic.co/downloads/beats/packetbeat/packetbeat-7.2.1-x86_64.rpm

 

 

#dpkg -i packetbeat-7.2.0-amd64.deb

 

#vi /etc/packetbeat/packetbeat.yml

 

- type: http

  # Configure the ports where to listen for HTTP traffic. You can disable

  # the HTTP protocol by commenting out the list of ports.

  ports: [80, 8080, 8000, 5000, 8002]

  real_ip_header: "X-forwarded-For"

 

- type: tls

  # Configure the ports where to listen for TLS traffic. You can disable

  # the TLS protocol by commenting out the list of ports.

  ports:

    - 443   # HTTPS

    - 993   # IMAPS

    - 995   # POP3S

    - 5223  # XMPP over SSL

    - 8443

    - 8883  # Secure MQTT

    - 9243  # Elasticsearch

  real_ip_header: "X-forwarded-For"

 

#======= Elasticsearch template setting =====

 

_source.enabled: true

 

========= Kibana =========

setup.kibana

host: "192.168.13.140:5601"

 

========= Outputs ==========

output.elasticsearch:

  # Array of hosts to connect to.

  hosts: ["192.168.13.140:9200"]

 

setup.dashboards.enabled: true

 

 

 

 

 

# packetbeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.13.140:9200"]'

 

# curl -XDELETE 'http://192.168.13.140:9200/packetbeat-*'

 

# packetbeat setup --dashboards

# service packetbeat start

 

 

/home/ec2-user/exchange/cilkroad_exchange_web/doc/docker/conf

 

한글형태소 분석기 플러그인 설치

 

 


 

sudo yum install libpcap

curl -L -O https://artifacts.elastic.co/downloads/beats/packetbeat/packetbeat-7.2.0-x86_64.rpm

packetbeat http traffic capture 세팅

packetbeat.protocols:

- type: http

ports: [80, 8080, 8000, 5000, 8002]

hide_keywords: ["pass", "password", "passwd"]

send_headers: ["User-Agent", "Cookie", "Set-Cookie"]

split_cookie: true

real_ip_header: "X-Forwarded-For"

 

로그 연동

1. csv to logstash

 

2. postgresql db to logstash

* jdbc 드라이버 다운로드 (bitnine.net/drivers-for-developer/)

* logstash 경로에 복사 (/etc/logstash/conf.d/)

참고 : m.blog.naver.com/PostView.nhn?blogId=xomyjoung&logNo=221635765087&targetKeyword=&targetRecommendationCode=1

 

[자기개발/엘라스틱서치(elasticsearch)-#02-02 끝] Logstash 연동하기(PostgreSql -> ELK)

방금전, AgensGraphDB(postgresql)을 설치 했습니다. https://blog.naver.com/xomyjoung/221635615291...

blog.naver.com

 

# logstash --path.settings /etc/logstash

* multiple pipeline 설정

www.slipp.net/wiki/pages/viewpage.action?pageId=30771923

 

* enable elasticsearch security 설정 www.elastic.co/guide/en/elasticsearch/reference/7.10/get-started-enable-security.html?blade=kibanasecuritymessage

 

* Elastic SIEM 세팅 - Elasticsearch 인증 구성 및 TLS 암호화 / HTTPS 활성화

참고 : 

techexpert.tips/ko/%ED%83%84%EC%84%B1-%EA%B2%80%EC%83%89/%ED%83%84%EB%A0%A5%EC%A0%81-%EA%B2%80%EC%83%89-tls-%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%8F-https-%ED%86%B5%EC%8B%A0-%EC%82%AC%EC%9A%A9/

itnext.io/how-to-elastic-siem-part-2-bf0940f745e5

techexpert.tips/ko/%ED%83%84%EC%84%B1-%EA%B2%80%EC%83%89/%EC%9D%B8%ED%83%80%EC%A0%81-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9D%B8%EC%A6%9D-%EC%82%AC%EC%9A%A9/

 

 

# vi /etc/kibana/kibana.yml

 

 

service elasticsearch stop

 

https 통신을 위해 인증서를 만듬

ca(자체 서명된 인증기관) 경로(/usr/share/elasticsearch/elastic-stack-ca.p12) 만 입력 후 나머지는 ENTER

-> 암호, DNS 및 IP 주소 설정은 사용하지 않았으며,이 전에 만든 자체 서명된 인증 기관을 사용.

인증서를 적절한 디렉터리로 복사하고 올바른 사용 권한을 설정.

 

 

 

 

 

logstash filter 예제 - http://kangmyounghun.blogspot.com/2017/06/elasticsearch-grok.html

filter  정규표현식 모음 - https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

kibana query - https://www.elastic.co/guide/en/beats/packetbeat/current/kibana-queries-filters.html

https://brunch.co.kr/@ddangdol/18

logstash filter 예제 - https://www.popit.kr/logstash-%ED%95%84%ED%84%B0-grok-%ED%8A%B9%EC%A7%95-%ED%95%98%EB%82%98/

grok filter github - https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

filebeat와 logstash - https://dgkim5360.tistory.com/entry/managing-multiple-heterogeneous-inputs-on-filebeat-and-logstash

ELK Stack을 이용한 로그 관제 시스템 만들기 - https://medium.com/day34/elk-stack%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8-%EA%B4%80%EC%A0%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-ca199502beab

logstash filter nginx geoip - https://cyuu.tistory.com/112

정규표현식 테스트 사이트 - https://regex101.com/

logstash filter 예제 - elasticsearch 사이트 - https://www.elastic.co/guide/en/logstash/current/logstash-config-for-filebeat-modules.html

kibana 세팅 예제 - https://blog.kollus.com/?p=1249

ELK 실습 잘나온것 - https://www.slipp.net/wiki/pages/viewpage.action?pageId=30771923

 

Logstash 실습하기 - SLiPP 스터디 - SLiPP::위키

Logstash 실습 Logstash 설치는 이전 시간에 했으니, 건너뛰도록 하겠습니다. 혹시라도 설치가 안되신분들은 Logstash 설치에서 설치하시면 됩니다. > 실습에 앞서 "Elasticsearch"와 "Kibana"를 먼저 시작해

www.slipp.net

* ELK Stack 기본 개념 잡기 victorydntmd.tistory.com/308

 

반응형