What's ELK, Filebeat?
- Elasticsearch: Apache Lucene을 기반으로 개발한 실시간 분산형 RESTful 검색 및 분석 엔진
- Logstash: 각종 로그를 가져와서 JSON 형태로 만들어 Elasticsearch로 데이터를 전송함
- Kibana: Elasticsearch에 저장된 데이터를 사용자에게 Dashboard 형태로 보여주는 시각화 솔루션
- Filebeat: 로그 파일을 경령화시켜서 Elasticsearch 또는 Logstash로 넘겨주는 역할을 수행함. 특히, Logstash가 과부하되면 넘기는 속도를 줄여주고, 시스템 가동이 중단되거나 다시 시작해도, 로그의 중단점을 기억하고 그 지점부터 다시 보낼 수 있음
프로그웍스가 ELK에 관심을 가지계 된 계기는 다음과 같습니다. 클라우드 환경에서 마이크로아키텍처에서 탑재되는 개별 모듈의 동작상태를 관제하기 위한 방법이 무엇이 있을까 고민하던 중 한가지 방법이 될 수있겠다라고 생각했습니다.
1. 제작되는 개별 앱 또는 모듈의 로그작성 규칙을 통일하고
2. filebeat를 통해 로그파일에서 원하는 것을 수집하여
3. 대쉬보드에 출력한다면,
VM, 컨테이너, 물리머신 등 환경에 상관없이 운영정보를 관리할 수 있을 것이다. 우선은 여기까지만 생각합니다. 이 후 발전시켜 나가겠습니다.
How to install the ELK, Filebeat?
우선 JDK를 설치한다(JDK를 설치하지 않았을 경우 진행).
$sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
그리고, 아래 환경변수를 /etc/profile
에 추가하고 적용한다.
$sudo vi /etc/profile # 아래 내용 추가 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-1.b14.el7_2.x86_64 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar # 환경변수 등록 $source /etc/profile
1. Elasticsearch
/etc/yum.repos.d/
에 elasticsearch.repo 내용을 추가한다.
[elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
이제 yum
으로 설치한다.
$sudo yum -y install elasticsearch
2. Logstash
위의 Elasticsearch 설치 과정과 동일하다.
$sudo vi /etc/yum.repos.d/logstash.repo # 아래 내용 추가 [logstash-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md # 설치 $sudo yum -y install logstash
3. Kibana
위의 Elasticsearch 설치 과정과 동일하다.
$sudo vi /etc/yum.repos.d/kibana.repo # 아래 내용 추가 [kibana-6.x] name=Kibana repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md # 설치 $sudo yum -y install kibana
Kibana를 설치했으면 Host(호스트), Name(이름), SSL(해도 되고 안 해도 됨)을 설정한다. SSL 설정을 했을 경우 SSL 인증서의 권한도 같이 수정해야 한다. 만약에 시스템에서 방화벽을 사용하면 포트 설정도 추가한다.
$sudo vi /etc/kibana/kibana.yml
# 서버 호스트 및 이름 입력(여기서는 elk.com 사용) server.host: "127.0.0.1" server.name: "elk.com"
# 로그가 담긴 Elasticsearch 주소 입력 elasticsearch.url: "http://127.0.0.1:9200" # SSL 설정 # 서버를 내부에서만 사용하면 할 필요는 없다. 하지만, 외부에서 연결하여 사용할 경우
# 보안성을 위해 SSL 설정을 반드시 해야 한다. server.ssl.enabled: true # .crt 파일 경로 입력 server.ssl.certificate: # .key 파일 경로 입력 server.ssl.key: # SSL 인증서 권한 수정 $sudo chown kibana. 경로(.crt와 .key 파일 둘 다 설정해야 함) # 필요시 방화벽 설정 $sudo firewall-cmd --add-port=5601/tcp --permanent $sudo firewall-cmd --reload
4. Filebeat
위의 Elasticsearch 설치 과정과 동일하다.
$sudo /etc/yum.repos.d/elastic.repo # 아래 내용 추가 [elastic-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md # 설치 $sudo yum install -y filebeat
설치가 완료되면 Filebeat에서 보낼 로그의 경로를 설정한다. 여기서는 Logstash를 사용하므로, output 쪽에 logstash로 지정한다.
$sudo vi /etc/filebeat/filebeat.yml # 아래 내용 추가 filebeat.prospector: - input_type: log paths: # 쉘 명령어들을 기록한 로그 - /var/log/bash_history # MySQL 로그 - /var/log/mysql/* # Apache httpd 로그 - /var/log/httpd/*
output.logstash: hosts: ["127.0.0.1:5044"]
그리고, Filebeat로 보내진 로그를 Elasticsearch로 보내는 설정을 한다. 참고로 Filebeat 외 다른 beat(Metricbeat, Packetbeat, Heartbeat, Winlogbeat 등)에서 보낸 로그를 포함하여 이를 모두 Logstash에서 직접 로그를 보낼 수 있다.
$sudo vi /etc/logstash/conf.d/filebeat.conf # 아래 내용 추가 input { beats { port => 5044 host => "0.0.0.0" } } output { elasticsearch { hosts => ["http://127.0.0.1:9200"] index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
이제 Kibana에서 위에서 설정한 로그를 확인할 수 있다.
# 서비스 모두 재시작 systemctl restart elasticsearch systemctl restart logstash systemctl restart kibana systemctl restart filebeat
혹시 서비스 시작 도중 시스템이 느려지면 RAM 4GB 이상 설정한다. 이제 http://127.0.0.1:5601
에 접속하면 Kibana가 정상적으로 실행된다. 처음에 Index Pattern이 없다고 나온다. 그러면 curl localhost:9200/_cat/indices?v
명령어를 실행해서 Elasticsearch에 저장된 Index Pattern을 확인하고 Kibana에 추가하면 된다 (여기서는 filebeat-로 추가했다. Index Pattern은 추후 원하는 대로 수정 가능하므로 참고할 것*). 이제 Dashboard 혹은 Discover 메뉴에서 보고 싶은 로그를 필터링하여 볼 수 있다.
[curl localhost:9200/_cat/indices?v
실행 결과]
[Index Pattern 설정]
[SQL Injection 공격 시도 MySQL 로그]
[사용자가 su 명령어를 입력한 로그를 추출한 결과(원하는 Command List를 입력해서 로그를 확인 가능)]
마지막으로, SQL Injection 공격 시도가 있을 때 ssl_error_log
에서 아래처럼 POST Body 메시지를 볼 수 있다. Logstash 덕분에 JSON 형식으로 잘 넘어온다.