개발자로서 살아남기/ELK Stack 적용하기

Centos7에 ELK 설치하기 가이드

코드 살인마 2022. 8. 8. 20:33
728x90

🔍개요

회사 내 ELK를 주도적으로 적용시킨지 어언 4개월이 지난 것 같다. 알파에서 적용시킨 이후, 리얼에도 적용하였고,
이후 보안 추가, 몇몇 로그가 보이지 않는 문제, 로그의 시간순대로 정렬 등등 다양한 문제들이 있었다.

 

다만, ELK 업무 외에 다른 업무들이 많았기 때문에 쉽게 손대지 못하고 있다가 시간이 나서, 대대로 개편을 했다.

 

먼저 회사 내 보안 문제로 irteamsu 계정을 사용하지 못하게 되었는데 대부분 가이드들이 sudo를 이용한 설치였기 때문에 일반 바이너리로 설치하는 가이드를 찾아서 진행하였다. 이 과정에서도 리눅스 머신 세팅을 할 수 있는 권한이 없기 때문에 상당히 애를 먹었다.

 

하지만 적용을 하였고, 개발 뿐만아니라 기획, 아트 등 다양한 직군이 사용할 수 있도록 계속 만들어 가고 있다!

 

아래는 서버 로그 파일을 수집하기 위해 Centos7 OS에 바이너리 파일을 이용하여 ELK 스택을 설치한 가이드이다.

ES 버전

라이센스 관련 문제로 7.10 버전을 사용하였다.

다만 최근 회사내 보안 문제로 irteamsu 계정의 몇몇 권한이 삭제되어, irteam 계정으로 만 구축을 하였다.

Filebeat 설치

로그의 수집이 필요한 머신에 설치한다. (로그 수집을 위해 서버가 돌아가고 있는 곳에 설치한다.)

$ sudo yum install filebeat-7.10.0

$ sudo vi /etc/filebeat/filebeat.yml

filebeat.inputs:

- type: log

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

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /home1/irteam/GP_Products/util/log/*.log
    #- c:\programdata\elasticsearch\logs\*

# 개행이 들어가는 log 내용 수집하기 위한 코드 ( 로그 내용이 엄청 길어져 개행이 되는 경우가 있는데 모든 로그를 끌어오기 위한 코드이다.
  multiline.pattern: '^\[\d+-\d+-'

  multiline.negate: true

  multiline.match: after


output.logstash:
  # The Logstash hosts
  hosts: ["133.186.142.124:5044"]


# ================================= Processors =================================
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

Logstash 설치

$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2-linux-x86_64.tar.gz


$ tar -xzf elasticsearch-7.10.2-linux-x86_64.tar.gz

총 3가지 파일을 수정해야한다.

1. logstash.conf - logstash 설정
2. logstash.yml - logstash 경로 설정
3. jvm.options - logstash 스펙 설정

$ vi /logstash-7.10.0/config/logstash.conf

input {
        beats {
                port => 5044
                host => "0.0.0.0"
        }
}

## 원하는 filter가 있으면 설정한다.
## 

filter{

        grok {
                match => {
                        "message" => "%{TIMESTAMP_ISO8601:timestamp}\]\s\[%{LOGLEVEL:logLevel}"
                }
        }


## 디버그 레벨이면 삭제
    if [logLevel] == "DEBUG" {
            drop {}
    }
## 날짜 재 설정
    date {
            match => ["timestamp","ISO8601"]
            target => "timestamp"
    }
## 쓸데없는 필드 삭제
    mutate {
            remove_field => [beat,input,offset,prospector,tags,source]
    }
}


output {

        elasticsearch {
                hosts => ["ES IP 주소","ES IP 주소"]
                #user => "elastic"
                #password => "elk1234"
                index => "indexname-%{+YYYY.MM.dd}"
        }
}

$ vi /logstash-7.10.0/config/logstash.yml

path.data: 하위주소/logstash-7.10.2/lib
pipeline.ordered: auto
path.logs: 하위주소/logstash-7.10.2/log

$ vi /logstash-7.10.0/config/jvm.options

-Xms4g
-Xmx4g


## 작동 확인
$ ./bin/logstash

Elasticsearch 설치하기

logstash와 마찬가지로 몇몇 설정만 하면 된다.

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz

총 2가지 파일을 수정해야한다.

1. elasticsearch.yml - elasticsearch 설정
2. jvm.options - elasticsearch 스펙 설정


## elasticsearch.yml 설정

cluster.name은 모든 서버 동일하게하고, node에 관한 정보는 설계한대로 설정하면 된다.

cluster.name: 원하는 이름
node.name: 원하는 노드이름
node.master: true
node.data: false


path.data: ~~/elasticsearch-7.10.2/data
path.logs: ~~/elasticsearch-7.10.2/logs

bootstrap.memory_lock: true     ## 필수설정
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300

#추후의 보안설정하면 주석 해제
#xpack.security.enabled: true
#xpack.security.transport.ssl.enabled: true
#xpack.security.transport.ssl.verification_mode: certificate
#xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
#xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

discovery.seed_hosts: ["master node IP","master node IP2","master node IP3"]
cluster.initial_master_nodes: ["master node IP","master node IP2","master node IP3"]

jvm.options는 logstash와 같다.

Kibana 설치

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-linux-x86_64.tar.gz

총 1가지 파일을 수정해야한다.

1. kibana.yml - kibana 설정

$ vi /config/kibana.yml

server.port: 5601
server.host: master node IP

#추후에 보안설정하면 주석 해제
#elasticsearch.username: "elastic" 
#elasticsearch.password: "elk1234"

elasticsearch.hosts: ["ES 머신1", "ES 머신2","ES 머신3"]

보안설정

모든 설치를 마치면 보안 설정을 on 한다.
먼저 클러스터의 모든 노드(서버)에 같은 인증서를 배포한다

인증서 생성은 마스터노드 머신에서 진행했다.

ELK 모든 프로세스 종료

# /elasticsearch-7.10.0/bin 으로 이동

$ ./elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

# /config에 elastic-certificates.p12 파일 생성
# 생성된 인증서를 scp를 통해 다른 ES 머신에 배포한다.
# 이후 마스터노드 elastic/bin/에서 아래 명령어 수행

$ ./elasticsearch-setup-passwords interactive

# 비밀번호 입력하라 하면 입력

이후 ELK 설정 파일들에 주석 해제
ex)# user : ~~~

백그라운드 실행

nohup ./실행경로 &

보안설정 이후

보안설정을 한 이후에는 모든 api는 인증헤더를 같이 보내야한다.

아래는 포스트맨 예시이다. (지워진 곳에는 ES 머신 IP를 넣으면 된다.)

 

참조

ELK 보안 설정 - https://danawalab.github.io/elastic/2020/05/20/Elasticsearch-basic-security.html
https://brtech.tistory.com/148

 

ELK 설치 가이드 - https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html