Splunk Alert을 Telegram을 통해 받는 방법

Splunk Alert을 Telegram으로 보내는 webhook relay 구성입니다. Splunk webhook JSON을 내부 Python relay가 받아 Telegram sendMessage로 변환하고 secret env로 토큰을 분리합니다.

Splunk Alert을 Telegram으로 보내는 가장 단순한 운영 구조는 Splunk의 webhook alert action을 내부 relay URL로 보내고, relay가 Telegram Bot API를 호출하는 방식입니다. Splunk webhook은 alert 정보를 JSON으로 POST하고, Telegram sendMessage는 chat_id와 text를 요구하므로 중간 변환 계층을 두는 편이 안전합니다.

구성 흐름

  1. Telegram bot과 chat_id를 준비합니다.
  2. Splunk에서 webhook alert action을 내부 relay URL로 설정합니다.
  3. relay는 Splunk JSON에서 alert 이름과 결과 요약을 뽑아 Telegram으로 전송합니다.
  4. Telegram token은 relay 서버의 env 파일에만 보관합니다.

relay 환경 파일

sudo install -d -m 750 /etc/splunk-telegram-relay
sudo install -m 640 /dev/null /etc/splunk-telegram-relay/env
sudo editor /etc/splunk-telegram-relay/env
TELEGRAM_BOT_TOKEN=REPLACE_WITH_BOT_TOKEN
TELEGRAM_CHAT_ID=REPLACE_WITH_CHAT_ID
LISTEN_HOST=127.0.0.1
LISTEN_PORT=9088

간단한 Python relay

#!/usr/bin/env python3
import json
import os
import urllib.parse
import urllib.request
from http.server import BaseHTTPRequestHandler, HTTPServer

TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
CHAT_ID = os.environ["TELEGRAM_CHAT_ID"]

def send_telegram(text: str) -> None:
 data = urllib.parse.urlencode({"chat_id": CHAT_ID, "text": text[:3900]}).encode()
 url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
 req = urllib.request.Request(url, data=data, method="POST")
 urllib.request.urlopen(req, timeout=10).read()

class Handler(BaseHTTPRequestHandler):
 def do_POST(self):
 length = int(self.headers.get("content-length", "0"))
 payload = json.loads(self.rfile.read(length) or b"{}")
 search_name = payload.get("search_name") or payload.get("sid") or "Splunk Alert"
 result = payload.get("result") or {}
 result_text = json.dumps(result, ensure_ascii=False)[:1200]
 send_telegram(f"[Splunk] {search_name}\\n{result_text}")
 self.send_response(204)
 self.end_headers()

if __name__ == "__main__":
 host = os.environ.get("LISTEN_HOST", "127.0.0.1")
 port = int(os.environ.get("LISTEN_PORT", "9088"))
 HTTPServer((host, port), Handler).serve_forever()

실서비스에서는 systemd unit으로 관리하고, relay를 Splunk 서버 내부망에서만 접근 가능하게 둡니다.

Splunk webhook 설정

Splunk 공식 문서에 따르면 webhook alert action은 alert 발생 시 지정 URL로 JSON POST를 보냅니다. Splunk Web에서 alert를 만들고 Add Actions에서 Webhook을 선택한 뒤 relay URL을 입력합니다.

http://127.0.0.1:9088/

Splunk와 relay가 다른 서버라면 방화벽과 인증을 추가해야 합니다. 외부 인터넷에 relay를 직접 열지 않는 것이 좋습니다.

테스트

curl -sS -X POST http://127.0.0.1:9088/ \
 -H 'Content-Type: application/json' \
 -d '{"search_name":"relay test","result":{"host":"localhost","level":"INFO"}}'

운영 주의사항

Splunk alert 결과에는 내부 IP, 사용자명, 로그 내용이 들어갈 수 있습니다. Telegram 메시지는 필요한 요약만 보내고, 상세 분석은 Splunk search link나 dashboard로 연결하는 방식이 안전합니다. token과 chat_id는 Splunk alert action 본문에 직접 넣지 말고 relay의 secret env로 분리하세요.

공식 문서

BGM EVER