Logpresso Rest API 자동 질의 프로그램
로그프레소 API 기능을 이용하여 In-Line 장비의 이벤트 로그를 쿼리 입력 없이 GUI 출력가능
자체 대시보드에서는 기간별 급증 및 순위 비교가 불가하여 제작
주요기능
- duration 설정 시간별 탐지건수 추이 및 순위 변경 비교
- 급증 이벤트 확인
- 신규진입 탐지 이벤트 확인
- 조건별(ip, port, event_name) 검색 기능
주의사항
- 실행 에러 시 아래 첨부파일(Win64OpenSSL_Light-1_1_1b.zip) 설치 후 실행
- 윈도우 환경에서 openssl 사용을 위한 프로그램
- 64bit 버전으로 32bit OS 사용시 아래 페이지에서 다운로드 후 설치
- http://slproweb.com/products/Win32OpenSSL.html
- 출력 값 Max = 500 라인으로 제한
① duration 설정 부분
- 1H, 6H, 12H, 1D, 7D 으로 비교 검색 가능
- ex) 1H 설정시 , 현재시각부터 1시간 전 탐지로그와 2시간전부터 1시간 전 탐지로그의 비교 검색
-
ex1) 상단 텍스트 박스 : 20190520 하단 텍스트 박스 : 20190522 => 2019.05.20 ~ 2019.05.22 사이의 이벤트만 출력 비교데이터가 없어서 순위변동, 건수변동 값이 없음
- ex2) 상단 텍스트 박스 : 20190513,20190519 하단 텍스트 박스 : 20190520,20190526 => 2019.05.13 ~ 2019.05.19 사이의 이벤트와 2019.05.20 ~ 2019.05.26 사이의 이벤트를 비교하여 출력, 비교데이터가 있기때문에 순위변동값과 건수변동 출력됨( 단, “ , “ 콤마가 있어야 from , to로 구분이 가능합니다. )
② from, to 설정 부분
- 쿼리 입력시 시간부분 설정하는 from, to 입력란(위 textline이 from 아래가 to) -> ex) 20190527
- 단, 해당 textline 입력시 duration 설정부분 적용안됨, 또한 해당 시간대에 대한 쿼리 결과를 가져오는 것으로 비교검색 안됨
③ 검색 장비 설정 부분
- NG_IPS_1,2, DDoS_IPS_1, 2, Wapple, paloalto_vulnerability, virus, url
④ 조건 검색 Textline 입력란
- src, dst_ip, src,dst_port, event_name 입력란으로 모두 And 조건으로 검색
- event_name 입력란은 자동으로 “*” 특수문자가 입력되어 있어서 특정 string으로 검색 가능
⑤ duration 으로 검색한 쿼리 결과 출력표
- 현재시각부터 duration 설정 시간 사이의 쿼리 결과값을 출력 -> 건수 : 해당 이벤트의 탐지건수 -> 순위변동 : duration 시간 기준 탐지로그 순위변경 값 -> 건수변동 : duration 시간 기준 탐지로그 차이 값(현재탐지로그 건수 - 이전 탐지로그건수) -> duration 값 기준으로 이전 쿼리 결과에 없던 이벤트가 현시간에 발생했을 경우 신규진입으로 출력
⑥ 급증 이벤트 출력표
- 기본값 5 count로 쿼리 결과 비교 하여 5계단 이상 상승한 이벤트 명과 변동값 출력
- spinbox로 변경가능
⑦ 신규진입 이벤트 출력표
- 신규진입 이벤트만 출력
⑧ src, dst_ip, src, dst_port 출력 표
- 검색 조건에 맞는 탐지로그의 src_ip, dst_ip, src_port, dst_port 결과 출력
실행 화면

source code
# -*- coding: utf-8 -*-
import sys
import urllib.request, re, sys, ssl
from typing import List
from datetime import date, timedelta
from bs4 import BeautifulSoup
import urllib.parse
#import numpy as np
import pandas as pd
from pandas import DataFrame as df, DataFrame
#from IPython.display import display
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5 import QtCore, QtGui, QtWidgets
# SSL 통신을 위한 설정
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
apikey = urllib.parse.quote("API Key")
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# 라디오 버튼 설정
def radioButtonClicked(self):
if self.NG_IPS_1.isChecked():
self.table_name = '''SYS_FirePower_Log_Event | search sensor_ip=="10.4.47.196"'''
self.group = "NG_IPS_1"
elif self.NG_IPS_2.isChecked():
중간생략
# 콤보박스 설정
def selectionChanged(self):
self.duration = self.Time_comboBox.currentText()
print(self.duration)
# 순위변동 값
def spinBoxChanged(self):
self.val = self.Jump_spinBox.value()
# 쿼리 생성
def query(self, name, group, du):
print("=====================================================================")
print("From : ", self.Time_from_lineEdit.text())
print("To : ", self.Time_to_lineEdit.text())
print("Src_IP : ", self.Src_IP_lineEdit.text())
print("Dst_IP : ", self.Dst_IP_lineEdit.text())
print("Src_Port : ", self.Src_port_lineEdit.text())
print("Dst_Port : ", self.Dst_port_lineEdit.text())
print("event_name : ", self.Attack_name__lineEdit.text())
print("=====================================================================")
src_ip = '''''' # Src_IP_lineEdit
dst_ip = '''''' # Dst_IP_lineEdit
src_port = '''''' # Src_Port_lineEdit
dst_port = '''''' # Dst_Port_lineEdit
attack_name = '''''' # Attack_name__lineEdit
# ==================================================================================================
중간 생략
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('Fusion'))
myWindow = MyWindow()
myWindow.show()
app.exec_()