通信プロトコルとデータフォーマットとGETフレームによって達成OSSIM OSSIMプロキシサーバとの間OSSIMセンサ変換します。のは、簡単にossim-エージェントスクリプトを見てみましょう:
#!は/ usr / binに/ Pythonの-OOt
インポートSYSの
sys.path.append( 'は/ usr /レポートこのコンテンツ共有/ ossimエージェント/')
sys.path.append(「は/ usr /ローカル/共有/ OSSIM剤/「)
ossim_agent.Agentインポートから-エージェントの
エージェント-エージェント=()
agent.main()
OSSIMプロキシサーバOSSIMにデータを搬送するにつれそれがあるべきです。二つの主な操作はしっかり「生成」(または)「マッピングのマッピング」)とOSSIM「トランスポート」サーバにそのようなデータのOSSIM互換性のイベントに必要な統合されて達成します。それは、図4に示すようにフレームワークは、イベントハンドラと送信側エージェントをGETように、2つの構成要素の動作を担当します。
図1は、OSSIMにフレームコンテンツを取得します
主なタスクは、標準化された形式SIEMインスタンスのアラートをOSSIMするイベントのイベントハンドライベント・データ・ソースのプラグインのコレクションをマッピングすることです。このような処理を実行するために、元のメッセージは、既存の生ログ正規化されたデータのフィールド形式からの移行への遷移を受け、これらの機構上図の「正規化された正規化」と表記され、「OSSIMメッセージがあります。」ログ正規化されたコードの一部:
ロガーロガーインポートから
はmktime時間インポート、のstrptimeから
ロガー= Logger.loggerの
クラスイベント:
EVENT_TYPE =「イベント」
EVENT_ATTRS = [
「タイプ」、
「DATE」、
「センサ」、
「インターフェース」、
「 plugin_id "
"plugin_sid"、
"優先度"、
"プロトコル"、
"src_ipに"、
"src_port"、
"dst_ip"、
"dst_port:送信"、
"ユーザ名"、
"パスワード"、
"ファイル名"、
"
"userdata6"、
"userdata7"、
"userdata8"、
"userdata9"、
"発生"、
"ログ"、
"データ"、
"snort_sid"、特定のSnort#
"snort_cid"、特定のSnort#
"FDATE"、
"TZONE"
]
def __init__(self):
self.event = {}
self.event["event_type"] = self.EVENT_TYPE
def __setitem__(self, key, value):
if key in self.EVENT_ATTRS:
self.event[key] = self.sanitize_value(value)
if key == "date":
# The date in seconds anf fdate as string
self.event["fdate"]=self.event[key]
try:
self.event["date"]=int(mktime(strptime(self.event[key],"%Y-%m-%d %H:%M:%S")))
except:
logger.warning("There was an error parsing date (%s)" %\
(self.event[key]))
elif key != 'event_type':
logger.warning("Bad event attribute: %s" % (key))
def __getitem__(self, key):
return self.event.get(key, None)
# 事件表示
def __repr__(self):
event = self.EVENT_TYPE
for attr in self.EVENT_ATTRS:
if self[attr]:
event += ' %s="%s"' % (attr, self[attr])
return event + "\n"
# 返回内部哈希值
def dict(self):
return self.event
def sanitize_value(self, string):
return str(string).strip().replace("\"", "\\\"").replace("'", "")
クラスEventosの(イベント):
EVENT_TYPE = 'ホストOSイベント'
EVENT_ATTRS = [
"ホスト"、
"OS"、
"センサ"、
"インターフェース"、
"日付"、
"plugin_id"、
"plugin_sid"、
"発生"、
、 "ログ"
、 "FDATEを"
]
クラスEventMac(イベント):
EVENT_TYPE = 'ホストMAC-イベント'
EVENT_ATTRS = [
"ホスト"、
"MAC"、
"ベンダー"、
"センサ"、
"インターフェース"、
"日付"、
"plugin_id"、
"plugin_sid"、
"出現"、
"ログ"、
"FDATE"、
]
クラスのEventService(イベント):
EVENT_TYPE = 'ホストサービスイベント'
EVENT_ATTRS = [
"ホスト"、
"センサ"、
"インターフェース"、
"ポート"、
"プロトコル"、
"サービス"、
"アプリケーション"、
"日付"、
"plugin_id"、
"plugin_sid"、
"出現"、
"ログ"、
"FDATE"、
]
クラスEventHids(イベント):
EVENT_TYPE = 'ホストIDS-イベント'
EVENT_ATTRS = [
"ホスト"、
"ホスト名"、
"hids_event_type"、
"ターゲット"、
"何を"、
"extra_data"、
"センサ"、
"日付"、
"plugin_id"、
"plugin_sid"、
"ユーザ名"、
"パスワード"、
"ファイル名"、
"userdata1"、
"userdata2"、
"userdata3"、
"userdata4"、
"userdata5"、
"userdata6"、
"userdata7"、
「userdata8 "
"userdata9"、
"出現」、
""、ログインし
、 "FDATEを"
]
クラスWatchRule(イベント):
EVENT_TYPE = 'event'
EVENT_ATTRS = [
"type",
"date",
"fdate",
"sensor",
"interface",
"src_ip",
"dst_ip",
"protocol",
"plugin_id",
"plugin_sid",
"condition",
"value",
"port_from",
"src_port",
"port_to",
"dst_port",
"interval",
"from",
"to",
"absolute",
"log",
"userdata1",
"userdata2",
"userdata3",
"userdata4",
"userdata5",
"userdata6",
"userdata7",
"userdata8",
"userdata9",
"filename",
"username",
]
クラスのSnort(イベント):
EVENT_TYPE = 'Snortのイベント'
EVENT_ATTRS =
"センサ"、
"インターフェース"、
"gzipdata"、
"unziplen"、
"EVENT_TYPE"、
"plugin_id"、
"タイプ"、
"発生"
]
日志编码代码:
インポートスレッド、時間
ロガー輸入ロガーから
ロガー= Logger.logger
出力インポート出力からの
インポートコンフィグ
インポートイベント
しきい値輸入EventConsolidationから
統計の輸入統計から
ConnPro輸入ServerConnProのから
クラス検出器(threading.Thread):
デフのinit(自己、CONF、プラグインは、CONN):
self._conf = conf
self._plugin = plugin
self.os_hash = {}
self.conn = conn
self.consolidation = EventConsolidation(self._conf)
logger.info("Starting detector %s (%s).." % \
(self._plugin.get("config", "name"),
self._plugin.get("config", "plugin_id")))
threading.Thread.__init__(self)
def _event_os_cached(self, event):
if isinstance(event, Event.EventOS):
import string
current_os = string.join(string.split(event["os"]), ' ')
previous_os = self.os_hash.get(event["host"], '')
if current_os == previous_os:
return True
else:
# Fallthrough and add to cache
self.os_hash[event["host"]] = \
string.join(string.split(event["os"]), ' ')
return False
def _exclude_event(self, event):
if self._plugin.has_option("config", "exclude_sids"):
exclude_sids = self._plugin.get("config", "exclude_sids")
if event["plugin_sid"] in Config.split_sids(exclude_sids):
logger.debug("Excluding event with " +\
"plugin_id=%s and plugin_sid=%s" %\
(event["plugin_id"], event["plugin_sid"]))
return True
return False
def _thresholding(self):
self.consolidation.process()
def _plugin_defaults(self, event):
# 从配置文件中获取默认参数
if self._conf.has_section("plugin-defaults"):
# 1) 日期
default_date_format = self._conf.get("plugin-defaults",
"date_format")
if event["date"] is None and default_date_format and \
'date' in event.EVENT_ATTRS:
event["date"] = time.strftime(default_date_format,
time.localtime(time.time()))
# 2) 传感器
default_sensor = self._conf.get("plugin-defaults", "sensor")
if event["sensor"] is None and default_sensor and \
'sensor' in event.EVENT_ATTRS:
event["sensor"] = default_sensor
# 3) 网络接口
default_iface = self._conf.get("plugin-defaults", "interface")
if event["interface"] is None and default_iface and \
'interface' in event.EVENT_ATTRS:
event["interface"] = default_iface
# 4) 源IP
if event["src_ip"] is None and 'src_ip' in event.EVENT_ATTRS:
event["src_ip"] = event["sensor"]
# 5) 时区
default_tzone = self._conf.get("plugin-defaults", "tzone")
if event["tzone"] is None and 'tzone' in event.EVENT_ATTRS:
event["tzone"] = default_tzone
# 6) sensor,source ip and dest != localhost
if event["sensor"] in ('127.0.0.1', '127.0.1.1'):
event["sensor"] = default_sensor
if event["dst_ip"] in ('127.0.0.1', '127.0.1.1'):
event["dst_ip"] = default_sensor
if event["src_ip"] in ('127.0.0.1', '127.0.1.1'):
event["src_ip"] = default_sensor
# 检测日志的类型
if event["type"] is None and 'type' in event.EVENT_ATTRS:
event["type"] = 'detector'
return event
def send_message(self, event):
if self._event_os_cached(event):
return
if self._exclude_event(event):
return
#对于一些空属性使用默认值。
event = self._plugin_defaults(event)
# 合并之前检查
if self.conn is not None:
try:
self.conn.send(str(event))
except:
id = self._plugin.get("config", "plugin_id")
c = ServerConnPro(self._conf, id)
self.conn = c.connect(0, 10)
try:
self.conn.send(str(event))
except:
return
logger.info(str(event).rstrip())
elif not self.consolidation.insert(event):
Output.event(event)
Stats.new_event(event)
def stop(self):
#self.consolidation.clear()
pass
#在子类中重写
デフプロセス(自己):
渡す
(自己)を実行デフ:
self.process()
クラスParserSocket(検出器):
デフ・プロセス(自己):
self.process()
クラスParserDatabase(検出器):
デフプロセス(自己):
self.process()
... ...
上記から分かるように、正規化されたセンサーは、ログのデータフィールドのそれぞれを再符号化の主な原因であり、それはOSSIMサーバを完了するための伝送のために新たなイベントを生成することができます。達成するために、この目的のGETフレームワークは、フィールドのBASE64変換を必要なすべての機能を変換するために、特定の機能の数が含まれています。オリジナルイベント「OSSIMメッセージは、」存在しないフィールドを埋めるための世代が責任をGET。そうplugin_id上に話す、plugin_sid必須フィールド発生SIEMイベントでログメッセージタイプとサブタイプのソースを示すために使用されます。あなたは、ソースまたは宛先IP、システムのデフォルト0.0.0.0を確認することはできません時々イベントの完全フォーマットは、フィールドを移入するために使用されます。
注:必須フィールドは、我々はOSSIMのphpMyAdminはMySQLデータベースを表示するには、このツールを使用することができます。
送信側エージェントは、次の2つのタスクを完了するための責任がある:
イベントOSSIMによって収集GETでフォーマットされた送信するためには、アップこのタスクイベントハンドラメッセージ・キューによって作成されたメッセージはミドルウェアにメッセージを送信するためにサーバーに送信され、タイミング図を図2に示します示しています。
図シーケンス図2:サーバーイベントOSSIMを確保するために、ログ検出器からの変換
2)通信、管理サーバOSSIMのGETフレームワークとの間の通信ポートと双方向ハンドシェイクによってTCP 40001として実装。標準化から元のログイベントを抽出する手段を提供し、ログアーカイブの元のログを保持しながら、正規化された生ログは、正規化処理のログに、OSSIM正規化プロセスの重要な部分です。
図に示すように、イベントの正規化の後、MySQLデータベースに格納されています。次に優先順位、信頼性の相互相関分析、リスクおよび問題警報情報の種々の値の規則に従ってアソシエーション・エンジンパラメータによって進行します。
図3ログ記憶機構
我々は例を見て次に、ここで元の期間は、図3に示すようにApache、CiscoASAおよびSSH、4、5、6ログです。
図4Apache生ログ
図5のCisco ASA生ログ
図6 SSH生ログが
再び後に正規化され、実際のOSSIM上で、エンドWebフロントを通じて誰でも読みやすい形式に表示されます。生ログと私たちを取り扱い後コントラストメソッドの戻り値のイベント「オープンソースセキュリティ運用・保守プラットフォームの解決が困難OSSIM:初心者は、」本は説明します。
治療後のApacheのアクセスログが所有する7
例では、図に示した。これらUserdata3〜Userdata9拡張ビットを使用していない、唯一Userdata1とUserdata2を使用して、7を主にターゲットアドレスがIPアドレスとしてマークされている他のデバイスやサービスのために予約されています例えば:Host192.168.11.160。この正規化プロセスは、実際に収集し、ストレージシステムイベントの後に発生し、分析前に関連するデータは、SIEMツール取得処理をよりすることができるフォーマットされたデータを使用して、人間が読める形式にデータを変換します理解しやすいです。