[Linux] ELK 실습
[Linux Log ELK 관리]
ELK Stack을이용한 Linux Log 관리
ELK (Elasticsearch, Logstash, Kibana)
[ Elasticsearch]
- Java로 개발 된 오픈 소스 검색 엔진( Elasticsearch는 ELK Stack의 핵심 구성요소)
- HTTP 대시보드 웹 인터페이스(Kibana)와 함께 분산되어있는 다중 테넌트(분산저장)에 저장된 전체텍스트 검색 엔진을 제공
- JSON 문서 체계를 사용하여 데이터 요청, 검색, 저장을 수행하고, 로그 파일 뿐만아니라 각종 다양한 형태의 텍스트를 검색하는 데 사용
[ Logstash]
- 이벤트 및 로그 관리를 위한 오픈 소스 도구
- 데이터 수집을 위한 실시간 감시기능을 제공
- Logstash는 로그 데이터를 수집하고 데이터를 JSON 문서로 변환 후 Elasticsearch에 저장하는 역할을 수행
[ Kibana]
- Elasticsearch를 위한 오픈 소스 데이터 시각화 도구
- Kibana는 직관적이고, 깔끔한 형태의 대시 보드 웹 인터페이스를 제공
- Elasticsearch에서 데이터를 관리하고, Kibana에서 데이터를 시각화
[ Beats]
- Beats는 Client에 설치하여 Client에서 발생하는대량의 데이터를 Logstash&Elasticsearch 서버로 보낼 수 있는 경량 에이전트 데이터 전송 서비스
- Log File 전송에 사용되는"Filebeat" 외의 다양한 Beat를 제공 ("Metricbeat", "Packetbeat","Winlogbeat" )
- Beats 목록 및 다운로드 링크: https://www.elastic.co/kr/downloads/beats
Linux-01 - Elasticsearch, Nginx WEB & Kibana, Logstash
Linux-02 - Logstash Client Filebeat
win10 - 웹브라우저에서 kibana 사용
[ 1. ELK Stack을 이용한 Syslog 수집 및 분석 ]
1. vm 메모리 증설(4GB)
2. selinux 비활성화
/etc/sysconfig/selinux 편집 > setenforce 0 > reboot > getenforce
3. JDK install
4. Elasticsearch install
[root@localhost ~]# mkdir ./ELK
[root@localhost ~]# cd ./ELK
[root@localhost ELK]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-x86_64.rpm
[root@localhost ELK]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
오픈소스를 내려받고 GPG-key를 임포트 시키고 설치해야한다.
해당 RPM 파일이 위변조되지 않았음을 보장
만약 key값이 다르다면 설치시 안내문구가 뜬다
[root@localhost ELK]# rpm -ivh elasticsearch-7.6.1-x86_64.rpm
5. 환경 설정
- 보안설정 "Localhost"에서 9200번 Port를 이용하여 Elasticsearch가 동작하도록 설정
- mlockall 기능을 활성화하여 모든 작업에 관할메모리 사용을 물리메모리를 사용하도록 설정 변경( Swap 영역사용안함)
- 메모리페이징 시 Log 손실이 발생할 위험이 존재하므로, 페이징 작업을 진행하지 않도록 설정을 변경
[root@localhost ELK]# vi /etc/elasticsearch/elasticsearch.yml << 검색 수집 분석하면서 메모리를 많이 잡아먹음
43 bootstrap.memory_lock: true
55 network.host: localhost
59 http.port: 9200
[root@localhost ~]# vi /usr/lib/systemd/system/elasticsearch.service << demon관리
33 # Memory mlockall
34 LimitMEMLOCK=infinity( 새로라인을정의해서작성)
[root@localhost ~]# vi /etc/sysconfig/elasticsearch
46 MAX_LOCKED_MEMORY=unlimited
[root@localhost ELK]#systemctl daemon-reload( mlockall 설정적용을 위해 전체Daemon을 Reload )
[root@localhost ELK]# systemctl enable elasticsearch
[root@localhost ELK]# systemctl start elasticsearch
6. 확인
curl 명령어를 이용하여, mlockall 사용여부를 확인
curl 명령어를 이용하여, Elasticsearch 동작을 확인
7. Nginx WEB & Kibana install
[root@localhost ELK]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.6.1-x86_64.rpm
[root@localhost ELK]# rpm -ivh kibana-7.6.1-x86_64.rpm
8. Kibana Service 설정파일 수정작업
- 운영 Port 설정 및 외부 접근을 허용하기 위해 All-Network 설정진행( 특정 Host만 지정도 가능)
- 전부 주석처리 되어있으며, 주석 해제 작업만 진행
[root@localhost ELK]# vi /etc/kibana/kibana.yml
2 server.port: 5601
7 server.host: "0.0.0.0"
28 elasticsearch.hosts: ["http://localhost:9200"]
[root@localhost ELK]# systemctl enable kibana
[root@localhost ELK]# systemctl start kibana
9. nginx 설치
[root@localhost ELK]# yum -y install nginx httpd-tools
- Kibana Service는 Reverse WEB Proxy Server을 통해 화면에 정보를 표시
- ELASTIC 공식가이드에서 사용한 Nginx Web Server를 사용하여 Reverse WEB Proxy Server를 구성
- Nginx를 설치하기 위해 EPEL 저장소를 추가 후 Nginx 패키지를 설치( httpd-tools 패키지를 함께 설치)
[ Forward Proxy (포워드 프록시)]
- 일반적인 프록시 서버, 클라이언트와 웹 서버의 중계역할로 클라이언트 요청 시 Proxy서버는 해당 요청을 웹 서버로 중계하는역할
- 프록시 서버는 클라이언트의 요청이 발생하기 전까지는 접근하는 웹 서버의 주소를 알 수 없다.
[ Reverse Proxy (리버스 프록시)]
- 클라이언트와 내부망의 서버 사이에 위치하는 Proxy Server를 말한다.
- 클라이언트 요청시 프록시 서버가 내부망 서버에 요청 후 응답 받은 자원을 클라이언트에게 전달
- 리버스 프록시 서버는 실제 서버들에 대한 주소를 매핑해야 한다.
10. Server Block 설정 제거 후 새로운 가상호스트를 추가하여 사용
[root@localhost ELK]# vi /etc/nginx/nginx.conf
38번째 라인부터 57번째 라인까지 삭제
[root@localhost ELK]# vi /etc/nginx/conf.d/kibana.conf
Reverse Proxy Server 운영을 위한 가상 호스트 설정
Client > web server(nginx) > kibana
Nginx WEB 접근은기본적인 Access 접근보안형식을 사용
기본적인 Proxy Server 정보를 Header에 포함하는 설정정보를 함께 지정
Access 접근보안을 사용하므로, 접근 시 사용할 계정 및 P/W(itbank)값을 지정
[root@localhost ELK]# systemctl enable nginx
[root@localhost ELK]# systemctl start nginx
11. Logstash install
[root@localhost ELK]# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.6.1.rpm
[root@localhost ELK]# rpm -ivh logstash-7.6.1.rpm
12. 환경설정
- SSL/TLS에서 사용할 공개키 인증서 및 개인키를 생성 후 확인
- SSL/TLS 설정파일을 참조하여 공개키 인증서 및 개인키를 생성
- 추가 옵션을 통해 각 Key의 만료일 및 rsa Bit 값등을 지정한다.
[root@localhost ELK]# vi /etc/pki/tls/openssl.cnf
226 [ v3_ca ]
227 # Server IP Address
228 subjectAltName = IP: 192.168.1.100
-SSL/TLS를 이용하여 로그 정보 전송 시 로그정보를 암호화하여 전송하는 것이 좋다.
-SSL/TLS Server IP 주소를 명시 ( 기존 설정 파일에 존재하지 않으므로, 새로작성 )
[root@localhost ELK]# openssl req -config /etc/pki/tls/openssl.cnf \
-x509 -days 3650 -batch -nodes -newkey rsa:2048 \
-keyout /etc/pki/tls/private/logstash-forwarder.key \
-out /etc/pki/tls/certs/logstash-forwarder.crt
[root@localhost ELK]# vi /etc/logstash/conf.d/syslog.conf
- Client로부터 Filebeat를 이용하여 전송된 데이터를 받아들일 형식을 결정
- 사용 Port 정의 및 SSL/TLS 설정 값 정의
- Logstash의 경우 Filebeat로부터 반드시 지정된 시간내에 데이터가 전송되어야한다.
- 만약 지정된 시간내에 데이터 전송이 들어오지 않을 경우 연결을 해제한다.
- client_inactivity_timeout 설정을 통해 Filebeat로부터 들어오는 데이터에 대한 응답대기 시간을 정의한다.
( 정의하지않을경우1분기본값 )
- 가상머신 환경을 사용 할 경우 60초내 응답을 못하는 경우가 발생하여 연결이 끊길 수 있으므로 10분으로 값을 늘려준다.
- Logstash에서는 다양한 Filter Plugin을 지원( "grok" Fileter Plugin을 주로 사용)
- grok 기본형식: %{ 미리 정의된 정규 표현식: 정규표현식에 Match 된 데이터를 담을 Field}
- Linux Syslog에 대한 Filter식을 정의 ( 주요서비스에 대한 기본 Parsing 설정을 공식사이트에서 제공 )
http://grokconstructor.appspot.com/do/match
https://www.elastic.co/guide/en/logstash/7.6/config-examples.html
- Logstash에서 수집한 데이터를 Elasticsearch로 전송하기 위한 설정을 진행
- Elasticsearch의 주소 및 Index 설정등을 진행한다.
- Elasticsearch의 주소 및 Index 설정등을 진행한다.
- Index 설정은 하루에 한번씩 새로운 Index를 생성하여 로그 관리의 편의성을 가져오기 위해 사용된다.
[root@localhost ELK]# systemctl enable logstash
[root@localhost ELK]# systemctl start logstash
[root@localhost ELK]# firewall-cmd --permanent --add-service=http
[root@localhost ELK]# firewall-cmd --permanent --add-port=5044/tcp
[root@localhost ELK]# firewall-cmd --reload
13. Logstash Client Filebeat Install(Linux02-Client)
scp로 복사
mv ./logstash-forwarder.crt /etc/pki/tls/certs/
- Logstash Client에서 접속 후 ELK Server의 공개키 인증서를 SCP를 이용하여 복사진행
- 전송된 공개키 인증서를 신뢰 할 수 있는 CA 인증기관으로 등록하기 위해 "/etc/pki/tls/certs" 디렉터리로이동
[root@localhost ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm
[root@localhost ~]# rpm -ivh filebeat-7.6.1-x86_64.rpm
[root@localhost ~]# vi /etc/filebeat/filebeat.yml
24 enabled: true
27 paths:
28 -/var/log/*.log
29 -/var/log/secure
30 -/var/log/messages
# Filebeat에서 수집할 로그파일지정
# 수집하고자 하는 Log의 절대경로를 명시 ( 여러개의 경로 지정도 가능하다. )
# messages Log를 전송하게 설정함으로써 30초 주기의 모니터링 메시지가 Logstash로 전송되도록한다. (연결해제방지)
150 #--------------------------Elasticsearch output ------------------------------
151 #output.elasticsearch:
152 # Array of hosts to connect to.
153 #hosts: ["localhost:9200"]
# Filebeat Output 기본값 Elasticsearch 우리는 Logstash로 Output을 진행하므로 해당 라인을 반드시 주석처리한다.
163 #-----------------------------Logstash output --------------------------------
164 output.logstash:
165 # The Logstash hosts
166 hosts: ["192.168.1.100:5044"]
167 ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
168 bulk_max_size: 1024
# Logstash Server의 IP 주소 지정 및 서비스 포트 지정
# 기존 주석 처리되어있는 부분을 주석 해제(설명부분제외)
# SSL/TLS 통신을 위해 복사해 온 SSL 공개키 인증서
- Filebeat 사용을 True로변경
- 기본 Elasticsearch 출력을 진행하므로, 주석 처리 후 출력 처리를 Logstash에서 수행하도록 설정을 변경
[root@localhost ~]# systemctl enable filebeat
[root@localhost ~]# systemctl start filebeat
start를 하게되면 linux01 watch로 보고있던거에 올라오는거 확인
14. ELK Stack 동작확인(win10)
nginx에서 reverse proxy server의 형태로 존재하고있어서 web 페이지가 아닌 kibana가 뜬다.
next step
Create Index Pattern