[Elastic Stack] Elastic Stack 구축
# Elastic Stack 구축
(로그 통합 시스템)
1. 대상 시스템
시스템 종류
- FI(UCS)
- Openstack (Host log)
- Hyper-V(Host log)
- 스토리지(Netapp) - 7 mode, C mode
- 스위치
2. 진행 단계
2-1. Phase 1 (로그 수집)
#수집 대상
- 스위치 - N9K, N5K, N3K, MDS, SAN
- 스토리지 - Netapp
- CISCO FI
#추가사항
- 로그 포맷 수정
2-2. Phase 2 (호스트 로그 및 메트릭 수집)(중단)
- 호스트 서버 대상으로 호스트 로그 및 metric beat 수집
- 모니터링 구축
3. 아키텍처
4. 구축
4-1. Node 생성(OpenStack)
- 4개의 VM 생성
- 1 마스터 노드, 3 데이터 노드
- 4core, 16GB, 디스크 100GB
- 마스터 노드에 Logstash, Kibana 설치하여 메인 서비스 노드로 역할
4-2. Elasticsearch
4-2-1. 설치
-
Repo 설정
[elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
-
Elasticsearch 설치
sudo yum install elasticsearch -y
-
SysV init 과 systemd 중 어떤 서비스를 사용하는지 확인
ps -p 1
-
systemd
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable elasticsearch.service
-
호스트네임 변경
hostnamectl set-hostname [호스트네임]
4-2-2. 경로
- 기본 프로그램 : /usr/share/elasticsearch
- 실행 파일 : bin/elasticsearch
- 플러그인 : plugins
- 설정 파일 : /etc/elasticsearch
- elasticsearch.yml
- jvm.options
- log4j2.properties
- 데이터(path.data) : /var/lib/elasticsearch
- 로그 : /var/log/elasticsearch
4-2-3. 기본 설정
-
클러스터명 및 노드명 변경
cluster.name: [클러스터 이름]
node.name: ${HOSTNAME}
4-2-4. 세부 설정
-
Java Heap 메모리 설정
sudo vim /etc/elasticsearch/jvm.options
-Xms8g -Xmx8g
(Java Heap 외에 시스템 메모리의 절반은 루씬 파일 캐시용)
-
네트워크 설정
sudo vim /etc/elasticsearch/elasticsearch.yml
network.host: [ IP | _local_ | _site_ | _global_ ]
-
Bootstrap Check 설정(오류 많이 발생)
sudo vim /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true
elasticsearch 재시작 후, 실행에 실패하면 시스템 로그를 확인하여 추가 설정 진행
sudo vim /etc/security/limits.conf
elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
-
Unicast 설정 (데이터노드 - 마스터노드 간의 연결 설정)
sudo vim /etc/elasticsearch/elasticsearch.yml
discovery.zen.ping.unicast.hosts: [마스터 노드 IP]
-
노드 역할 설정
- 마스터 노드 설정
sudo vim /etc/elasticsearch/elasticsearch.yml
node.master: true node.data: false
- 데이터 노드 설정
sudo vim /etc/elasticsearch/elasticsearch.yml
node.master: false node.data: true
4-3. Kibana
4-3-1. 설치
-
Repo 설정
[kibana-6.x] name=Kibana repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
-
Kibana 설치
sudo yum install kibana -y
-
SysV init 과 systemd 중 어떤 서비스를 사용하는지 확인
ps -p 1
-
systemd
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable kibana.service
4-3-2. 경로
- 기본 프로그램 : /usr/share/kibana
- 실행 파일 : bin/kibana
- 플러그인 : plugins
- 설정 파일 : /etc/kibana/kibana.yml
- 데이터(path.data) : /var/lib/kibana
- 로그 : /var/log/kibana
4-3-3. 기본 설정
-
Elasticsearch URL
sudo vim /etc/kibana/kibana.yml
elasticsearch.url: "http://MaterNodeIP:9200"
-
외부 접근 주소
server.host: "IP"
4-4. Logstash
4-4-1. 설치
-
Repo 설정
[logstash-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
-
Kibana 설치
sudo yum install logstash -y
-
SysV init 과 systemd 중 어떤 서비스를 사용하는지 확인
ps -p 1
-
systemd
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable logstash.service
4-4-2. 경로
- 기본 프로그램 : /usr/share/logstash
- 실행 파일 : bin/logstash
- 설정 파일 : /etc/logstash
- logstash.yml
- jvm.options
- log4j2.properties
- startup.options
- pipeline.yml
- Config파일 : /etc/logstash/conf.d
- 플러그인 : /usr/share/logstash/plugins
- 데이터(path.data) : /var/lib/logstash
- 로그 : /var/log/logstash
4-4-3. 기본 설정
-
모니터링 설정
sudo vim /etc/logstash/logstash.yml
xpack.monitoring.elasticsearch.url: ["http://MaterNodeIP:9200"]
-
관리 기능
추가 라이센스 필요
-
파이프 라인 설정
sudo vim /etc/logstash/pipeline.yml
- pipeline.id: [파이프라인 이름] path.config: "/etc/logstash/conf.d/[Config파일]"
-
Config 설정
input{ syslog{ port => 5514 // 514포트는 root 권한만 사용가능, root 권한이 없으므로 포트 변경 type => "syslog" // 다른 input과 구분하기 위해 type 지정 } } filter{ // 수집한 메트릭 및 로그 태깅 및 정제 grok{ match=> {} } mutate{ // 태그 및 필드 추가, 제거 gsub =>[ "필드", "기존값", "수정할값" // 해당 필드의 값을 지정한 값으로 변경 ] } translate{ // 대상 필드의 값을 새로 생성한 목적 필드에 새로운 값으로 저장(이름 변경) field => "대상 필드" destination => "목적 필드" dictionary => [ "대상 필드 값", "목적 필드 값", "10.1.1.1", "cisco-n9k" ] } } output{ // ouput 지정 elasticsearch{ // elasticsearch hosts => ["호스트 IP"] index => "name-syslog-%{+YYYY.MM.dd}" } file{ path => ["파일을 생성할 경로"] codec => line { format => "메시지 및 로그 포맷 설정"} } }
4-4-4. 로그 포맷 수정
-
Netapp syslog
%{SYSLOGTIMESTAMP:syslog_timestamp} \[%{DATA:cluster}_%{DATA:node}:%{DATA:EMS_Indentifier}:%{LOGLEVEL:log-level}]:%{GREEDYDATA:syslog_message}
-
Cisco syslog
%{INT:sequence}>\:%{SPACE}%{YEAR}%{SPACE}%{MONTH}%{SPACE}%{MONTHDAY}%{SPACE}%{TIME}%{SPACE}%{WORD:tz}\:%{SPACE}%{NOTSPACE:facility}\-%{NOTSPACE:loglevel}\-%{NOTSPACE:facility_mnemonic}%{SPACE}%{GREEDYDATA:msg}
4-4-5. 포트포워딩 설정
- 시스로그에 사용되는 포트 514는 root 권한이 있어야 접근 가능
- Logstash는 root 권한이 없으므로 포트포워딩 필요
iptables -t nat -A PREROUTING -p UDP -m udp --dport 514 -j REDIRECT --to-ports 5514
4-5. Syslog 설정
4-5-1. Netapp - 7 mode
ONTAP에서 설정
4-5-2. Netapp - C mode
-
시스로그 서버 목적지 설정
event notification destination create -name [dest-name] -syslog [syslogserver-IP]
-
시스로그 포워딩 설정
event notification create -filter-name [filter-name] -destination [dest-name]
4-5-3. Cisco - N@K
logging server [syslogserver-IP] [log-level] user-vrf [vrf-name]