Installing ELK stack on ubuntu
시 스템 로그를 로그 파일 자체로 보는 것은 어려운 일입니다. 형식 자체가 사람이 읽기에 적합하지 않고, 너무도 많은 양이 생산되기 때문에 필요한 부분을 찾거나 가공하는 것이 쉽지 않습니다. 그래서 이것을 처리해 주는 여러가지 방법중에서, php-syslog-ng를 오래전 젠투 박스에서 이용했습니다. 물론 지금도 약간의 변경을 통해서 사용이 가능하지만, 개발이 중단된 툴은 문제가 생겼을 때 도움을 받기가 용이하지 않습니다. 이것을 대체하기 위해서 로그 분석 툴들 중에서 대중적으로 인기가 높은 ELK Stack을 설치해서 사용해 보고자 합니다.
ELK Stack은 Elasticsearch, Logstash, Kibana의 약자로서 Elasticsearch는
Apache의 Lucene을 바탕으로 개발한 실시간 분산 검색 엔진이며, Logstash는 각종 로그를 가져와 JSON형태로
만들어 Elasticsearch로 전송하고 Kibana는 Elasticsearch에 저장된 Data를 사용자에게 Dashboard
형태로 보여주는 Solution입니다. 즉, 여러 서버에서 생성된 로그 파일을 ELK가 설치된 서버로 보내주면 통합적으로 로그를
수집/가공/시각화할 수 있는 방법입니다.
자바 설치
user $
sudo add-apt-repository -y ppa:webupd8team/java
user $
sudo apt-get update
user $
sudo apt-get install oracle-java8-installer
설치 중간에 Orcle Binary Code license terms은 Yes로 바꾸어서 확인합니다.
user $
java -version
java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
Elasticsearch
설치
user $
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
user $
echo
"deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" |
sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
user $
sudo apt-get update
user $
sudo apt-get install elasticsearch
설정
... # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: localhost ...
서비스 시작
user $
sudo systemctl restart elasticsearch
user $
sudo systemctl daemon-reload
user $
sudo systemctl enable elasticsearch
서비스 확인
user $
curl localhost:9200
{ "name" : "Sputnik", "cluster_name" : "elasticsearch", "cluster_uuid" : "N4R7btIGRMK8fiN56tbXjA", "version" : { "number" : "2.4.1", "build_hash" : "c67dc32e24162035d18d6fe1e952c4cbcbe79d16", "build_timestamp" : "2016-09-27T18:57:55Z", "build_snapshot" : false, "lucene_version" : "5.5.2" }, "tagline" : "You Know, for Search" }
Kibana
설치
user $
echo "deb http://packages.elastic.co/kibana/4.5/debian stable main" | sudo tee -a /etc/apt/sources.list
user $
sudo apt-get update
user $
sudo apt-get install kibana
설정
... # The host to bind the server to. server.host: localhost ...
서비스 시작
user $
sudo systemctl daemon-reload
user $
sudo systemctl enable kibana
user $
sudo systemctl start kibana
Logstash
설치
user $
echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
user $
sudo apt-get update
user $
sudo apt-get install logstash
SSL 인증서 생성
ELK 서버와 다른 서버와의 데이터 교환에 SSL/TLS를 사용해서 보안을 강화할 수 있습니다. ELK 서버가 다른 서버로부터의 로그를 받을 때 필요한 인증을 위해서 ELK 자신의 key를 보관할 자료방과 인증서를 보관할 자료방을 만듭니다.
user $
sudo mkdir -p /etc/pki/tls/certs
user $
sudo mkdir /etc/pki/tls/private
사설 IP인 경우
내부 네트웍에 ELK가 동작하고 있다면 IP 주소를 가지고 인증서와 key를 생성해야 합니다. Openssl 설정 파일에서 [ v3_ca ] 섹션에 ELK 서버의 ip 주소를 적어줍니다.
... subjectAltName = IP: ELK_server_private_IP ...
이제 인증서와 키를 만듭니다.
user $
cd /etc/pki/tls
user $
sudo
openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes
-newkey rsa:2048 -keyout private/logstash-forwarder.key -out
certs/logstash-forwarder.crt
FQDN을 가진 경우
ELK 서버에 대한 FQDN이 있어서 자동으로 공인 ip로 바꾸어 줄 경우에는 아래와 같이 인증서와 key를 만듭니다.
user $
cd /etc/pki/tls
user $
sudo
openssl req -subj '/CN=ELK_server_fqdn/' -x509 -days 3650 -batch -nodes
-newkey rsa:2048 -keyout private/logstash-forwarder.key -out
certs/logstash-forwarder.crt
만들어진 logstash-forwarder.crt 파일은 ELK 서버의 logstash에 로그를 보내는 모든 서버에 복사를 해 주어야 합니다.
logstash 설정
SSL 인증을 이용할 경우에는 아래의 ssl로 시작하는 줄을 주석(#)을 제거해 주어야 합니다. 또한 방화벽이 켜져 있는 상항에서는 포트를 열어주어야 합니다[4].
input { beats { port => 5044 #ssl => true #ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" #ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } add_field => [ "received_at", "%{@timestamp}" ] add_field => [ "received_from", "%{host}" ] } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } }
output { elasticsearch { hosts => ["localhost:9200"] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
테스트
user $
sudo /opt/logstash/bin/logstash --configtest -f /etc/logstash/conf.d/
Configuration OK
서비스 시작
user $
sudo systemctl restart logstash
user $
sudo systemctl enable logstash
Load Kibana Dashboards
user $
cd ~
user $
unzip beats-dashboards-*.zip
user $
cd beats-dashboards-*
user $
./load.sh
Load Filebeat Index Template in Elasticsearch
user $
cd ~
user $
curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json
{ "acknowledged" : true }
Set Up Filebeat (Add Client Servers)
모니터링하고 싶은 어떤 서버에서 진행해야 하는 사항입니다. 여기서는 ELK 서버에 설치해 보겠습니다. 그래서 인증 부분은 제외하고 진행할 것입니다.
SSL 인증서 복사
나중에
FileBeat 설치
user $
echo "deb https://packages.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
user $
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
user $
sudo apt-get update
user $
sudo apt-get install filebeat
FileBeat 설정
... paths: - /var/log/auth.log - /var/log/syslog # - /var/log/*.log #- c:\programdata\elasticsearch\logs\* ... # Type to be published in the 'type' field. For Elasticsearch output, # the type defines the document type these entries should be stored # in. Default: log document_type: log ... ### Logstash as output logstash: # The Logstash hosts hosts: ["localhost:5044"] bulk_max_size: 1024 ...
SSL을 사용하시면 tls 섹션을 설정하셔야 합니다.
Filebeat 서비스 시작
user $
sudo systemctl restart filebeat
user $
sudo systemctl enable filebeat
FileBeat 테스트
user $
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
...
"_index" : "filebeat-2016.10.13",
"_type" : "log",
"_id" : "AVfABMDw2dEYhhFABxTh",
"_score" : 1.0,
"_source" : {
"message" : "Oct 14 05:35:37 ubuntu64 barnyard2[848]: Closing spool file '/var/log/snort/snort.u2.1476359549'. Read 1100 records",
"@version" : "1",
"@timestamp" : "2016-10-13T21:48:38.644Z",
...
Connect to Kibana
이제 웹 브라우저를 열어서 http://ELK_server_ip:5601 을 입력합니다. 화면에서 Settings->Indices->filebeat-* 를 선택한 후에 초록색 네모로 감싸진 별표를 눌러줍니다.
이제 Discover를 누르면 데이터를 받은 것이 보일 것입니다.
다음 사항을 시도해 봅니다:
- Search for "root" to see if anyone is trying to log into your servers as root
- Search for a particular hostname (search for host: "hostname")
- Change the time frame by selecting an area on the histogram or from the menu above
- Click on messages below the histogram to see how the data is being filtered
여기까지 하시면 기본 설치/설정은 끝났습니다. 아래부분은 자세한 사용전에 이미 만들어진 보드를 사용해 보기 위한 목적입니다.
reference:
http://blog.daum.net/utpark0/14
'날리지 > Lucene' 카테고리의 다른 글
엘라스틱서치 도커에 설치 (0) | 2020.02.07 |
---|---|
엘라스틱서치 (1) 디렉토리 구조 (0) | 2020.02.07 |
루씬 검색엔진 (0) | 2017.04.12 |