Elasticsearch 8.5 버전 SIEM 활용시 성능 최적화 설정

회사의 모든 서비스에 대한 보안 로그를 엘라스틱서치에 저장해서. 현재 SIEM을 이용하여 운영하고 있습니다. 로그 이벤트가 계속 증가함에 따라 데이터 저장소의 용량을 늘려야 할 필요성이 생겼습니다.

 

이에 기존에 사용하던 elasticsearch 7.6 버전에서 업그레이드된 elasticsearch 8.5 버전을 새로 설치하였습니다. 프로그램을 설치하는 방법과 사용 시 주의해야 할 점 등을 알려드리겠습니다.

엘라스틱서치 패키지를 설치하는 방법은 따로 설명하지 않겠습니다. 엘라스틱 공식 홈페이지에서는 리눅스, 윈도우, 맥 등 다양한 운영체제에서 간편하게 프로그램을 설치할 수 있는 방법을 안내하고 있으니 참고하시면 도움이 될것입니다.

처음에 엘라스틱을 설치할 때 운영체제(OS) 단계에서부터 성능을 최대화하도록 설정해야 합니다. 이 점을 유념해 두시면 좋을 것 같습니다. 이유는 향후 Elasticsearch Stack 을 모두 연동한 후에 성능 최적화를 하려면 서비스 재기동은 필수이며 다양한 관점에서 어려운 부분이 많기 때문입니다. 운영체제마다 조금씩 다른 방식으로 시스템을 최적화할 수 있는데, 이 글에서는 우분투 리눅스를 기준으로 설명합니다.

 

OS Ubuntu Linux 기준 Elastic Stack 최적화 세팅

 

swapoff -a

 

cat /etc/sysctl.conf

 

vm.max_map_count = 262144
vm.swappiness=1

 

cat /etc/security/limits.conf

* soft nofile 81920
* hard nofile 81920

 

cat /usr/lib/systemd/system/elasticsearch.service

LimitMEMLOCK=infinity

 

 

elasticsearch.yml 파일 구성

 

공통 사항

 

/usr/share/elasticsearch/bin/elasticsearch-certutil cert –ca elastic-stack-ca.p12 생성 후 /etc/elasticsearch/certs 디렉터리에 복사 후 아래와 같이 elasticsearch.yml 파일 ssl 인증서 설정 부분에서 인증서 경로를 입력하면 됩니다.

 

Master Node 세팅

cluster.name: elk-cluster
node.name: “master001”
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.100.37
node.roles: [ master ]
http.port: 9200
transport.host: 0.0.0.0

discovery.seed_hosts: [“192.168.100.37”, “192.168.100.38”, “192.168.100.39”, “192.168.100.41”, “192.168.100.42”, “192.168.100.43”, “192.168.100.44”, “192.168.100.45”, “192.168.100.46”]
cluster.initial_master_nodes: [“master001”, “master002”, “master003”]

xpack.security.enabled: true

xpack.security.enrollment.enabled: true

xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12

xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
client_authentication: required
keystore.path: certs/elastic-certificates.p12
truststore.path: certs/elastic-certificates.p12

http.host: 0.0.0.0

Data Node 세팅

data node 가 추가되면 node.name, network.host를 변경하고 계속 추가하면 됩니다. 필자의 경우 data node가 총 6개로 구성.

VM 형태로 구성되어 있으며, DISK Size는 4.8T, CPU 20 Core, Memory 64G, Heap Memory 32G

cluster.name: elk-cluster
node.name: “data001”
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.100.46
node.roles: [ data ]
http.port: 9200
transport.host: 0.0.0.0

discovery.seed_hosts: [“192.168.100.37”, “192.168.100.38”, “192.168.100.39”, “192.168.100.41”, “192.168.100.42”, “192.168.100.43”, “192.168.100.44”, “192.168.100.45”, “192.168.100.46”]
cluster.initial_master_nodes: [“master001”, “master002”, “master003”]

 

xpack.security.enabled: true

xpack.security.enrollment.enabled: true

xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12

xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
client_authentication: required
keystore.path: certs/elastic-certificates.p12
truststore.path: certs/elastic-certificates.p12

http.host: 0.0.0.0

kibana.yml 설정

ssl 인증서 관련 에러가 많이 발생하였는데요 중요한 포인트는 elasticsearch.ssl.verificationMode: none 설정하면 됩니다.

 

/usr/share/kibana/bin/elasticsearch-reset-password -u kibana_system –auto <-자동으로 패스워드 생성 후 kibana.yml 환경설정 파일에 입력.

 

server.port: 5601

server.host: “192.168.100.37”

server.publicBaseUrl: “http://example.elastic.com”
elasticsearch.hosts: [ “https://192.168.100.37:9200” ]

elasticsearch.username: “kibana_system”
elasticsearch.password: “AVqfrfjv5c1D75Enu=gS”

elasticsearch.requestTimeout: 30000
elasticsearch.ssl.verificationMode: none

logging:
appenders:
file:
type: file
fileName: /var/log/kibana/kibana.log
layout:
type: json
root:
appenders:
– default
– file

pid.file: /run/kibana/kibana.pid

xpack.encryptedSavedObjects.encryptionKey: 0a4c242a877c9ad6f9ba9aaab77a6882
xpack.reporting.encryptionKey: da2e9e0b6ff6dbb5fc3e7aa9ce50a9b3
xpack.security.encryptionKey: 4ab963ec68334ab101415dd388bb58df

이 글에서 설명드린 내용은 master node 2대 + data node 6대로 구성되어있는 아키텍처를 기반으로 각 노드별 설정을 정리한 내용입니다. 로그 수집 및 유입에 대한 전처리 부분은 logstash  4대 서버로 구성되어 있음을 참고 바랍니다.

 

  • master node 리소스 : cpu 16 Core, Memory 16G (Heap 8G) , disk 30G로 구성. master001번에 kibana 인스턴스가 올라가 있습니다.
  • data node 리소스 : cpu 20 Core, Memory 64G (Heap 32G), Disk 3Tb * 6
  • logstash 리소스 : cpu 20 core, Memory 16G (Heap 8G), disk 30G

 

현재 저희 회사의 평일 기준 일일 보안 이벤트 로그 용량은 엘라스틱 인덱스 관리 페이지에서 확인해 보면 약 90GB~100GB 정도입니다. 엘라스틱서치를 이용해 SIEM 구축을 계획하고 계신 분들에게 이 글이 작게나마 도움이 되기를 바랍니다.

 

엘라스틱의 경우, 처음부터 잘 계획해서 구성해야 나중에 발생할 수 있는 여러 가지 문제점들을 줄일 수 있습니다. 그 이유는 서비스 중에 콘텐츠의 내용을 바꾸거나 새로운 기능을 추가할 경우 여러 가지 사항을 고려해야 하므로 처리가 복잡해지기 때문입니다.

 


게시됨

카테고리

작성자

태그:

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다