시스템이야기2011. 4. 8. 13:06
Splunk(스플렁크) 솔루션은 '이런 솔루션이다'라고 하나의 명칭으로 정의하기가 쉽지않다. 그만큼 다양한 기능을 갖고 있고, 활용분야도 넓기 때문이다. 데이터(로그 등) 수집 & 실시간 검색부터 데이터 분석, 모니터링 등에 활용할 수 있는 솔루션으로 생각하면 될 것 같다.

splunk


Splunk는 어떤 기능을 가졌는가?
  • 로그 등 다양한 형태의 데이터를 수집할 수 있다. 데이터 포맷은 따지지 않는다. syslog, 네트웍 장비에서 보내주는 데이터, mail 로그, 오픈소스 IDS인 snort 로그, 웹로그, Nagios, squid, bind, Netflow,  Windows의 이벤트 로그 등 다양하다. 또한 포맷에 상관없이 운영자가 필요시 원하는 데이터를 수집할 수 있다. w, uptime, free등의 명령의 결과를 수집할 수도 있다는 얘기다.
  • 수집된 데이터를 검색할 수 있다.

splunk search

[ Splunk의 검색창 ]


  • 다양한 검색어를 지원한다. (정말 많다. ^^ : Search Reference Manual )
  • 검색된 결과를 그래프 또는 도표로 볼 수 있다. (보고서 기능)
  • 그래프, 도표들을 모아서 한페이지에서 모니터링을 할 수 있다. (대시보드)
  • 제공되는 다양한 apps를 설치할 수 있다. Splunk를 하나의 플랫폼으로 생각하면 된다. iOS,안드로이드가 하나의 플랫폼이고, 거기에 apps를 설치하는 것처럼.
  • 검색어를 지정해두고, 실시간 데이터에서 이 것을 찾게되면 alert되도록 설정을 할 수 있다. (error 로그가 검색되면 alert되도록 하면 좋다.)
  • 실시간으로 로그를 볼 수 있다. (쉘에서 tail -f 한 것처럼)
  • 시간지정이 가능하다. (최근 몇분에서 몇시간, 전체, 또는 특정일부터 특정일까지 등 다양하다.)
  • 한글화가 되어 있다.
2달동안 무료로 사용할 수 있는 버전을 Splunk 사이트( http://www.splunk.com/ )에서 받을 수 있다. 1일 500MB 데이터로 제한되어 있다. 설치와 Splunk 실행은 설명할 필요도 없이 간단하다.

Splunk 개략적 이용 과정은 이렇다.

데이터 수집 → 검색 유용한 필드 추출 보고서 작성 대시보드 생성

1. 어떠한 데이터를 수집할 것인지를 설정한다. (데이터 추가하기)
2. 수집된 데이터를 검색해본다.

이단계까지는 누구나 쉽게 할 수 있다. 여기까지만 이용하면 데이터 수집과 검색 용도로만 사용하게 되는 것이다. 이제부터 중요하다.

3. 의미있는 보고서(그래프나 도표)를 만들기 위해서는 수집된 데이터의 포맷을 파악해야 한다.
   이를 테면 네트웍 로그중에서 어떤 source IP를 많이 차단했는지, 어떤 프로토콜(TCP, UDP, ICMP 등) 비율이 많은지를 알고 싶다고 하자.
   로그 중에 Source IP가 있는 위치와 프로토콜이 있는 필드를 알아야 한다.
4. 로그 포맷을 파악하고, 정규식을 사용하여 필드 패턴을 추출한다. 추출한 패턴을 저장한다.
   정규식을 몰라도 필드 추출을 할 수 있도록 똑똑하게 만들어놨다. 그렇지만 정규식을 알면, 보다 정확하고 유연하게 적용이 가능하다. 
5. 이제 어떤 데이터를 통계화하여 볼 것인지 조건문(검색어)을 만들면 된다. 예를 들면 다음 처럼.

   host="network" denied | top ACL_denied_icmp limit=20 또는
   host="network" denied | top 20 ACL_denied_icmp

   로그 중에 denied 단어를 검색하고, 검색 결과에서 ACL_denied_icmp필드를 기준으로 상위 20개를 보여달라는 뜻이다.

splunk search

[ 검색어를 입력하여 통계화할 때(윗부분), 왼쪽 필드를 클릭했을 때(아래부분) ]

   위의 조건문을 모르더라도 통계화하는 방법을 제공한다. 얼마나 좋은가? 검색창 왼쪽 하단에 '선택된 필드'항목을 클릭하면 TOP 10조건을 보여준다.

6. 검색 결과를 보고서로 만든다. ('보고서 보기')
   이 때 보고서는 다양한 형태의 그래프 모양과 도표 등으로 표시를 할 수 있다.
7. 여러 검색 조건을 저장해두고 이를 모아서 대쉬보드를 만든다.

splunk dashboard

[ 트래픽 차단 대시보드의 일부분 (네트웍 장비(방화벽 등)에서 받은 데이터를 활용) ]



splunk dashboard

[ ID별 ssh login 대시보드 일부분 (syslog를 통해 받은 로그를 활용) ]


어느 정도 사용하다보면, 본인이 직접 apps를 만들 수 있을 것이다. 그리고 필드명, 검색어명, 대쉬보드명 등의 네이밍 요령도 생길 것이다.
XML를 사용하여 더 세세하게 설정할 수도 있을 것이다.

운영하면서 느낀 몇가지를 적는다.

  • 데이터가 많으면 속도가 느려졌다. '빠르다'라는 말만 강조하던 Splunk이지만, '빠르지만 느려지기도 하다'로 이해하면 될 것 같다.
  • 검색 대상시간은 전체보다는 1일, 7일, 4시간 등 특정 시간으로 제한하는게 효과적이다.
  • 웹로그를 수집하지는 말자. 한두대의 서버의 로그만 샘플링으로 수집한다고 하더라도 엄청난 양이 된다.  Splunk가 다른 일을 할 수 있도록 힘을 빼지 않는게 좋을 것이다. 웹로그 분석은 전용 서비스나 솔루션을 이용하는게 낫다.
  • SNMP로 데이터를 가져오는 부분이 보이지 않는다. (모르는 건가 없는건가)
  • 쉘에서도 검색할 수 있다.
  (예) ./splunk search '검색어' -auth (처음 한번은 인증과정이 필요해서 -auth사용)
  이를 활용하면 특정 조건(error 또는 지정한 임계치)이 발생하면 스크립트를 호출할 수 있다.
  또는 주기적으로 특정 검색 결과를 .txt(csv)로 저장할 수도 있다.

  #!/bin/bash
  CURR=`date +'%Y_%m%d_%H'`

  cd $SPLUNK_HOME/bin
  ./splunk search "denied udp | top ACL_denied_udp limit=10 | outputcsv denied_UDP_${CURR}" -auth

  $SPLUNK_HOME/var/run/splunk/ 경로에 denied_UDP_YYYY_MM_DD_HH.csv로 저장된다.

2개 업체('유섹'과 보안업체 출신이 세운 업체)에서 매달 무료 교육을 실시한다고 들었다. 들어보질 않아서 어떤 것을 교육하는지는 모르지만, 관심있으신 분은 신청해보시는 것도...

몇주간 사용중인데, Splunk는 굉장한 물건인 건 확실히다. Splunk를 포크레인으로 만들것이나 삽으로, 또는 숟가락 정도로 만들 것이냐는 엔지니어의 능력에 달렸다.

Posted by 좋은진호
시스템이야기2008. 11. 26. 01:19
MySQL서버는 log 옵션(my.cnf에서 log=파일명. slow query는 log-slow-queries=파일명)을 통해서 실행된 DB 쿼리를 모두 파일로 저장할 수가 있다. 그러나 DB 서버에서 작은 사이트가 아니고선 엄청난 양의 실시간 쿼리를 모두 쌓는다는 것은 힘들다. DB 운영도중에 잠시동안 쿼리 로그를 쌓겠다고 MySQL 재실행할 수도 없는 노릇이다. MySQL 5.1에서는 재실행없이 로그를 쌓을 것인지 안할 것인지를 결정할 수 있지만, 이부분은 뒤에서 설명하기로 하고, 패킷 스니핑 방법으로 실시간으로 살펴보는 방법을 소개한다.

Poor man’s query logging (Posted by Maciej Dobrzanski) 에서 tcpdump와 perl의 정규표현으로 실시간 쿼리를 살펴보는 괜찮은 방법을 소개하고 있다.

* 위 블로그에 올라온 간단한 명령
     # tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
   if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
      if (defined $q) { print “$q\n”; }
      $q=$_;
   } else {
      $_ =~ s/^[ \t]+//; $q.=” $_”;
   }
}’
    
위 명령을 활용하여 SELECT/UPDATE/DELETE/INSERT 등을 highlight 하도록 작성했다. highlight 에 대한 자세한 글은 '로그 모니터링시 특정 문자를 highlight하기 (2008.1, 글 좋은진호)'를 살펴보기 바란다.

* query_sniff.sh 내려받기
* query_view.pl 내려받기

[ MySQL 쿼리를 스니핑한 후 highlight. 'count'문자도 함께 highlight ]


MySQL 5.1에서는 쿼리를 로깅할지 안할지 여부를 재실행없이 변경할 수 있는 기능이 있다. 다음과 같이 로그 저장을 ON으로 설정할 수 있고, 필요없을 때 다시 OFF를 하면 된다.

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
... 생략 ...
SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';

파일이 아닌 테이블로 로그를 저장하려면 다음과 같이 설정한다.
SET GLOBAL log_output = 'TABLE';

log_output= 설정 값으로는 FILE, TABLE, NONE (log_output = 'FILE', log_output = 'TABLE', ..)을 지정할 수 있다. DB 테이블로 쿼리를 저장하게 되면 쿼리 전체는 general_log 테이블에, slow 쿼리는 slow_log 테이블에 각각 저장된다. general_log 테이블의 스키마는 다음과 같으며, slow_log 테이블은 query_time, lock_time 등 다른 형식의 데이터들이 저장된다.

mysql> desc mysql.general_log;
+--------------+-------------+------+-----+-------------------+-----------------------------+
| Field        | Type        | Null | Key | Default           | Extra                       |
+--------------+-------------+------+-----+-------------------+-----------------------------+
| event_time   | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host    | mediumtext  | NO   |     | NULL              |                             |
| thread_id    | int(11)     | NO   |     | NULL              |                             |
| server_id    | int(11)     | NO   |     | NULL              |                             |
| command_type | varchar(64) | NO   |     | NULL              |                             |
| argument     | mediumtext  | NO   |     | NULL              |                             |
+--------------+-------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

보다 자세한 것은 커피닉스에 써둔 'MySQL 쿼리 실시간 모니터링 및 저장하기'를 살펴보기 바란다.
Posted by 좋은진호