ELK Stack이란?

ELK Stack은 IT 시스템에서 발생하는 반드하한 로그 데이터를 중앙에서 수집하고, 분석하며, 시각화할 수 있도록 해주는 오픈소스 기반의 로그 분석 플랫폼입니다.

이름은 세 개의 헌신 구성요소인 Elasticsearch, Logstash, Kibana의 앞글자를 따서 만든 단어입니다.

최근에는 Beats라는 감철 데이터 수집기가 포함되며, 전체를 Elastic Stack이라고도 불합니다.

주요 목적

  • 시스템 및 애플리케이션 로그를 수집하고 저장
  • 검색 및 필터링을 통해 로그 분석
  • 시각화 대시보드를 통해 상태 모니터링
  • 장애 발생 시 추적과 분석이 용이
  • 보안 감사를 위한 로그 기반 추적 가능

구성 요소 및 역할

구성요소 역할
Elasticsearch JSON 기반의 실시간 검색 및 분석 엔진 (데이터 저장소 역할)
Logstash 로그 수집기. 다양한 입력으로부터 로그를 받아 파싱하고 필터링하여 Elasticsearch에 전달
Kibana Elasticsearch 데이터를 시각화하는 대시보드 도구
Beats (선택) 경량 로그 수집 에이전트 (Filebeat, Metricbeat 등)

Elasticsearch – 데이터 저장소이자 분석 엔진

  • 역할: 수집된 로그 데이터를 저장하고, 검색 및 분석을 빠르게 수행
  • 특징:
    • 실시간 분산 검색 엔진
    • JSON 기반 문서 저장
    • 강력한 검색 쿼리 및 필터 기능
    • RESTful API 제공
  • 활용 예시:
    • “5분간 500 오류가 100건 이상 발생한 서버 찾기”와 같은 조건 검색

Logstash – 데이터 수집기 및 처리기

  • 역할: 다양한 소스에서 로그를 수집하고, 필터링 및 구조화하여 Elasticsearch로 전달
  • 특징:
    • 플러그인 기반의 유연한 파이프라인 구성 (input → filter → output)
    • 다양한 로그 포맷(grok, CSV, JSON 등) 파싱 가능
    • 데이터 정제 및 변환 기능 제공
  • 활용 예시:
    • nginx 액세스 로그에서 IP, 요청 URL, 응답 코드 추출 및 구조화

Kibana – 시각화 및 대시보드 도구

  • 역할: Elasticsearch에 저장된 데이터를 시각적으로 탐색하고 대시보드로 구성
  • 특징:
    • 막대그래프, 원형그래프, 지도 시각화 지원
    • 로그 검색(Discover) 및 경고(Alert) 설정 가능
    • 사용자 친화적인 웹 인터페이스 제공
  • 활용 예시:
    • 서비스별 오류 로그 발생 추이를 시각화하여 운영 상태 파악

Beats – Elastic Stack 확장 요소

  • 역할: 각 서버에 설치되어 데이터를 경량으로 수집
  • 주요 종류:
    • Filebeat: 로그 파일 수집
    • Metricbeat: 시스템 리소스 모니터링
    • Packetbeat: 네트워크 트래픽 분석
  • 특징:
    • 설치가 간편하고 리소스 소모가 적음
    • Logstash 없이도 Elasticsearch에 직접 전송 가능

데이터 흐름 구조

  1. Filebeat가 로그 파일을 모니터링
  2. Logstash로 전달하여 필터링 및 구조화
  3. Elasticsearch에 저장
  4. Kibana에서 시각화하여 분석

ELK Stack을 사용하는 이유

목적 설명
중앙 로그 관리 여러 서버에서 발생하는 로그를 한곳에서 통합 관리
실시간 검색 및 분석 수집 즉시 검색 및 패턴 분석 가능
시각화 및 대시보드 구성 그래프와 차트로 직관적인 로그 분석 가능
장애 및 보안 대응 이상 징후 탐지, 사고 대응, 감사 로그 활용 가능
확장성 수십~수백 대 서버 환경에서도 수평 확장 지원

CentOS 7.9에서 ELK Stack 설치 및 설정

사전 준비

# 시스템 패키지 업데이트
sudo yum update -y
  • 최신 보안 패치 및 종속성 문제 방지를 위해 필수
# Java 설치 (Elasticsearch, Logstash는 Java 필요)
sudo yum install -y java-1.8.0-openjdk
  • Elasticsearch와 Logstash는 Java 기반 애플리케이션이므로 반드시 필요함
# java 설치 확인
java -version
  • 정상적으로 Java가 설치되었는지 확인

4. Elasticsearch 설치 및 설정

# Elasticsearch 저장소 추가
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • Elasticsearch의 공식 GPG 키를 추가하여 패키지 무결성을 보장
cat <<EOF | sudo tee /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x]
name=Elasticsearch repository
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

# 저장소 설정 반영
sudo yum clean all
sudo yum clean metadata
sudo yum makecache fast # 메타데이터를 즉시 캐싱하여 패키지 인식 속도 개선
  • 공식 저장소를 yum에 등록
  • 7.x는 Elasticsearch, Logstash, Kibana의 7.0부터 7.17까지의 버전을 의미하며, CentOS 7.9와 안정적으로 호환됨.
    특히 실무에서는 7.10~7.17이 가장 많이 사용됨 (무료 라이선스 정책이 변경되기 전 버전 포함).
# Elasticsearch 설치
sudo yum install -y elasticsearch

# 설정 파일 편집 (네트워크 및 클러스터 설정)
sudo vi /etc/elasticsearch/elasticsearch.yml

network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
# 운영 환경에서는 아래와 같이 다중 노드 구성 시 discovery 설정을 사용합니다:
# discovery.seed_hosts: ["host1", "host2"]
# cluster.initial_master_nodes: ["node1"]
# 위 설정은 마스터 노드 후보를 지정하고, 클러스터를 올바르게 초기화하기 위해 필요합니다.
# 단일 노드 테스트 환경에서는 discovery.type만 설정해도 충분합니다.
  • network.host: 외부 접속 허용 (테스트 환경 기준)
  • discovery.type: 단일 노드 테스트용 클러스터 설정 (운영 환경에서는 멀티노드 구성 필요)
# Elasticsearch 서비스 시작 및 부팅 시 자동 실행 등록
sudo systemctl enable --now elasticsearch

# 상태 확인
curl -X GET "localhost:9200/" -u elastic

Kibana 설치 및 설정

Elasticsearch 기본 사용자 계정 용도 설명

사용자 계정 용도 설명
elastic Elasticsearch의 기본 관리자 계정 (모든 권한 보유)
kibana_system Kibana가 Elasticsearch에 접근할 때 사용하는 내부 시스템 계정
kibana (구버전에서 사용) Kibana UI를 위한 계정으로, kibana_system으로 대체됨
logstash_system Logstash가 Elasticsearch로 데이터를 전송할 때 사용하는 시스템 계정
beats_system Filebeat, Metricbeat 등 Beats 계열 도구가 Elasticsearch에 전송 시 사용하는 계정
apm_system APM(Application Performance Monitoring) 서버가 사용하는 시스템 계정
remote_monitoring_user Elasticsearch 모니터링 클러스터에서 데이터 수집 시 사용하는 계정

이 계정들은 elasticsearch-setup-passwords interactive 명령을 통해 각각의 비밀번호를 설정하게 되며, 설정된 후에는 관련 서비스가 이 계정으로 인증을 거쳐야 정상적으로 동작합니다.

Elasticsearch 보안 기능 활성화 (선택)

Elasticsearch 7.x는 무료로 제공되는 기본 보안 기능(X-Pack Security)을 포함하고 있으며, 수동으로 활성화하고 비밀번호를 설정할 수 있습니다.

# 보안 기능 활성화 (elasticsearch.yml에 추가)
sudo vi /etc/elasticsearch/elasticsearch.yml

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# Elasticsearch 재시작
sudo systemctl restart elasticsearch

# 사용자 비밀번호 설정 (elastic, kibana_system 등)
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
  • 이 명령은 대화형으로 진행되며, elastic, kibana_system, logstash_system 등 여러 계정의 암호를 직접 설정하게 됨
  • 설정한 비밀번호는 안전하게 별도 보관 필요

# Kibana 설치
sudo yum install -y kibana

# Kibana 설정
sudo vi /etc/kibana/kibana.yml

보안 기능을 활성화했을 경우, Kibana가 Elasticsearch에 인증하고 접속할 수 있도록 사용자 계정 정보를 추가해야 합니다.

server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "설정한 비밀번호 입력"
  • server.host: 외부 접속 허용
  • elasticsearch.hosts: 연결할 Elasticsearch 주소
# Kibana 설정 변경 후 반드시 서비스 재시작 필요

# Kibana 서비스 시작 및 자동 실행 등록
sudo systemctl enable --now kibana

# 포트 접근 가능 여부 확인
netstat -anp | grep 5601

Logstash 설치 및 설정

# Logstash 설치
sudo yum install -y logstash

# 테스트용 구성 파일 생성
sudo vi /etc/logstash/conf.d/filebeat.conf
input {
  beats {
    port => 5044
  }
}
filter {
  grok {
    match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}: %{GREEDYDATA:logmessage}" }
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "비밀번호"
    index => "filebeat-%{+YYYY.MM.dd}"   # ← Kibana에서 인식 가능하게
  }
}
/var/log/messages 로그를 읽어서 파싱 후 Elasticsearch로 전송
  • grok: 로그 패턴 파싱 필터
  • output.elasticsearch: 저장 대상 설정
# Logstash 시작
sudo systemctl enable --now logstash

Filebeat 설치 및 설정 (옵션)

🔸 Filebeat는 ELK 서버에서는 선택사항이지만, 클라이언트 서버에서는 필수입니다.
클라이언트가 중앙 ELK 서버로 로그를 전송하기 위해서는 Filebeat 또는 유사 수집기가 반드시 필요합니다.

# Filebeat 설치
sudo yum install -y filebeat

# Filebeat 기본 설정
sudo vi /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/*.log
    - /var/log/messages
    - /var/log/secure
    - /var/log/cron
    - /var/log/dmesg

# output.elasticsearch: <- 이줄은 반드시 #주석 처리
output.logstash:
  hosts: ["localhost:5044"]
  • Filebeat가 로그를 읽어 Logstash로 전달
# Filebeat 실행
sudo systemctl enable --now filebeat

# Filebeat 설정 오류 시 아래 명령어로 확인
/usr/bin/filebeat test config

# Filebeat가 Logstash와 통신하는 포트 허용 필요
sudo firewall-cmd --add-port=5044/tcp --permanent
sudo firewall-cmd --reload

방화벽 설정

sudo firewall-cmd --add-port=9200/tcp --permanent # Elasticsearch
sudo firewall-cmd --add-port=5601/tcp --permanent # Kibana
sudo firewall-cmd --reload

클라이언트 서버 연동 방법

ELK 서버가 구성된 후, 각 클라이언트 서버에서 로그를 수집하여 중앙 ELK 서버로 전송하려면 Filebeat를 클라이언트에 설치해야 합니다.

클라이언트 서버에서의 설정 절차 (예: CentOS 7.9 기준)

# Filebeat 설치
sudo yum install -y filebeat

# Filebeat 설정 파일 편집
sudo vi /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages

# output.elasticsearch: <- 이줄은 반드시 #주석 처리
output.logstash:
  hosts: ["<ELK_SERVER_IP>:5044"]
  • paths: 수집할 로그 경로 지정
  • output.logstash.hosts: 중앙 ELK 서버의 IP와 Logstash 포트(5044)
# Filebeat 시작 및 부팅 시 자동 실행
sudo systemctl enable --now filebeat

방화벽 예외 등록 (클라이언트 측)

sudo firewall-cmd --add-port=5044/tcp --permanent
sudo firewall-cmd --reload

ELK 서버에서 확인할 것

  • Logstash가 클라이언트의 Filebeat 요청을 허용하고 있는지 (filebeat.conf 또는 멀티포트 config에 설정 필요)
  • Elasticsearch에 새로운 로그 인덱스가 생성되는지 Kibana에서 확인

Kibana에서 Index Pattern 생성 방법

RedBox 클릭

You can also create an index pattern against hidden or system indices.
  • 이 문장은 버튼처럼 생기지 않았지만 파란 글씨로 된 클릭 가능한 링크입니다.
  • 클릭하면 인덱스 패턴 수동 생성 화면으로 이동합니다.
filebeat 인덱스 패턴 설정(1)

filebeat 인덱스 패턴 설정(1)

filebeat 인덱스 패턴 설정(2)

filebeat 인덱스 패턴 설정(2)

filebeat 인덱스 패턴 설정(3)

filebeat 인덱스 패턴 설정(3)

그 다음 단계

  • Index pattern namefilebeat-* 입력
  • Time field는 반드시 @timestamp 선택
  • 마지막으로 Create data view 버튼 클릭
filebeat 인덱스 패턴 설정(4)

filebeat 인덱스 패턴 설정(4)

 

완료 후

  • Kibana 상단 메뉴 → Discover로 이동
  • 로그가 나타날 것입니다!
  • 오른쪽 상단에서 **시간 범위(Today 또는 Last 7 days)**로 변경하는 것도 잊지 마세요
filebeat 인덱스 패턴 설정(5)

filebeat 인덱스 패턴 설정(5)


구축 후 확인

  • http://<서버IP>:9200 → Elasticsearch 동작 확인
  • http://<서버IP>:5601 → Kibana 접속 확인
  • Kibana에서 Index Pattern 생성 후 로그 시각화

마무리 개념 정리

  • Elasticsearch: 저장 & 검색
  • Logstash: 수집 & 가공
  • Kibana: 시각화 & 모니터링
  • Filebeat: 경량 수집기 (옵션)

추가 실무 팁

  • 운영 환경에서는 SSL 인증서 설정, 사용자 인증, 로그 롤링 정책을 반드시 고려
  • 시스템 리소스(메모리, 디스크 IOPS)에 민감하므로 적절한 스펙 설계 필요
  • 각 구성 요소는 시스템 로그뿐 아니라 웹 서버, DB, 보안 로그 등 다양한 로그와 통합 가능