ELK + Filebeat를 통한 Nginx 로그 수집

은콩이집사·2023년 3월 31일

ELK

목록 보기
1/1

ELK Stack을 활용해 여러 Nginx 웹서버들의 Access / Error 로그를 살펴볼 수 있는 로그 모니터링 서버 구성


1. Openjdk 설치

yum install -y java-1.8.0-openjdk
yum install -y java-1.8.0-openjdk-devel

readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64/jre/bin/java

vi /etc/profile
...
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

export JAVA_HOME PATH CLASSPATH
...

source /etc/profile

2. Docker-Compose 설치

※ ELK 설치를 진행하다보면 2.2 버전 이상의 도커 컴포즈를 원한다는 문구를 볼 수 있습니다. ( 전 최신 버전으로 진행했습니다. )

참고 : https://docs.docker.com/compose/install/other

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io

curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose


3. ELK 설치

참고 : https://magnuxx.tistory.com/entry/docker-elk-%EC%84%A4%EC%B9%98-%EB%8F%84%EC%BB%A4-elk-%EC%84%A4%EC%B9%98

Git clone을 통해 ELK Stack을 받습니다.

git clone을 통해 넘어온 디렉토리 안을 살펴보면
docker-compose.yml을 포함한 ElasticSearch , Logstash , Kibana 등의
설정 파일들을 이용하여 미리 편집하여 컨테이너를 올릴 수 있습니다.

저 같은 경우에는 디폴트 설정으로 진행했습니다.

yum -y install git
git clone https://github.com/deviantony/docker-elk.git

초기 비밀번호 세팅

cd docker-elk
vi .env
...
ELASTIC_PASSWORD='비밀번호'
LOGSTASH_INTERNAL_PASSWORD='비밀번호'
KIBANA_SYSTEM_PASSWORD='비밀번호'
...

( 옵션 ) 사용자 계정을 도커 컴포즈 빌드업 과정에서 생성하고 싶다면

vi elasticsearch/Dockerfile
...
USER elasticsearch:root

RUN /usr/share/elasticsearch/bin/elasticsearch-users useradd 계정명 -p 비밀번호 -r superuser
...

도커 컴포즈 실행

cd docker-elk
docker-compose build && docker-compose up -d

# 로컬 설치일 경우 방화벽 설정 / 클라우드 환경일 경우 보안그룹 혹은 ACG 설정
firewall-cmd --permanent --add-port=9200/tcp # ElasticSearch용 포트
firewall-cmd --permanent --add-port=5044/tcp # Logstash용 포트
firewall-cmd --permanent --add-port=5601/tcp # Kibana용 포트
firewall-cmd --reload

4. ELK 구동 테스트

따로 사전 설정 파일들을 건들지 않았다면 Elasticsearch의 계정 정보는 아래와 같습니다.

ID = elastic
PW = changeme

컨테이너 내부에서 계정을 만들고 싶다면 
./bin/elasticsearch-users useradd [계정명] -p ['비밀번호'] -r ['권한 ex ) superuser']

4-1 ) ELK 설치 서버 주소:9200 로 접근 시도

4-2 ) ELK 설치 서버 주소:5601 로 접근 시도


5. Filebeat 설치

로그 수집을 원하는 서버에 필요한 repo 정보를 넣고 설치를 진행합니다.

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

vi /etc/yum.repos.d/elastic.repo
...
[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
...

yum install -y filebeat
systemctl enable filebeat
systemctl start filebeat

※ filebeat 설치 스크립트 제작하기

#!/bin/bash

# Repo 정보 입력
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

echo "
[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md " >> /etc/yum.repos.d/elastic.repo

# filebeat 패키지 설치 및 실행
yum install -y filebeat

systemctl enable filebeat
systemctl start filebeat

# filebeat.yml 수정
sed -i "28s/false/true/g" /etc/filebeat/filebeat.yml
sed -i "32s/.*/- [ 원하는 log 경로넣기 ]/g" /etc/filebeat/filebeat.yml  
sed -i "64s/false/true/g" /etc/filebeat/filebeat.yml
sed -i "139s/.*/#output.elasticsearch:/g" /etc/filebeat/filebeat.yml
sed -i "141s/.*/#hosts: ['ELK서버 IP:9200']/g" /etc/filebeat/filebeat.yml
sed -i "152s/.*/output.logstash:/g" /etc/filebeat/filebeat.yml
sed -i "154s/.*/ hosts: ['ELK서버 IP:5044']/g" /etc/filebeat/filebeat.yml

# ( 옵션 ) filebeat 모듈을 사용할 경우 설정
filebeat modules enable [모듈명]
sed -i 's/false/true/g' /etc/filebeat/modules.d/[모듈명].yml
filebeat -e setup
systemctl restart filebeat

6. Filebeat & Logstash 연동

Filebeat가 로그를 보내고 Logstash에 로그 정보를 적재하여 보기 좋게 가공합니다.
( 공부가 더 필요하기 때문에 이번 글에서는 Logstash를 따로 건들지 않습니다. )


Filebeat을 이용하여 원하는 로그를 보내는 방법에는 2가지가 있습니다.

1. 기본 설정 파일에서 원하는 로그의 경로를 넣어주기
2. 로그 수집을 원하는 서비스의 모듈을 활성화하기

※ 이 글에서는 기본 설정 파일에서 Nginx 로그 경로를 추가해주는 방식이 아닌 Nginx 모듈을 활성화하여 Kibana에서 살펴 보겠습니다.

6-1 ) filebeat.yml 기본 설정

vi /etc/filebeat/filebeat.yml

...

- type: log

  # Change to true to enable this input configuration.
  enabled: true 							# true로 input 활성화

  # Paths that should be crawled and fetched. Glob based paths.
  paths: 
    - /var/log/*.log					# 이 곳에서 원하는 로그 경로를 넣어줄 수 있습니다.
    
... 

# elasticsearch 부분 주석 처리하기
#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]
  
... 

# logstash 부분 주석 제거하기
output.logstash:
  # The Logstash hosts
  hosts: ["ELK 서버 ip:5044"]			# ELK 서버의 IP 정보를 넣어줘서 연동합니다.
...

systemctl restart filebeat

6-2 ) Filebeat module 활성화
Filebeat는 여러 서비스 모듈을 지원하고 지원하는 모듈은 아래 명령어를 통해 살펴볼 수 있습니다.

 filebeat modules list

이번엔 Nginx 모듈을 활성화 해보겠습니다.

 filebeat modules enable nginx
 
 vi /etc/filebeat/modules.d/nginx.yml
 ...
 
 - module: nginx
  # Access logs
  access:
    enabled: true 	# false -> true 로 변경

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    
    #var.paths: 	# 로그의 경로가 디폴트가 아니라면 이 쪽에서 변경

  # Error logs
  error:
    enabled: true 	# false -> true 로 변경

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    
    #var.paths:		# 로그의 경로가 디폴트가 아니라면 이 쪽에서 변경
    
 ...

filebeat -e setup
systemctl restart filebeat
 

7. Kibana에서 로그 확인

ELK 서버:5601으로 접속 후 왼쪽 메뉴바에서 Discover 클릭

왼쪽에서 보고 싶은 필드 값을 선택해주면 입맛에 맞게 Nginx 로그를 살펴 볼 수 있었습니다.

전 timestamp , Host ip, message , service.type , agent.name을 추가하여 원하는 로그를 볼 수 있었습니다.


8. Filter Query

예를 들어 secure 로그 안에서 어떤 유저가 sudo 권한을 이용하여 어떤 Command를 썼는지 Discovery에서 알아보고 싶다고 가정해보면

Kibana를 통해 아래와 같이 필터링 작업을 진행할 수 있었습니다.


이를 쿼리문으로 변경해보면 아래와 같습니다.

{
  "bool": {
    "must": [],
    "filter": [
      {
        "bool": {
          "minimum_should_match": 1,
          "should": [
            {
              "match_phrase": {
                "message": "sudo"
              }
            }
          ]
        }
      },
      {
        "bool": {
          "minimum_should_match": 1,
          "should": [
            {
              "match_phrase": {
                "message": "COMMAND"
              }
            }
          ]
        }
      }
    ],
    "should": [],
    "must_not": []
  }
}

ELK를 더 원활히 사용하기 위해서는 Logstash Pipeline과 Query문을 더 공부해야 할 것 같습니다.

profile
SA , Cloud Engineer

0개의 댓글