로그 분석 및 시각화를 위해 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
데이터를 시각화해주는 도구
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
* 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/)
# 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 활성화
참고 :
itnext.io/how-to-elastic-siem-part-2-bf0940f745e5
# 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
* ELK Stack 기본 개념 잡기 victorydntmd.tistory.com/308
'Cyber Security' 카테고리의 다른 글
모바일 취약점 진단 / 이미지덤프(fridump) (0) | 2020.12.03 |
---|---|
Suricata IDS/IPS + ELK (0) | 2020.12.02 |
NAC 접근통제 (0) | 2020.11.25 |
TMS(Threat Management System, 위협 관리 시스템) 이란? (0) | 2020.11.24 |
SQL INJECTION - Prepared statement 환경에서의 취약점 진단 (0) | 2020.10.26 |