# ELK Stack 공유 # 0. ELK 라이선스 webinar 참석 Elastic에서 라이선스 모델 webinar 진행 ### 과금모델 1. 노드당 과금 진행 (기존에는 에이전트, APP단 용량, 유저당, cpu 코어당 비용 모델이였음) 2. 기술지원 (24x7x365) 제공, 교육 및 유지보수 지원 ### 추가 기능 (License 모델에 따라 제공되는 기능의 차이가 있음) 1. 기존에 hot / warm / cold 말고 fronzen 노드가 추가 (필요한 데이터만 로딩하기 때문에 메모리 대비 처리하는 데이터 비율이 1:1600) 약 64G메모리에 100TB가량의 데이터 저장가능 2. Fleet : beats의 수량이 많아지면서 beats를 통합관리한 모델 3. CCR; Cross Cluster Replication 기능추가 1. 클러스터간 실시간 동기화 (HA / DR구성 제공) 2. 공공기관의 경우 법적이 이슈때문에 보관주기가 길고, 저장되는 데이터가 분리되어야 하는 사례가 있음 4. Correlation(APM 상관분석) : 에러의 원긴을 자동으로 식별하고, latency, error rate 두가지 측면에서 문제가 되는 트랜잭션을 식별 ### Basic라이선스 모델 1. Basic 라이선스는 별도 비용이 없음. 2. 내부에 ES엔지니어가 있어야 하고, 리세일링 활동 불가 3. 판매 / 재배포 / 용역 활동 불가능하고, 운영 서비스 장애지원, 정기점검, 서버 증설, 업그레이드 등 제공 안함. 4. 사업영역으로 사용할 수 없고, 로그수집, 단순 연구목적으로만 사용가능 ### 추가 공유사항 1. '21년 3월 이후부터 AWS에서 제공되는 ES;Elastic Search는 Elastic사에서 공급하는 S/W가 별도의 S/W임 (양사간 법적인 다툼이 있어서 제공하지 않음) 2. '21년 3월에 출시되는 7.12이후부터는 OSS;Open source Software 라이선스 제공 하지 않고, Basic라이선스만 제공.(7.11까지는 OSS버전 제공) # 1. ELK Stack 소개 ### ELK Stack? - 각 서버에 저장된 로그성 데이터를 한곳에 모아서 시각화 하는 Opensource - Elasticsearch / Logstash / Kibana를 줄여 ELK라고 명칭하고 있었고, fileBeat가 추가되면서 ELK Stack으로 명칭. ### Component별 역활 - **filebeat** : 시스템에 기록된 로그데이터를 logstash로 보내기 위한 역활 (logstash보다 경량화되었고, 로그데이터가 json으로 파싱되어 있는 경우 logstash를 거치지 않고 elasticsearch바로 전송할 수 있다 함) - **Logstash** : filebeat에서 받은 로그, 시스템에 기록된 로그데이터를 Elasticsearch로 보내는 역활 - **Elasticsearch** : logstash에서 전달받은 데이터를 DB화 수행 - **Kibana** : Elasticsearch에서 정제된 데이터를 시각화 수행 ### 하드웨어 요구사항
**Component**
**Hardware**
**설 명**
**비 고**
Elasticsearchcpu8 Core
Elasticsearchmem최소 : 16GB 권장 : 64GB 이상 8GB 이하에서 사용시 작동오류 발생할 수 있음
ElasticsearchdiskSSD 사용 \* ssd에서는 io스케쥴러는 deadline대신 noop으로 변경 cfq : r/r, deadline : 10초, noop : \* ATA디스크를 사용해야 할 경우 15K rpm 디스크 사용 \* NAS에 데이터 저장은 비권장
Kibanacpu8 Core
Kibanamem최소 1GB 권장 : 4GB 이상
Kibanadisk제약없음
Logstashcpu2Core
Logstashmem2GB
Logstashdisk제약없음
\* Elasticsearch에서 사용할 디스크 용량 계산 방법 (예상 로그양 \* 보관일 ) \* 데이터 노드수가 기본적인 용량 계산방법 ### ELK Data Flow 1. Node에 설치되는 filebeat대신에 logstash를 설치해서 ElasticSearch로 바로 전송할수 있음. 2. filebeat / logstash의 RSS메모리 사용량 비교 - 로그 데이터는 초당 1Mbyte씩 전송할수 있게 로그파일 생성, 총 100초동안 초단위로 수집 진행 [![image.png](http://igoni.kr/uploads/images/gallery/2024-03/scaled-1680-/Akgimage.png)](http://igoni.kr/uploads/images/gallery/2024-03/Akgimage.png) ### Elasticsearch 구성 - Elasticsearch 노드 종류 - **master node** : Elasticsearch의 인덱스 메타데이터, 샤드, 클러스터 상태 정보를 관리하는 역활.. 서버 수량이 많을때 모든 노드가 master역활을 수행할 경우 성능상 부담이 되기 때문에 통상적으로 10대이상 구성될 경우 master/data 노드 분리해서 운영하는것이 best practice - **data node** : 실제 데이터를 저장하는 노드 - Cluster기반의 통신정책 - 클라이언트와 Elasticsearch와의 통신을 위한 포트 : tcp/9200 - Elasticsearch노드간의 통신을 위한 포트 : tcp/9300 - 용어 확인 / 비교 [![image.png](http://igoni.kr/uploads/images/gallery/2024-03/scaled-1680-/m31image.png)](http://igoni.kr/uploads/images/gallery/2024-03/m31image.png)
DBMS (like, mysql)
Elasticsearch
databaseindex
tabletype
rowdocument
columnfield
schemamapping
indexindex
sqlQuery DSL
selectGET (Rest API사용)
updatePUT (Rest API사용)
insertPOST (Rest API사용)
deleteDELETE (Rest API사용)
#### Index 수명주기에 따른 노드 관리 : 6.7이후부터 공식릴리즈에 포함된 기능 - hot : 가장많이 검색되는 인덱스 - warm : 검색되긴하지만, 자주 검색되지 않은 인덱스 - cold : 자주 검색되지 않으나, 만약을 위해 유지하는 인덱스 #### Index 관리 규칙 - Create : 인덱스 생성 - close : 인덱스는 유지하되, write는 불가 - delete : 인덱스 삭제 #### Index 상태 확인 - green : 샤드, 리플리케이션 모두 정상인 상태 - yellow : 일부 인덱스가 비정상적으로 구동되고 있는 상태 - red : 모든 인덱스의 샤드가 비정상적으로 구동되고 있는 상태, 인덱스 데이터의 read/write가 불가능 #### 데이터 관리방안 (인덱스 생성시 정해야 하고, 데이터가 저장되어 있는 경우 re-index 작업해야 반영됨) - shard : - Document를 노드단위로 분산저장하는 방식 (7.x부터는 Default가 1로 설정, 6.x 이하는 Default가 5) - 데이터를 분산 저장하는 것뿐만 아니라 분산 검색도 수행함. shard의 갯수가 증가할수록 쿼리 속도도 증가(분산 쿼리) - replica : - Primary shard(원본데이터)갯수만큼 복제 shard(2개), replica(1개)로 구성한 경우 2x1 = 2개의 replica가 생성, replica의 데이터는 primary shard가 없는 노드에 각각 저장 - node = 3, shard = 2, replica = 1로 구성된 경우 노드별 데이터 저장 방식 ![](https://blog.kakaocdn.net/dn/dprtO8/btqBaBxCzdY/sAOw8wDOlHq4fhqJLks9b1/img.png) # 2. ELK Config 정보-1 ELK Stack Config Value 설명 1. Filebeat Config 정보 1. filebeat Log Config
설정값 설 명 기본값
paths 수집할 경로 /var/log/message → /home/message /var/log/secure
recursive\_glob. enabled recursive 패턴으로 확장 기능 활성화 true
encoding W3C에서 사용하는 인코딩 plain
exclude\_lines 로그 전달할때 전송하지 않을 줄 패턴
include\_lines 로그 전달할때 전송할 라인 패턴 모든라인의 데이터 전송
harvester\_buffer \_size harvester가 파일을 가지고 올때 사용하는 버퍼크기 16384(바이트 단위)
max\_bytes 단일 로그 메시지에 할당하는 최대 크기 10485760(10MB)
json json포맷으로 작성된 로그를 디코딩할떄 사용 (keys\_under\_root, overwrite\_keys, expand\_keys 중 하나이상 지정필요) · keys\_under\_root : 디코딩된 json json키 아래배치 · overwrite\_keys : 필드 추가시 충돌다는 필드는 덮어쓰기 수행 · expand\_keys : 추가 확인필요 · add\_error\_key : json이 정렬작업시 오류가 발생하면 error.message error.type: json키를 추가 · message\_key : 라인 필터링 혹은 멀티 라인이 적용되어 있는 경우 json키를 지정하 는 설정 · document\_id : 문서 id를 구성
multiline 멀티라인의 메시지를 처리할떄 사용
exclude\_files path에 정의된 파일중 제외할 파일 리스트 목록
ignore\_older 지정된 시간 범위 이전에 수정된 파일은 전송 제외
close\_inactive 지정된 시간동안 수집되지 않은 경우 파일을 닫음
close\_renamed 파일이름이 변경될때 파일을 닫음
close\_removed 파일이 제거될때 harverster 도 종료. true
close\_eof 파일 끝에 도달하자마자 파일을 닫음 (한번만 작성하고 수시 업데이트시 유용) false
close\_timeout 정해진 시간 초과하면 파일 닫음 0 (비활성화)
clean\_inactive inactive기간 경과하면 파일상태 제거
clean\_removed 마지막으로 읽은 파일이 없는 경우 레지스트리에서 파일정리 true
scan\_frequency 지정된 경로에서 새파일을 찾는 빈도 10(초단위)
tail\_files 각 파일 끝에서 새파일을 읽기 시작(rotate적용시 활용가능) false
symlinks 심볼릭링크된 파일 수집여부 false
backoff 열린파일을 얼마나 크롤링 하는지 확인 1(초단위)
max\_backoff 파일이 마지막에 도달한 후 다시 확인하기 전에 대기하는 시간 10(초단위)
backoff\_factoer backoff 시간이 대기하는 시간 2
harvester\_limit 하나의 입력에 대해 병렬로 수집하는 최대 harverster 갯수 0 (제한없음)
\* harvester : 각 파일을 한줄씩 읽기 위해 파일을 열고, 읽고, 닫는 행위 2. Logstash Config 정보 **1. ****logstash config 설정정보** 1. logstash에는 input / filter / output 단위로 Config 설정 가능 2. input : 로그를 수집하는 방법 (syslog, file, http, udp, snmp, s3 등등 가능), sincedb파일 (inode, device numeber, file offset 저장)에 기록하여 logstash가 재시작 되는 경우 sincedb에 저장된 값 을 참고해서 중단된 시점부터 다시 로딩 3. filter : 수집된 로그를 Elasticsearch로 보내기 위해 로그 데이터 포맷 변환 4. output : 정제한 로그데이터를 외부로 보내는 설정 **2. ****Input - File Config **
설정값 설 명 기본값
check\_archive\_ validity 압축된 파일을 처리하기전 유효성 검사 false
close\_older 마지막으로 읽은 후 파일을 닫는 시간 3600()
delimiter 줄 넘어가는 구분 기호 \\n
discover\_intern val path에서 지정한 새파일 검색 옵션 stat\_interval의 배수 (ef. stat\_interval 500이면 500 x 15 = 7.5 7.5초마다 새 파일을 검색 함) 15 ()
exclude path에서 directory 로 설정했을때 특정 파일을 제외해야 할 경우 -
exit\_after\_read 읽기 전용으로 파일을 읽을때 (파일내용이 변경되지 않는 상황에서 사용) true로 설정하면 파일 검색 비활성화(프로세스 시작될떄 디렉토리에 있는 파일만 읽고, 파일 처리 후 수정된 경우 새로 추가된 항목만 로딩) false
file\_chunk\_cou nt 다음 파일로 이동하기 전에 각 파일에서 읽은 chunk 수를 설정. file\_check\_count = 32, file\_chun\_size 32로 할 경우 4611686018427387 903
file\_chunck\_size 디스크에서 block 혹은 chunk 단위로 읽을때 chunk에서 값 추출.
file\_complete\_a ction read 모드인 경우 파일을 모두 읽었을때 수행하는 작업 (delete, log, log\_and\_delete 중 선 택) delete
file\_completed \_log\_path file\_complete\_action 수행 후 기록할 파일 경로
file\_sort\_by pah에 설정된 경로의 파일들의 정렬 기준 (last\_modified, path 중 선택) last\_modified
file\_sort\_directi on file\_sort\_by에 정의된 정렬 기준에 따라 오름차순 혹은 내림차순 설정 (asc, desc 중 선택) \* 가장 오래된 데이터를 먼저 불러와야 할 경우 last\_modified + asc로 정의하면 됨. asc
ignore\_older 지정된 기간()이전에 마지막으로 수정된 파일이 있어도 해당파일은 skip 처리. , skip된 파일이 이후에 수정되면 데이터 로딩 - (설정할 경우 초단 위로 설정)
max\_open\_files 한번에 사용할 수 있는 file\_handler 갯수 (커널에 설정된 max\_open\_files 갯수 초과 설정 불 가) 4096
mode 파일을 읽어올때 사용하는 방식 (tail, read 중 선택) read에서만 사용할 수 있는 옵션 : ignore\_older, file\_completed\_action, file\_completed\_log\_path tail에서만 사용할 수 있는 옵션 : start\_postion, close\_older tail
path 파일을 읽어들일 경로 설정
o delete : 파일 삭제 o log : 파일 내용이 file\_completed\_log\_path에 정의한 경로로 저장 o log\_and\_delete : file\_completed\_log\_path에 정의한 경로로 저장 후 파일 삭제 o 최근에 수정된 날짜 기준으로 정렬 o 파일명 기준으로 정렬 o read모드 : 지정된 파일의 전체내용을 처리 o tail모드 : 변경된 파일의 내용을 추적해서 처리. 대상파일이 복사&붙여넣기 된 경우 새파 일로 인식하고 처음부터 읽어옴
sincedb\_clean\_ after 마지막 timestamp 정보가 있는데, 해당 설정값 동안 추적된 파일에서 변경사항이 없으면 sincedb에서 읽어들이지 않음 2(일단위)
sincedb\_path 디스크에 기록된 sincedb 파일 위치 (파일경로로 설정) <path.data> /plugins/inputs/file
sincedb\_write\_i nterval 모니터링할 로그파일의 현재 위치를 사용하여 DB에 쓰는 주기 15(초단위)
start\_postion logstach가 처음으로 파일 읽기 시작하는 위치 (beginning, end 중 선택) end
start\_interval 파일이 수정되어 있는지 확인하기 위한 빈도 1 (초단위)
**3. ****Input - beat Config **
설정값 설 명 기본값
add\_hostname 7.0.0부터는 미사용
cipher\_suites 암호화할 리스트 1) 참고
client\_inactivity\_time out 클라이언트가 설정값동안 통신이 없으면 종료 60 (초단위)
ecs\_compatibility ECS; Elastic Common Schema 호환성 (dislabled, v1 중 선택) disabled
host 수신대기할 IP 0.0.0.0
include\_codec\_tag 벤더사 정보 없음 true
port 수신할 포트 tcp/5044
ssl 이벤트 전송시 암호화 전송 false
ssl\_certificate ssl 사용시 사용할 인증서
ssl\_certificate\_author ities ssl 사용시 인증서 유효성 검사 \[\]
ssl\_handshake\_time out SSL handshake 10000 (밀리초 단위)
ssl\_key SSL사용시 사용할 SSL (PKCS8 키여야 함)
ssl\_key\_passphrase SSL 사용시 ssl key 패스워드
ssl\_verify\_mode SSL 사용시 클라이언트 정보 확인 (none, peer,force\_peer 중 선택) none
ssl\_peer\_metadata 이벤트의 메타데이터를 인증서에 저장, ssl\_verify\_mode에서 force\_peer로 설정되어 있어 야 함 false
tls\_max\_version SSL사용시 사용할 최대 인증서 버전 1.2
tls\_min\_version SSL사용시 사용할 최소 인증서 버전
o disabled : ECS호환 템플릿 미사용 o v1 : Elastic Common Schema V1과 호환되는 값 제공 (pipeline.ecs\_compatibility 활성화 시 해당값 사용) o none : 클라이언트에게 인증서 제공 요청하지 않음 o peer : 서버가 클라이언트에게 인증서 제공하도록 요청 o force\_peer : peer와 동일하나, 클라이언트가 인증서를 제공하지 않는 경우 연결 종료 1) cipher\_suites list : java.lang.String\[TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_GCM\_SHA384, TLS\_ECDHE\_RSA\_WITH\_AES\_256\_GCM\_SHA384, TLS\_ECDHE\_ECDSA\_WITH\_AES\_128\_GCM\_SHA256, TLS\_ECDHE\_RSA\_WITH\_AES\_128\_GCM\_SHA256, TLS\_ECDHE\_ECDSA\_WITH\_AES\_256\_CBC\_SHA384, TLS\_ECDHE\_RSA\_WITH\_AES\_256\_CBC\_SHA384, TLS\_ECDHE\_RSA\_WITH\_AES\_128\_CBC\_SHA256, TLS\_ECDHE\_ECDSA\_WITH\_AES\_128\_CBC\_SHA256\]@459cfcca **4. ****output - Elasticsearch Config**
설정값 설 명 기본값
action 프토로콜에 영향받지 않는 작업. index
api\_key elasticsearch api 키를 사용해서 인증. 해당 기능을 사용하려면 ssl 옵션이 활성화 되 어 있어야 함
bulk\_path 추가 확인필요
cacert ssl 구성을 위한 .cert 혹은 pem 파일 경로
cloud\_auth elastic cloud 클라우드 인증문자열
cloud\_id elastic cloud 웹콘솔 id
doc\_as\_upsert document\_id elasticsearch에 없으면 새문서 생성
document\_id 인덱싱할 문서 ID,
ecs\_compatibili ty ECS; Elastic Common Schema 호환성 (dislabled, v1 중 선택) disabled
failure\_type\_lo ggin\_whitelist 로깅하지 않을 elasticsearch 오류값 설정
custem\_headers 각 요청에서 전송된 헤더로 키/값 세트를 elasticsearch 노드로 전달할때 사용
healthcheck\_pa th head 요청이 전송될때 백그라운드에서 서비스 요청에 적합하기 전에 확인
hosts 원격 인스턴스의 호스트 설정 127.0.0.1
http\_compressi on http 요청시 gzip 압축 활성화 false
ilm\_enabled Index Lifecycle Management(ilm) 활성화 시 사용 ( elasticsearch cluster 6.6.0, 기본 라이선스 이상 설치되어 있어야 함 (true, false, auto중 설정) auto
ilm\_pattern ilm을 사용하기 위해 인덱스를 생성하기 위한 패턴 (패턴은 인덱스이름에 상관없이 0 으로 채워진 6자리 문자열) now/d - 000001
ilm\_rollover\_ali as ilm을 사용하기 위해 관리되는 인덱스 별칭 ecs\_compatibility에 따라 다 름
index 이벤트로 사용할 인덱스명, 인덱스를 일별로 분할이 기본값이며 대문자를 사용할 수 없음 ecs\_compatibility에 따라 다 름
keystore 서버에 인증서를 제공하는데 사용되는 키 저장소 (.jks 혹은 .p12)
keystore\_passw ord keystore의 패스워드
manage\_templ ate 추가 확인필요
parameters 키 쌍값을 URL문자열로 전달
parent 하위문서의 경우 상위ID
password SSL기반의 elasticsearch 클러스터에 인증하기위한 패스워드
path Elasticsearch가 설치된 http 경로
o index : logstash의 이벤트를 인덱싱 o delete : ID값을 기준으로 문서삭제 o create : 문서를 인덱싱. 이미 인덱싱되어 있는 경우에는 실패 o update : ID값을 기준으로 문서 업데이트 o disabled : ECS호환 템플릿 미사용 o v1 : Elastic Common Schema V1과 호환되는 값 제공 (pipeline.ecs\_compatibility 활성화시 해당값 사용) o true : lifecycle 사용 o false : 미사용 o ECS 활성화시 : ecs- logstash o ECS 비활성화시 : logstash o ECS 활성화시 : ecs- logstash-%{+yyyy.MM.DD} o ECS 비활성화시 : logstash-%{+yyyy.MM.dd}
pipeline 이벤트에 대해 설정항 파이프라인 설정 nil
pool\_max output에 설정된 연결하기 위해 사용하는 최대 연결 수 (너무 낮은 경우 연결이 자 주 열렸다가 닫힘) 1000
pool\_max\_per\_r oute output에 설정된 연결하는 동안 필요한 엔드포인트 수 100
proxy http 통신시 proxy 연결이 필요한 경우 입력
recurrect\_delay 백엔드 통신시 최대 서용하는 retry 횟수 5 (초단위)
retry\_initial\_int erval retry을 위한 inerval 2 (초단위)
retry\_max\_inter val 최대 retry 를 위한 interval 64 (초단위)
retry\_on\_conflict elasticsearch가 업데이틀 위해 시도하는 횟수 1
routing 이벤트 적용을 위해 적용할 라우팅값
script 스크립트 업데이트 모드에 대한 이름 설정
script\_lang script사용시 스크립트의 언어 Elasticsearch 6.0이상에서 인덱싱된 스크립트를 사용 하는 경우 빈문자열로 설정
script\_type script사용시 변수가 참조하는 유형. (inline, indexed, file 중 선택) inline
script\_var\_name 스크립트에 전달된 변수이름 event
scripted\_upsert true설정시 스크립트는 업데이트 false
sniffing Elasticsearch에 모든 클러스토 노드 목록을 확인하고 호스트목록에 추가 false
sniffing\_delay sniffing 하기 위한 interval 5 (초 단위)
sniffing\_path 스니핑 요청시 사용할 http 경로
ssl ElasticSearch클러스터에 SSL / TLS적용시 사용 false
ssl\_certificate\_v erification SSL 사용시 서버 인증서를 확인하는 옵션 true
template 템플릿 기능사용시 설정할 경로
template\_name 템플릿 이름 지정 ecs\_compatibility에 따라 다 름
template\_over write true로 설정되어 있는 경우 Elasticsearch에 표시된 템플릿을 덮어쓰기 false
timeout Elasticsearch로 보낸 작업의 시간 제한 60 (초단위)
truestore 서버 인증서 검증을 위한 경로 (.jks 혹은 .p12)
truestore\_pass word trustore 저장소의 패스워드
upsert document\_id가 없는 경우 json문자열로 새문서 생성
user 보안 Elasticsearch 클러스터에 인증하기 위한 사용자 이름
validate\_after\_i nactivity keepalived요청 사용시 대기하는 시간 10000 (밀리초단위)
version 인덱싱에 사용할 버전
o inline : 인라인유형의 스크립트 o indexed : Elasticsearch에 인덱스된 스크립트 이름 o file : Elasticsearch의 구성디렉토리에 저장된 이름 o ECS 활성화시 : ecs- logstash o ECS 비활성화시 : logstash
version\_type interval, external, external\_gt, external\_gte, force 중 선택 interval : 지정된 버전이 저장된 문서의 버전과 동일한 경우에만 인덱스 external, external\_gt : 지정된 버전이 저장된 문서의 버전보다 더 높거나 혹은 없는 경우에만 문서를 인덱싱 external\_gte : 지정된 버전이 저장된 문서의 버전보다 같더나 높은 버전에만 문서 인 덱싱 ( 해당방식 사용시 데이터 손실 위험 존재)
**5. ****Filter Config **
필터종류 사용용도
aggregate 여러이벤트의 정보 집계
alter mutate필터가 처리하지 않는 필드의 작업 수행
bytes 해당 숫자값으로 구문분석
cidr 네트워크 ip 주소 확인
cipher 이벤트에 암호 적용
clone 이벤트 복사
csv 쉼표(,)로 구분된 데이터를 개별필드로 구문분석
date logstash 타임스탬프로 사용하기 위해 날짜를 구문 분석
de\_dot 필드이름에서 점을 제거
dissect 구분기호를 사용해서 구조화되지 않은 이벤트 데이터를 필드로 추출
dns DNS값 설정
drop 모든 이벤트 삭제
elapsed 이벤트 처리 경과시간 계산
elasticsearch Elasticsearch의 예전 이벤트에서 현재 이벤트로 복사
environment 환경 변수값을 메타 데이터 필드로 저장
extractnumbers 문자열에서 숫자를 추출
fingerprint 일관된 해시값으로 대체하여 필드 처리
geoip ip주소에 지리정보 추가
grok 구조화되지 않은 이벤트를 필드로 구문분석
http REST API와의 통합용으로 사용
i18n 필드에서 특수 문자 제거
java\_uuid uuid를 생성하고 이벤트 추가
jdbc\_static 추가 확인필요
jdbc\_streaming 추가 확인필요
json json 포맷의 이벤트 구문 분석
json\_encode 필드 데이터를 json으로 표현
kv Key - Value 포맷 구문분석
memcached memcached의 외부 데이터 통합
metricize 여러 메트릭을 포함하는 이벤트를 분석해서 각 단일 메트릭 / 여러 이벤트로 분석
metrics 메트릭 사용
mutate 추가 확인필요
prune black / whitelist을 적용할 필드 목록을 기반으로 이벤트 데이터 정리
range 지정된 필드가 설정한 크기 혹은 길이 내에 있는지 확인
ruby ruby 코드 실행
sleep 작업 대기 시간
split 다중라인의 메시지 혹은 문자열을 각각 이벤트로 분할
syslog\_pri syslog같이 메시지의 우선순위 필드를 구문분석
threats\_classifier 보안로그 강화
throttle 이벤트수 제한
tld 기본메시지의 내용을 지정한 내용으로 치환
translate 특정필드의 데이터를 yaml 파일이나 hash로 전환
truncate 정의한 크기보다 큰 필드를 자름
urldecode 암호화된 URL과 필드 정보를 복호화
useragent 에이전트 문자열을 필드로 구문분석
uuid 이벤트에 uuid를 추가
wurfl\_device\_detection OS에서 인식한 장치 정보를 로그에 포함
xml xml을 필드로 구문분석kSearch / Logstash(FielBeat) / Kibana 아키텍쳐
3. ElasticSearch Config
설정값 설 명 기본값
path.data 데이터 경로 /var/data/elasticsearch
path.log 로그데이터 경로 /var/log/elasticsearch
[cluster.name](http://cluster.name/) 클러스터 구성할때 다른노드와 공유할때 사용 elasticsearch
[node.name](http://node.name/) 노드 ID 임의로 생성되는 UUID 7 자리
network.host 클러스터 환경에서는 서버 실제IP로 설정 loopback주소로 설정
discovery.seed.hosts 클러스터 환경에서 연결할 수 있는 노드목록 리스트
cluster. initial\_master\_nodes Elasticsearch 최초 구동시 마스터노드를 설정하기 위한 master 노드 목록
bootstrap.memory\_lock 프로세스 공간을 선언하고 heap memory가 스왑되지 않도록 설정 (해당기능 사용시 true설정) false
jvm heap -Xmx, -Xms 설정
4. Kibana Config
분 류 설정값 설 명 기본값
서버설정 console.enabled 프로세스 실행시 true
서버보안 csp.rules 브라우저에서 불필요하고 안정하지 않은 특정기능을 비활성화
서버보안 csp.strict 기본적인 CSP규칙을 적용하지 않는 브라우저에 대해 접속 차단 true
서버보안 csp.warnLegacyBrowsers 기본적인 CSP규칙을 적용하지 않은 브라우저접속시 경고메시지 출력 (csp.strict true되면 해당 기능은 무효화) true
elasticsearch 연동 elasticsearch.customHeaders Elasticsearch로 보낼 헤더이름 및 값 없음
elasticsearch 연동 elasticsearch.hosts 쿼리에 사용할 Elasticsearch URL http://localhost: 9200
elasticsearch 연동 elasticsearch.pingTimeout Elasticsearch ping에 응답할때까지 기다리는 시간 30000(밀리 초단 위)
elasticsearch 연동 elasticsearch. requestHeadersWhitelist Elasticsearch로 보낼 kibana 클라이언트 헤더목록 없음(헤더 보내지 않음)
elasticsearch 연동 elasticsearch.shardTimeout elasticsearch가 샤드의 응답을 기다리는 시간 미사용시 0 30000(밀리초 단 위)
elasticsearch 연동 elasticsearch.sniffInterval elasticsearch에서 업데이트된 노드 목록 확인시간 false (밀리초 단 위)
elasticsearch 연동 elasticsearch.sniffOnStart 프로세스 시작시 다른서버에 설치된 elasticsearch 를 찾을때 사용 false
elasticsearch 연동 elasticsearch. sniffOnConnectionFault elasticsearch 연결 오류발생시 elasticsearch 노드목록 업데이트 false
elasticsearch ssl연동 elasticsearch.ssl. alwaysPresentCertificate elasticsearch에서 인증서 요청시 클라이언트 인증서 전달 false
elasticsearch ssl연동 elasticsearch.ssl.certificate / elasticsearch.ssl.key PEM으로 인코딩된 클라이언트 인증서와 개인키 경로 false
elasticsearch ssl연동 elasticsearch.ssl. certificateAuthorities elasticsearch에서 신뢰할 수 있는 인증기간의 인증서 경로 false
elasticsearch ssl연동 elasticsearch.ssl.keyPassphrase 개인키를 복호화시 사용하는 암호 false
elasticsearch ssl연동 elasticsearch.ssl.keystore.path 클라이언트 인증서와 해당 개인키를 포함하는 PKCS#12키 저장소 false
elasticsearch ssl연동 elasticsearch.ssl.keystore.password 지정된 키 저장소를 복호화시 사용하는 암호
elasticsearch ssl연동 elasticsearch.ssl.truststore.path elasticsearch에서 신뢰할 수 있는 인증서 구성시 신뢰저장소의 경로
elasticsearch ssl연동 elasticsearch.ssl.truststore. password 신뢰하는 저장소 복호화시 사용하는 암호
elasticsearch ssl연동 elasticsearch.ssl.verificationMode elasticsearch 아웃바운드 SSL/TLS연결시 수신하는 서버 인증서 (full, certificatem none 중 선택) · full : 호스트이름 확인 · certificate : 호스트 이름 사용안함 · none : 인증서 검증 무시 full
elasticsearch 연동 elasticsearch.username elasticsearch에 기본인증이 설정되어 있는 경우 elasticsearch 사용자 정보
elasticsearch 연동 elasticsearch.password elasticsearch 기본인증이 설정되어 있는 경우 elasticsearch 사용자 패스워드
elasticsearch 연동 enterpriseSearch.host 엔터프라이즈 검색을 위한 인스턴스 URL
서버설정 interpreter.enableInVisualize visualize에서 인터프리터 사용여부 true
서버설정 kibana.autocompleteTimeout elasticsearch의 자동완성 대기시간 1000 (밀리 초단 위)
서버설정 kibana. autocompleteTerminateAfter elasticsearch 자동완성을 생성하기 위해 각 샤딩된 데이터 로그하는 최대 문서수 100000
서버설정 logging.dest kibana로그 출력시 저장하는 파일 stdout
서버설정 logging.json 로그포맷을 json으로 기록. false
서버설정 logging.quiet true로 설정시 오류메시지를 제외한 모든 로그 출력 false
서버설정 logging.silent false로 설정시 모든 로그 데이터는 보이지 않음 false
서버설정 logging.timezone 표준시간대 설정
서버설정 logging.verbose true시 시스템 사용정보 및 모든 이벤트 로그저장 false
kibana map 설 정 map.includeElasticMapsService Elastic Maps Servive에 대해 연결을 비활성화하려면 설정 true
kibana map 설 정 map. proxyElasticMapsServiceInMaps kibana를 통해 모든 map app elastic maps service를 요청 false
kibana map 설 정 map.regionmap 지도를 시각화 사용시 사용할 레이어 정보
kibana map 설 정 map.regionmap.layers\[\].attribution map 사용시 geojson파일의 경로
kibana map 설 정 map.regionmap.layers\[\].fields\[\] map 사용시 레이어에 노출하려면 geojson기능 속성
kibana map 설 정 map.regionmap.layers\[\].fields\[\]. description 지도 시각화 구성시 옵션탭 아래에 표시되는 텍스트문구
kibana map 설 정 map.regionmap.layers\[\].fields\[\]. name Elasticsearchdp 저장된 데이터와 geojson간 내부 결합시 사용.
kibana map 설 정 map.regionmap.layers\[\].name map 사용시 제공되는 지도설명
kibana map 설 정 map.regionmap.layers\[\].url map사용시 geojson파일의 URL
kibana map 설 정 map.tilemap.options.attribution 지도 속성 문자열
kibana map 설 정 map.tilemap.options.maxZoom 최대 확대 수준 10
kibana map 설 정 map.tilemap.options.minZoom 최소 확대 수준 1
kibana map 설 정 map.tilemap.options.subdomains 서브 도메인 리스트
kibana map 설 정 map.tilemap.url kibana가 타입맵 시각화시 사용하는 url
서버설정 newsfeed.enabled kibana ui알림센터에 뉴스피드 사용 설정 trure
서버설정 path.data elasticearch에 저장되지 않는 데이터 경로 data
서버설정 pid.file kibana pid파일 생성 경로
서버설정 ops.interval 시스템 및 프로세스 성능 메트릭 샘플링 간격 (최소 100이상) 5000 (밀리 초단 위)
서버설정 ops.cGroupOverrides.cpuPath cgroup사용시 cpu 경로 정보 /proc/self/cgroup
서버설정 ops.cGroupOverrides.cpuAcctPath cgroup사용시 cpuacct 경로 정보 /proc/self/cgroup
서버설정 server.basePath kibana통신앞에 프록시가 존재하는 경우 kibna 마운트할 경로 server.rewriteBasePath 설정이 되어 있어야 하고, 경로가 "/"로 마치면 안됨
서버설정 server.publicBaseUrl 사용자가 kibana에 접속할 수 있는 URL
서버설정 server.compression.enabled 모든 http응답에 압축사용여부 true
서버설정 server.compression. referrerWhitelist kibana 앞에 reverse proxy가 존재하는 경우 referer 헤더를 기반으로 http응답시 압축을 사용여부 (server.compression.enabled가 활성화된 경우 해당값은 무시) none
서버설정 server.customResponseHeaders kibana서버에서 클라이언투르 응답보낼 헤더이름 / 없음
서버설정 server.host 호스트 설정 (원격연결 허용시 서버IP주소 입력) localhost
서버설정 server.keepaliveTimeout keepalived 대기 시간 120000 (밀리 초 단위)
서버설정 server.maxPayloadBytes 수신서버의 최대 payload크기 1048576 (바이트 단위)
서버설정 [server.name](http://server.name/) kibana 인스턴스를 시벽하는 이름 hostname
서버설정 server.port 서버에서제공하는 포트 5601
서버설정 server.requestId.allowFromAnyIp 로그에서 요청을 식별하고 Elasticsearch로 전달하기 위해 모든ip주소가 X- Opaque-ID 헤더를 신뢰하는지 설정
서버설정 server.requestId.ipAllowlist X-Opaque-id 헤더를 신뢰하는 IP주소목록 false
서버설정 server.rewriteBasePath kibaka에서 reverse proxy에서 basepath rewrite하는지 설정
서버설정 server.socketTimeout closed 소켓 닫기 전 대기시간 120000 (밀리초단 위)
서버 SSL설정 server.ssl.certificate / server.ssl.key PEM으로 인코딩된 클라이언트 인증서와 개인키 경로
서버 SSL설정 server.ssl.certificateAuthorities 신뢰할 수 있는 인증기간의 인증서 경로
서버 SSL설정 server.ssl.cipherSuites ssl 암호목록 1)SSL 리스트 참고
서버 SSL설정 server.ssl.clientAuthentication 클라리언트 연결에서 인증서 요청시 사용하는 설정값 · required : 클라이언트가인증서를 제시하지 않는한 연결 거부 · optional : 클라이언트가 인증서가 있는 경우 사용 · none : 클라이언트 인증서 검증 무시 none
서버 SSL설정 server.ssl.enabled kibana 접속시 ssl 사용여부 false
서버 SSL설정 server.ssl.keyPassphrase 신뢰할 수 있는 인증기간의 인증서 경로
서버 SSL설정 server.ssl.keystore.path 신뢰할 수 있는 인증기간의 인증서 경로
서버 SSL설정 server.ssl.keystore.password 지정된 키 저장소를 복호화시 사용하는 암호
서버 SSL설정 server.ssl.truststore.path 신뢰할 수 있는 인증서 구성시 신뢰저장소의 경로
서버 SSL설정 server.ssl.truststore.password 신뢰하는 저장소 복호화시 사용하는 암호
서버 SSL설정 server.ssl.redirectHttpFromPort 모든 http 요청을 https로 리다이렉션 함
서버 SSL설정 server.ssl.supportedProtocols 지원되는 SSL프로토콜 TLSv1.1, TLSv1.2, TLSv1.3
서버보안 server.xsrf.allowlist API 보호기능 비활성화 enable
서버보안 server.xsrf.disableProtection ture설정시 kibana에서 사이트 위조방지 기능 비활성화 false
서버보안 status.allowAnonymous true설정시 미인증사용자 사용불가 false
서버보안 telemetry. allowChangingOptInStatus 고급설정에서 원격 분석 설정 변경 가능 true
서버보안 telemetry.optIn 원격 데이터의 수집가능 true
서버보안 telemetry.enabled 클러스터 통계를 보고시 사용 true
서버보안 vis\_type\_vega.enableExternalUrls 모든 url을 사용하여 외부 데이터 소스 및 이미지에 액세스 할수 있도록 구성하려 면 true 설정 false
xpack설정 xpack.license\_management. enabled xpack 라이선스 관리UI사용하지 않으려면 false true
xpack설정 xpack.rollup.enabled xpack 롤업 UI를 사용하지 않으러면 false 설정 true
서버설정 i18n.locale kibak인터페이스 언어 설정 en
1) SSL리스트: TLS\_AES\_256\_GCM\_SHA384 TLS\_CHACHA20\_POLY1305\_SHA256 TLS\_AES\_128\_GCM\_SHA256 ECDHE-RSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES256-GCM-SHA384, DHE-RSA-AES128-GCM- SHA256, ECDHE-RSA-AES128-SHA256, DHE-RSA-AES1 [\* CSP ; Content-Security-Policy (](https://w3c.github.io/webappsec-csp/)https://w3c.github.io/webappsec-csp/ 참고) # 3. ELK stack Install #### ELK Stack Install ##### ELK Stack 패키지 설치 - ELK서버에서 수행 1. repository 구성 ```shell $ vi /etc/yum.repos.d/elk.repo [logstash-7.x] name=Elastic repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=0 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` 2. java 설치 (java 설치 버전은 1.8 버전으로 배포 진행) ```shell $ yum install java -y $ java -version openjdk version "1.8.0_282" OpenJDK Runtime Environment (build 1.8.0_282-b08) OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode) ``` 3. Logstash / Elasticsearch / Kibana 설치 ```shell $ yum install logstash elasticsearch kibana -y ``` ##### ELK Stack Config - ELK서버에서 수행 1. kibana 설정 ```shell $ vi /etc/kibana/kibana.yml ... server.host: "0.0.0.0" (외부에서 webui 접근이 0.0.0.0 으로 사용) ... elasticsearch.hosts: ["http://localhost:9200"] (Elasticsearch 설치 서버 ip) ... i18n.locale: "ko-KR" ``` 2. Cluster 기반의 Elasticsearch 설정 ```shell $ vi /etc/elasticsearch/elasticsearch.yml ... cluster.name: es-cluster # 클러스터링 할 서버는 동일한 cluster.name값으로 설정 node.name: ${HOSTNAME} # 클러스티링할 서버 호스트네임 (노드별로 uniq한 값이어야 함) path.data: /data/elasticsearch # Elasticsearch Data경로 path.logs: /var/log/elasticsearch # Elasticsearch 로그경로 network.host: 0.0.0.0 # 외부에서 접속시 설정 discovery.seed_hosts: ["192.168.0.10", "192.168.0.11", "192.168.0.12"] #Elasticsearch Discovery 호스트 설정 cluster.initial_master_nodes: ["192.168.0.10", "192.168.0.11", "192.168.0.12"] #마스터 서버 리스트 ... http.port: 9200 # http 호스트 사용하는 포트 transport.tcp.port: 9300 # 데이터 전송 포트 ... node.master: true # master 노드 역활시 true node.data: true # data 노드 역활 적용시 true ... index.number_of_replicase: 1 #각 인덱스를 3개의 replicaset으로 구성 index.number_of_shards: 2 #각 인덱스를 샤딩 ... node.attr.box_type: hot #노드역활 설정 (hot / warm / clod 중 선택) ``` 3. logstash config 설정 ``` $ vi /etc/logstash/conf.d/nginx.conf input { beats { port => 5044 host => "0.0.0.0" } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "nginx-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } } #config 참고해서 logstash 구동하도록 설정 (기존 설정값 삭제 후 아래내용 설정) $ vi /etc/systemd/system/logstash.service ... ExecStart=/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx.conf ... $ systemctl daemon-reload ``` 4. filebeat 설치 - log를 전달할 서버에 설치 1. repository 구성 ```shell $ vi /etc/yum.repos.d/elk.repo [logstash-7.x] name=Elastic repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=0 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` 2. 패키지 설치 ```shell $ yum install filebeat -y ``` 3. filebeat 설정 ```shell $ vi /etc/filebeat/filebeat.yml ... filebeat.inputs: - type: log enabled: true #true로 변경 paths: #Logstash로 전달할 로그파일 혹은 경로를 설정하면 된다. - /svc/stg/web/logs/access.log - /var/log/cmd.log - /var/log/kibana/* ... setup.kibana: host: "192.168.0.11:5601" #Kibana 서버 IP ... #output.elasticsearch: #filebeat -> logstash로 전달할것이기 때문에 elasticsearch는 주석처리 # hosts: ["localhost:9200"] ... output.logstash: #주석해제 hosts: ["192.168.0.11:5044"] #logstash 서버ip/포트 설정 ... ``` #### 프로세스 실행 1. ##### kibana / elasticsearch 프로세스 실행 - ELK 서버에서 수행 ```shell $ systemctl enable kibana --now $ systemctl enable elasticsearch --now $ systemctl enable logstash --now ``` 2. ##### filebeat 서비스 구동 - Log 전달할 서버에서 수행 ```shell $ systemctl enable filebeat --now ``` #### 서비스 작동 확인 1. ##### logstash 기능 확인 ```shell #logstash 포트 LISTEN 확인 $ netstat -antp| grep 5044 | grep LISTEN tcp6 0 0 :::5044 :::* LISTEN 6730/java #filebeat → logstash로 데이터 전송이 되는지 확인 (logstash서버에서 수행) $ tcpdump -nn port 5044 -i bond0 14:11:35.759481 IP 192.168.0.11.5044 > 192.168.10.2.34160: Flags [P.], seq 379:385, ack 87143, win 1432, options [nop,nop,TS val 341934898 ecr 464702009], length 6 14:11:35.760109 IP 192.168.10.2.34160 > 192.168.0.11.5044: Flags [.], ack 385, win 115, options [nop,nop,TS val 464702013 ecr 341934898], length 0 ``` 2. ##### Elasticsearch 기능 작동 확인 ```shell #Elasticsearch 포트 LISTEN 확인 $ netstat -antp | grep 9200 | grep LISTEN tcp6 0 0 :::9200 :::* LISTEN 11324/java #logstsh에서 전달한 데이터가 elasticsearch에서 index수집되는지 확인 $ curl --connect-timeout 2 -XGET http://127.0.0.1:9200/_cat/indices?v health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_task_manager_7.12.0_001 jNMZ2LZcRtqYkwCrQqCsdQ 1 1 9 10 92.6kb 73.7kb green open .apm-custom-link MmzSDfLtSXuQCYwqXoYbFg 1 1 0 0 416b 208b green open .apm-agent-configuration xbHoMaQ0QUS2WAsOy3Uspw 1 1 0 0 416b 208b green open .async-search pMPoD_2OQzue0gJH-vSdig 1 1 1 0 90.9kb 46.9kb green open .kibana_7.12.0_001 Qmo4u9gjTOmihGVwJlguqQ 1 1 22 0 6.3mb 4.2mb green open .kibana-event-log-7.12.0-000001 VykSos0vR1W_l5F2E5G2pg 1 1 2 0 21.9kb 10.9kb green open .elastichq 7sr4ATTsSnasGRH4tJhCBA 1 1 1 0 13.7kb 6.8kb green open .tasks X2B8PyG5SMCV0dPAo6eH4g 1 1 2 0 15.5kb 7.7kb ``` 3. ##### 클러스터 구성 정보 확인 ```shell $ curl --connect-timeout 2 -XGET http://127.0.0.1:9200/_cluster/health?pretty=true { "cluster_name" : "es-cluster", #클러스터 이름 "status" : "green", #클러스터 상태 "timed_out" : false, "number_of_nodes" : 3, # 마스터 노드 수 "number_of_data_nodes" : 3, # 데이터 노드 수 "active_primary_shards" : 9, "active_shards" : 18, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 ``` 4. ##### Kibana 구성정보 확인 ```shell #kibana 포트 LISTEN 확인 $ netstat -antp | grep 5601 | grep LISTEN tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 13513/node #kibana 접속 확인 $ curl -IL -XGET http://192.158.0.11:5601/app/home/ HTTP/1.1 200 OK content-type: text/html; charset=utf-8 content-security-policy: script-src 'unsafe-eval' 'self'; worker-src blob: 'self'; style-src 'unsafe-inline' 'self' kbn-name: SKB-DJK-ELK1 kbn-license-sig: 0f6943d9f4b6625724a0d78fe647bbe2f284a6e24fb46f587b17b1b0bec18e34 cache-control: private, no-cache, no-store, must-revalidate content-length: 127971 vary: accept-encoding accept-ranges: bytes Date: Fri, 09 Apr 2021 05:52:47 GMT Connection: keep-alive Keep-Alive: timeout=120 ``` #### Kibana Index Pattern 설정 1. WebUI : [http://kibanaIP:5601](http://kibanaIP:5601) [![image-1658595831958.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595831958.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595831958.png) 2. Management → Stack Management → Kibana → Index patterns [![image-1658595840322.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595840322.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595840322.png) 3. {{ index name }}-[YYYY.mm](http://YYYY.mm).DD 패턴이 보이지 않으면 elasticsearch에서 데이터가 아직 유입되지 않은 상태. 4. Search에서 등록할 index명 입력 후 Create index pattern 선택 5. Time filed에는 @timestamp 선택 후 Create index pattern 선택 [![image-1658595851071.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595851071.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595851071.png) 6. Analytics → discover 선택하면 유입된 데이터 확인 가능 [![image-1658595858282.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595858282.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595858282.png) ##### WEB UI를 통한 Elasticsearch 상태 확인 - docker 설치 후 cerebro container 구동 ```shell $ docker container run -d --name cerebro --restart always -p 9000:9000 -m 512m lmenezes/cerebro:latest 8d691f585fa8: Pull complete 3da6fe7ff2ef: Pull complete e22147996cc0: Pull complete 8df48a2d4467: Pull complete 45e578fea430: Pull complete Digest: sha256:1cd0765418f1737de3533648d549655437eb550ee0cfad27488c19e620028f2f ``` - WEB UI 로그인 : [htttp://elk서버ip:9200](htttp://elk%EC%84%9C%EB%B2%84ip:9200) [![image-1658595875298.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595875298.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595875298.png) - Node address에 ELK 설치된 서버 IP입력 - 첫화면(Overview) : Elastic 서버 & 인덱스 상태확인 [![image-1658595879212.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595879212.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595879212.png) - Nodes : 노드 상태 확인 (별표에 색깔 칠해진 노드가 master 노드) [![image-1658595901657.png](http://igoni.kr/uploads/images/gallery/2022-07/scaled-1680-/image-1658595901657.png)](http://igoni.kr/uploads/images/gallery/2022-07/image-1658595901657.png) 참고 Site - *logstash input : [https://www.elastic.co/guide/en/logstash/current/input-plugins.html](https://www.elastic.co/guide/en/logstash/current/input-plugins.html)* - *filebeat log : [https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#filebeat-input-types](https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#filebeat-input-types)* - *elk intsall: [https://www.elastic.co/guide/en/beats/filebeat/current/setup-repositories.html](https://www.elastic.co/guide/en/beats/filebeat/current/setup-repositories.html)* - *elk stack 소개 : [https://medium.com/naver-cloud-platform/%EB%84%A4%EC%9D%B4%EB%B2%84-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%B4-elk-elasticsearch-logstash-kibana-%EC%8A%A4%ED%83%9D-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-4cbaf5dd4305](https://medium.com/naver-cloud-platform/%EB%84%A4%EC%9D%B4%EB%B2%84-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%ED%94%8C%EB%9E%AB%ED%8F%BC%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%B4-elk-elasticsearch-logstash-kibana-%EC%8A%A4%ED%83%9D-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-4cbaf5dd4305)* - *logstach / filebeat 비교 : [https://velog.io/@deet1107/logstash-filebeat](https://velog.io/@deet1107/logstash-filebeat)* - *ElasticSearch 이중화 : [https://nesoy.github.io/articles/2019-01/ElasticSearch-System-Architecture](https://nesoy.github.io/articles/2019-01/ElasticSearch-System-Architecture)* - *elasticsearch data 구조 : [https://koocci-dev.tistory.com/13](https://koocci-dev.tistory.com/13)* # 4. elasticsearch의 JAVA경로 설정 쉘에서는 java실행이 정상적으로 되고 있는데, Elasticseearch를 실행하면 java경로를 찾지 못하는 문제 발생. 근데! Elasticsearch를 실행시키면 java가 없덴다… 그래서 실행이 안됨. ```shell Sep  7 00:48:55 TEST elasticsearch: which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin) Sep  7 00:48:55 TEST elasticsearch: Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME Sep  7 00:48:55 TEST systemd: elasticsearch.service: main process exited, code=exited, status=1/FAILURE ``` java는 설치 잘 되어 있는데.... ```shell [root@TEST ~]# echo $JAVA_HOME /usr/local/java [root@TEST ~]# which java /usr/local/java/bin/java ``` 1. 해결책1. /etc/profile에 JAVA경로 잘 되어 있는지 확인 ```shell [root@TEST ~]# tail -4 /etc/profile PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$PATH ``` 2. 해결책2. Elasticsearch에 java경로를 설정 ```shell [root@TEST ~]# tail -1 /etc/sysconfig/elasticsearch JAVA_HOME=/usr/local/java ``` 설정하고 Elasticsearch실행하면 프로세스 실행되는게 확인되실꺼예요~ # 2. ELK Config 정보 ELK Stack Config Value 설명 1. Filebeat Config 정보 1. filebeat Log Config 값
**설정값****설 명****기본값**
paths수집할 경로 /var/log/message → /home/message /var/log/secure
recursive\_glob. enabledrecursive 패턴으로 확장 기능 활성화 true
encodingW3C에서 사용하는 인코딩 plain
exclude\_lines 로그 전달할때 전송하지 않을 줄 패턴
include\_lines 로그 전달할때 전송할 라인 패턴 모든라인의 데이터 전송
harvester\_buffer\_size harvester가 파일을 가지고 올때 사용하는 버퍼크기 16384(바이트 단위)
max\_bytes 단일 로그 메시지에 할당하는 최대 크기 10485760(10MB)
jsonson포맷으로 작성된 로그를 디코딩할떄 사용 (keys\_under\_root, overwrite\_keys, expand\_keys 중 하나이상 지정필요) · keys\_under\_root : 디코딩된 json은 json키 아래배치 · overwrite\_keys : 필드 추가시 충돌다는 필드는 덮어쓰기 수행 · expand\_keys : 추가 확인필요 · add\_error\_key : json이 정렬작업시 오류가 발생하면 error.message에 error.type: json키를 추가 · message\_key : 라인 필터링 혹은 멀티 라인이 적용되어 있는 경우 json키를 지정하 는 설정 · document\_id : 문서 id를 구성
multiline멀티라인의 메시지를 처리할떄 사용
exclude\_files path에 정의된 파일중 제외할 파일 리스트 목록
ignore\_older 지정된 시간 범위 이전에 수정된 파일은 전송 제외
close\_inactive 지정된 시간동안 수집되지 않은 경우 파일을 닫음
close\_renamed 파일이름이 변경될때 파일을 닫음
close\_removed파일이 제거될때 harverster 도 종료. true
close\_eof파일 끝에 도달하자마자 파일을 닫음 (한번만 작성하고 수시 업데이트시 유용) false
close\_timeout정해진 시간 초과하면 파일 닫음 0 (비활성화)
clean\_inactive inactive기간 경과하면 파일상태 제거
clean\_removed 마지막으로 읽은 파일이 없는 경우 레지스트리에서 파일정리 true
scan\_frequency 지정된 경로에서 새파일을 찾는 빈도 10(초단위)
tail\_files 각 파일 끝에서 새파일을 읽기 시작(rotate적용시 활용가능) false
symlinks 심볼릭링크된 파일 수집여부 false
backoff 열린파일을 얼마나 크롤링 하는지 확인 1(초단위)
max\_backoff 파일이 마지막에 도달한 후 다시 확인하기 전에 대기하는 시간 10(초단위)
backoff\_factoer backoff 시간이 대기하는 시간 2
harvester\_limit 하나의 입력에 대해 병렬로 수집하는 최대 harverster 갯수 0 (제한없음)
2.