회사의 모든 서비스에 대한 보안 로그를 엘라스틱서치에 저장해서. 현재 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 구축을 계획하고 계신 분들에게 이 글이 작게나마 도움이 되기를 바랍니다.
엘라스틱의 경우, 처음부터 잘 계획해서 구성해야 나중에 발생할 수 있는 여러 가지 문제점들을 줄일 수 있습니다. 그 이유는 서비스 중에 콘텐츠의 내용을 바꾸거나 새로운 기능을 추가할 경우 여러 가지 사항을 고려해야 하므로 처리가 복잡해지기 때문입니다.
답글 남기기