엘라스틱서치(Elastic) 성능 최적화 이렇게하세요
제가 근무중인 회사의 정보 보안팀에서는 전체 서비스의 보안 로그를 Elasticsearch로 색인하여 SIEM(보안 정보 이벤트 관리) 시스템을 운영 중입니다. 하지만, 로그 이벤트가 점점 증가하면서 시스템 확장이 필요해져 새로운 Elasticsearch 버전을 설치하기로 결정했습니다. 이번 포스팅에서는 설치 과정과 주요 구성 설정에 대해 정리해보았습니다.
Elasticsearch 설치 방법에 대한 세부 내용은 별도로 다루지 않겠습니다. 공식 엘라스틱 홈페이지에서 각 운영 체제(Windows, Ubuntu Linux, CentOS Linux)별로 상세하고 간편한 명령어를 활용한 설치 방법이 제공되니 참고하시면 됩니다.
OS 레벨 성능 최적화
Elasticsearch 초기 구축 시에는 운영 체제 레벨에서 성능을 최적화하는 것이 중요합니다. 여기서 소개하는 설정 방법은 Ubuntu Linux 기준이지만, 운영 체제에 따라 최적화 방법이 다를 수 있습니다. 아래는 Ubuntu 시스템 최적화를 위한 세팅입니다:
- OS 레벨에서 스왑 비활성화
swapoff -a
- Linux OS 커널 매개변수 수정
cat /etc/sysctl.conf
vm.max_map_count = 262144 vm.swappiness = 1
- Linux OS 파일 제한값 설정
cat /etc/security/limits.conf
* soft nofile 81920 * hard nofile 81920
- Elasticsearch 서비스 메모리 잠금 설정(Memory Lock)
cat /usr/lib/systemd/system/elasticsearch.service
LimitMEMLOCK=infinity
ElasticSearch 각 노드별 구성
Elasticsearch의 주요 구성은 `elasticsearch.yml` 파일을 통해 이루어집니다. 먼저, SSL 인증서를 생성한 후 이를 설정 파일에 반영해야 합니다. 인증서는 아래 명령으로 생성하며, 파일을 `/etc/elasticsearch/certs` 디렉터리에 저장합니다:
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
그 후, 인증서 경로를 `elasticsearch.yml` 파일 내 SSL 섹션에 추가 설정하면 됩니다.
Master Node 구성
Master 노드는 클러스터 관리 역할을 하므로 리소스가 지나치게 높을 필요는 없습니다.
cluster.name: elk-cluster
node.name: "master001"
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.100.120.37
node.roles: [ master ]
http.port: 9200
transport.host: 0.0.0.0
discovery.seed_hosts: ["10.100.120.37", "10.100.120.38", "10.100.120.39", "10.100.120.41", "10.100.120.42", "10.100.120.43", "10.100.120.44", "10.100.120.45", "10.100.120.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
- CPU: 16 Core
- Memory: 16GB (Heap Memory: 8GB)
- Disk: 30GB
Master Node 중 하나에는 Kibana 인스턴스를 함께 배치하여 사용 중입니다.
Data Node 구성
Data Node는 로그 데이터를 저장하고 처리하는 역할을 맡습니다. 필자의 경우 총 6개의 Data Node를 운영 중이며 아래와 같이 리소스를 배치했습니다.
cluster.name: elk-cluster
node.name: "data001"
path.data: /data/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.100.120.46
node.roles: [ data ]
http.port: 9200
transport.host: 0.0.0.0
discovery.seed_hosts: ["10.100.120.37", "10.100.120.38", "10.100.120.39", "10.100.120.41", "10.100.120.42", "10.100.120.43", "10.100.120.44", "10.100.120.45", "10.100.120.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
- Disk: 3.5TB x 6
- CPU: 20 Core
- Memory: 64GB (Heap Memory: 32GB)
Data Node 추가 시에는 `node.name`과 `network.host` 등 핵심 설정을 수정합니다.
Logstash 구성
로그 전처리 작업은 4대의 Logstash 서버로 분산시킵니다.
- Disk: 50GB
- Memory: 16GB (Heap Memory: 8GB)
- CPU: 18Core
에러 해결 및 기타 설정
SSL 관련 에러가 자주 발생하는 경우, 설정 파일에서 아래 옵션을 적용하면 문제를 완화할 수 있습니다.
elasticsearch.ssl.verificationMode: none
Kibana 시스템에서 패스워드를 재설정하려면 다음 명령어를 실행해 자동으로 생성된 비밀번호를 Kibana 설정 파일에 반영합니다.
server.port: 5601
server.host: "10.100.120.37"
server.publicBaseUrl: "http://example.elastic.com"
elasticsearch.hosts: [ "https://10.100.120.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
/usr/share/kibana/bin/elasticsearch-reset-password -u kibana_system --auto
운영 환경 및 로그 데이터 규모
지금 저희 회사에서는 Master Node 2대와 Data Node 6대를 기반으로 아키텍처를 구축했으며, Logstash 서버까지 포함하여 총체적인 SIEM 시스템을 운용하고 있습니다. 평일 기준으로 일일 보안 이벤트 로그 데이터는 약 90~100GB에 달하며, 이는 Elasticsearch Index 관리 페이지에서 확인 가능합니다.
Elstic 스택 최적화의 중요성
Elasticsearch 특성상 초기 아키텍처 설계 및 리소스 산정이 운영 중 발생할 수 있는 성능 문제나 하드웨어 이슈를 최소화하는 데 매우 중요합니다. 운영 중에 구성 변경이나 리소스 추가가 필요한 상황이 생길 경우 고려해야 할 요소가 많아 작업이 복잡해질 수 있기 때문입니다.
댓글