인프라 담당자로 경력을 쌓다 보니, 쿼리나 이런 부분에 대해서는 예전 호스팅업체를 다닐 때 mysql에서 select정도만 

사용해 보고 지식이 전무한 상태이다. Elastic Stack을 임시 구축하며 느끼기에 Elastic Stack에 대한 구축도 중요하지만

운영도 해야기에 껍질만 구축해선 안된다는 생각이 들었다.
그리고 정작 원하는 데이터를 가지고 알람 설정등을 진행해야하는데, 개발 인력의 도움 없이 혼자서 진행하려고 하니, 

구축은 어느정도 했으나  엘라스틱서치에 데이터 조회 부분부터 막막하여 , ElasticSearch의 기초적인 부분을 공부하고자 한다.

 

ElasticSearch 중요한 개념 두 가지

 

첫 번째. Documents 

데이터베이스적 관점에서 생각한다면 문서는 어떤 Entity를 나타내는 데이터베이스에서 한 줄의 행과 같은 역할을 하며 검색의 대상이다. 모든 문서는 유니크한 ID를 가지고 있으며 직접 할당할 수도 있다.

두 번째. Indices

 Index는 ES에서 쿼리 할 수 있는 가장 높은 단계의 Entity이며, 여러 문서를 포함할 수 있다. 데이터베이스로 치면 테이블과 같은 개념이다. Index는 데이터유형의 정의하는 체계가 있으며, 하나의 ES와 index에는 한 가지 유형의 Documents만 사용할 수 있다.

*기존 데이터베이스와 비교하자면, 클러스터(데이터베이스) 인덱스(테이블) 문서(행)로 생각하면 이해하기가 쉽다.

 

ElasticSearch 통신 방법 및 CRUD

*ElasticSearch는 RESTful API 기반으로  통신을 한다.

이는 HTTP요청과 응답으로 ElasticSearch와 소통을 한다는 의미이며, 아래와 같은 메서드 동작을 통해 소통한다.

HTTP 메서드 CRUD SQL
GET Read Select
PUT Update Update
POST Create Insert
DELETE Delete Delete

* CRUD란 (Create Read Update Delete)를 의미한다. 

 

Elastic Search 필터/쿼리 동작

필터명 필터동작 쿼리명 쿼리동작
terms 용어 필터 match_all 모두 반환되는 기본값,미지정시 모든결과반환
range gt(초과),gte(이상),lt(미만),lte(이하) match 특정 단어에 대한 검색
exist 존재여부 multi_match 여러필드 동시에 쿼리
missing 해당 필터가 없는문서 bool bool 필터와 동일
bool must(and),must not(not),shoud(or) match_phrase 구절 매치
(함께 붙어있어야함)
slop사용에 따라 변경

예시 )  
* index_test의 모든 값 반환

curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/index_test/_search?pretty -d '{ "query": { "match_all":{} } }'  | more


* secure_test index의 syslog에 pam이 포함되고, pid가 300000 이하인 값을 조회.

curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/secure-test/_search?pretty -d '{
"query": { "bool": { "must": { "term": {"syslog":"pam"}},"filter":{"range":{"pid": {"lte": 300000}}} } } }'

 

*구문 쿼리는 쿼리 블록으로 싸여있고, 필터는 필터 블록으로 싸여있으며 쿼리 내에서 필터블록 필터 내에서 쿼리를 사용할 수 있다.

 

* 구절 매치 쿼리 match_phrase의 경우 함께 붙어있어야 정상조회 되지만, "slop"을 사용 시에 단어 사이에 slop 수만큼 단어를 매치시킬 수 있다.

curl -XGET -H 'Content-Type: application/json' http://127.0.0.1:9200/secure-test-8.11.4-2024.02.01/_search?pretty -d '
{
"query": {
"match_phrase": {
"syslog_detail": {"query": "pam_unix(sshd:session): opened","slop":1}
}
}
}'

 * 결괏값 (pam_unix(sshd:session): 과 opened사이에 session이 들어갔으나 정상적으로 조회)

--중략--
"syslog_detail" : "pam_unix(sshd:session): session opened for user root by (uid=0)"

*추가로 반전된 구절도 매치할 수 있음, slop 1 설정 시 opend pam_unix(sshd:session): 와도 일치한다는 의미.

 

 

PCI-DSS 인증을 받게 되어, 기존에 없던 실시간 로그모니터링 시스템구축 프로젝트를 개인적으로 진행하게 되었다. 

로그모니터링 시스템은 상용툴도 있지만, 비용적인 측면을 고려하여 오픈소스 기반의 툴을 찾아보게 되었다.

여러 툴을 알아보던중 가장 유명한 ElasticSearch+Kibana+Logstash+Beats를 이용한 Elastic Stack으로 진행하게되었다.

 

1. 어떤방식으로 구성할것인가?

기본적으로 내부적으로 rsyslog를 통한 로그 수집 서버가 존재하여, 해당 서버에 beats를 올린뒤

로그모니터링 서버에 모니터링을 진행 할 특정 로그를 보내어,  

logstash를 통해 필요한 부분만 파싱하여 ElasticSearch에 보내고 Kibana를 통해 시각화 구성,

모니터링 룰에 따라 ElastAlert을 통해 Telegram 메시지를 발송하려고한다.

추가로 각서버에 MetricBeat를 통해 Metric 모니터링도 진행하고자한다. 로그분석서버의 경우 Docker-Compose를 통해 ELK를 같은 컨테이너 네트워크상에 구성해볼 예정이다.

 

 

2. 어떤 로그를 모니터링할것인가?

PCI-DSS 요건을 살펴보면  아래와 같이 매일 보안로그 및 보안이벤트가 검토되고있는지를 체크하는부분이 있다. 

PCI-DSS version 3.2.1 일부 발췌

모든 보안 장비 및 보안로그에 대한 모니터링이 이루어져야하지만,

1차적으로 운용중인 서버의 OS 보안 로그를 통해 적용해보고자 하며, 추후엔 보안 장비 로그까지 모니터링하고자한다.

 

 

+ Recent posts