로그 관제의 용이성을 높이기 위해서 ELK와 연동시킨다.
실시간으로 수집되는 로그가 많기 때문에 ES를 Cluster구성하는 것을 추천한다.
Docker Compose로 ES 클러스터 구성
호스트 커널의 vm.max_map_count
수 확인
262144
이상이어야 한다.> sysctl vm.max_map_count
vm.max_map_count = 65530
> sysctl -w vm.max_map_count=262144
ES를 Swarm모드로 변경
elasticsearch의 environment에
vi docker-stack.yaml
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
ports:
- "9200:9200"
- "9300:9300"
configs:
- source: elastic_config
target: /usr/share/elasticsearch/config/elasticsearch.yml
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
ELASTIC_PASSWORD: Dpffprkdtmgkek!
# Use single node discovery in order to disable production mode and avoid bootstrap checks
# see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
################
# ES Swarm Mode
# ##############
node.name: elk_elasticsearch.{{.Task.Slot}}
discovery.type: ''
network.publish_host: _enp2s0f0_
discovery.seed_hosts: tasks.elasticsearch
cluster.initial_master_nodes: elk_elasticsearch.1,elk_elasticsearch.2,elk_elasticsearch.3
networks:
- elk
deploy:
mode: replicated
replicas: 1
포트매핑 & 디스크 볼륨 지정
vi docker-compose.yaml
version: '3.2'
services:
elasticsearch:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./elasticsearch/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: elasticsearch
target: /usr/share/elasticsearch/data
ports:
- "9200"
- "9300"
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
ELASTIC_PASSWORD: Dpffprkdtmgkek!
# Use single node discovery in order to disable production mode and avoid bootstrap checks
# see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
discovery.type: single-node
node.max_local_storage_nodes: '3'
networks:
- elk
Elasticsearch Scale out
docker-compose up -d --scale elasticsearch=3
Suricata 데이터 추가
Suricata는 Kibana에서 기본적으로 제공해주는 로그 템플릿이 존재하기 때문에 이를 사용한다.
Filebeat 설치
클릭하면 Filebeat을 설치하라고 나오는데 Filebeat은 파일에 저장되는 실시간 로그를 Logstash로 전달해주는 서비스이다.
친절하게 가이드가 나와있으니 가이드대로 설치하면 된다.
# 1. filebeat 설치
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.0-amd64.deb
sudo dpkg -i filebeat-7.10.0-amd64.deb
# 2. filebeat 설정파일 수정
vi /etc/filebeat/filebeat.yasml
# Elasticsearch와 Kibana의 정보를 입력
output.elasticsearch:
hosts: ["localhost:9200"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "localhost:5601"
# 3. suricata의 모듈 활성화
filebeat modules enable suricata
# 4. filebeat 실행
filebeat setup -e
service filebeat start
대시보드 확인
좌측 Kibana 메뉴에서 Dashboard 메뉴를 클릭하게되면 [Filebeat].. 이름의 수많은 대시보드들이 생성되어있는 것을 확인할 수 있다.
Suricata로 검색하면 Suricata의 대시보드를 확인할 수 있다.
Alert
' 인 대시보드이고 Events는 eve.json에서 발생하는 모든 로그가 기록된다.해당 대시보드로 들어가게 되면 그 동안 수집된 로그들을 확인할 수 있다.
이렇게 대시보드 연동하는 작업을 해보았는데 중요한점은 Suricata로 수집되는 실시간 로그가 지나치게 많으면 ES에 가해지는 부하량이 올라가고 ES의 성능이 중요해진다. 필요한 로그만 수집할 수 있도록 필터링을 걸거나, ES의 성능을 높이거나 해야한다.
> docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
0e30b9638f63 docker-elk-kor_logstash_1 2.24% 608.2MiB / 11.71GiB 5.07% 70.7kB / 413kB 0B / 16.3MB 99
14ec7320c48d docker-elk-kor_kibana_1 0.83% 261.3MiB / 11.71GiB 2.18% 105MB / 24.6MB 172kB / 0B 12
5f18ca840b74 docker-elk-kor_elasticsearch_1 4.66% 2.81GiB / 11.71GiB 24.00% 406MB / 93.8MB 19.5MB / 1.08GB 178