본문 바로가기

날리지/Lucene

우분투에 엘라스틱 서치 설치

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 termsYes로 바꾸어서 확인합니다.

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

설정

File /etc/elasticsearch/elasticsearch.yml
...
# 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

설정

File /opt/kibana/config/kibana.yml
...
# 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 주소를 적어줍니다.

File /etc/ssl/openssl.cnf
...
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].

File /etc/logstash/conf.d/02-beats-intput.conf
input {
        beats {
                port => 5044
                #ssl => true
                #ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
                #ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
        }
}
File /etc/logstash/conf.d/10-syslog-filter.conf
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" ]
                }
        }
}
File /etc/logstash/conf.d/30-elasticsearch-output.conf
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

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 설정

File /etc/filebeat/filebeat.yml
...
      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
Important
여기까지 하시면 기본 설치/설정은 끝났습니다. 아래부분은 자세한 사용전에 이미 만들어진 보드를 사용해 보기 위한 목적입니다.

reference:


http://blog.daum.net/utpark0/14

'날리지 > Lucene' 카테고리의 다른 글

엘라스틱서치 도커에 설치  (0) 2020.02.07
엘라스틱서치 (1) 디렉토리 구조  (0) 2020.02.07
루씬 검색엔진  (0) 2017.04.12