Monitoring

[ELK Stack] 2. Filebeat 설치 및 ELK Stack을 통한 로그 관리

Joon0464 2021. 7. 31. 20:25

1. Filebeat란?

경량 로그 수집기로써 보안 장치, 클라우드, 컨테이터, 호스트 또는 OT에서 수집하든 상관없이 로그와 파일을 경량화된 방식으로 전달하고 중앙 집중화하여 작업을 보다 간편하게 만들어준다.

  • Harvester
    • 파일의 내용을 읽는 역할을 한다.
    • 하나의 Harvester가 각각 하나의 파일을 담당하는 구조를 가진다.
    • 파일을 열고 닫는것까지 담당하기 때문에 Harvester가 실행되고 있다는 것은 file descriptor가 남아있다는 것이다.
    • Harvester는 각 파일을 한 줄씩 읽고 내용을 Output으로 보낸다.
  • Prospector
    • 읽어야할 소스를 식별 및 구분하는 역할을 한다.
    • log, stdin 타입을 지원하며 Prospector당 2개 이상의 type 선언이 가능하며, 어디까지 읽었는지 meta data를 별도 디스크에 저장한다. (default: /var/lib/filebeat/registry)
  • Spooler
    • Harvester가 읽은 데이터를 집계하고 각각 설정한 output으로 전달한다.

2. ELK-WEB에 Apache 서버 구성

$ sudo yum -y install httpd

$ sudo vi /var/www/html/index.html

<html>
<body>
<h1> Web-server </h1>
</body>
</html>

$ sudo systemctl enable httpd
$ sudo systemctl start httpd

systemctl status httpd로 정상 실행되고 있는지 확인한다.
ELK-WEB의 보안그룹을 수정하여 80번 포트를 열어준다.
구성한 Apache 서버 접속 테스트

sudo tail -F /var/log/httpd/access_log

access_log를 확인해본다.

3. Filebeat 설치

3.1 Elasticsearch GPG key 가져오기

$ sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

3.2 Repository 구성 및 Filebeat 설치

$ sudo vi /etc/yum.repos.d/Elastic.repo
[elastic-7.x]
name=Elasticsearch repository for 7.x packages
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
sudo yum -y install filebeat

3.3 Filebeat module list 확인

$ sudo filebeat modules list

 

4. Apache서버 log를 elasticsearch로 보내도록 설정

4.1 /etc/filebeat/filebeat.yml 설정

Inputs 설정

 $ sudo vi /etc/filebeat/filebeat.yml
 
 # ============================== Filebeat inputs ===============================

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/httpd/access_log
    #- c:\programdata\elasticsearch\logs\*

  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  #exclude_lines: ['^DBG']

  # Include lines. A list of regular expressions to match. It exports the lines that are
  # matching any regular expression from the list.
  #include_lines: ['^ERR', '^WARN']

  # Exclude files. A list of regular expressions to match. Filebeat drops the files that
  # are matching any regular expression from the list. By default, no files are dropped.
  #exclude_files: ['.gz$']

  # Optional additional fields. These fields can be freely picked
  # to add additional information to the crawled log files for filtering
  fields:
     server_name: elk-web
     log_type: apache-access
  #fields:
  #  level: debug
  #  review: 1

paths는 보낼 로그가 존재하는 경로를 적어준다.

fields는 output으로 보낼 때 추가한 필드를 포함하여 보낸다. 이후 Kibana에서 해당 필드 키워드를 사용하면 data를 컨트롤할 수 있다.

 

Outputs 설정

# ================================== Outputs ===================================

# Configure what output to use when sending the data collected by the beat.

# ---------------------------- Elasticsearch Output ----------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  #username: "elastic"
  #password: "changeme"

# ------------------------------ Logstash Output -------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["13.125.35.108:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

hosts에는 여러 노드를 입력이 가능하다.

각각의 host에서 균등하게 data를 보내려면 loadbalance: true를 추가로 설정하면 된다.

 

4.2 Filebeat 설정 적용 및 실행

$ sudo systemctl restart filebeat

설정 적용을 위해 Filebeat를 재실행한다.

 

 

5. Logstash 파이프라인 설정

ELK-WEB에서 아래와 같이 설정한다.

$ sudo vi /etc/logstash/conf.d/filebeats.conf

input {
  beats {
    port => 5044
  }
}
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:time}\t%{DATA:tag}\t{ % {DATA:data} }" }
  }
  mutate {
    add_field => { "json_data" => "{ %{data}}" }
  }
  json {
    source => "json_data"
  }
  alter {
    remove_field => [ "data", "json_data" ]
  }
  date {
    match => [ "time", "yyyy-MM-dd'T'HH:mm:ssZZ" ]
  }
}
output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "%{[fields][log_type]}-%{+YYYY.MM.dd}"
  }
}

6. logstash-filter-alter plugin 설치

$ cd /usr/share/logstash/bin/
$ sudo ./logstash-plugin install logstash-filter-alter

7. Logstash 실행

$ sudo sh /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/filebeats.conf

8. Elasticsearch index 생성 확인

$ curl localhost:9200/_cat/indices?v