閱讀377 返回首頁    go 技術社區[雲棲]


態勢感知 + DataV:安全可視化交互,這麼玩兒


image


在安全領域,“看見”的能力很大程度上影響著風險防禦的有效性。將未知的風險以可視化的方式展示,讓企業安全團隊有“踏實感”和“存在感”。

在安全可視化上,阿裏雲首批MVP,千尋位置安全負責人傅奎想出了“跨界玩法”,用阿裏雲的兩大產品:態勢感知和DataV,實現交互式安全威脅發現。

Let's Make It True.

文章介紹的,是如何使用DataV大屏展現態勢感知 DNS 會話日誌,從而實現交互式安全威脅發現。

劇透一下最終效果,絕對值得試試:

所有 DNS 日誌的節點(源地址、DNS服務器地址、要解析的域名)關係圖。點選其中任一節點,關聯點自動高亮,非關聯節點則進入蒙版狀態,要是有什麼可疑的節點、關係、類目,一眼就看出來!


image
image

自打“態勢感知”上線了新版的“日誌”功能,團隊成員就在摩拳擦掌尋思如何充分挖掘日誌信息的價值,而不僅僅是用於故障診斷或事件調查。

其中,通過圖形化展現不同網絡資源節點的相互關係,進而實現交互式安全威脅發現,是最為理想的實現方式。此前嚐試過 Graphviz、yEd、NetworkX 等方式,後來都因配置複雜,使用繁瑣等問題放棄。

直到MVP 技術群裏李文毅向大家推薦了 DataV,我想:是時候“make it true ”了!

以下材料援引自官方介紹,描述不準與我無關:

  • 態勢感知

“態勢感知提供的是一項SAAS服務,即在大規模雲計算環境中,對那些能夠引發網絡安全態勢發生變化的要素進行全麵、快速和準確地捕獲和分析,並提供一個體係化的安全解決方案。”

  • DataV 數據可視化

“DataV旨讓更多的人看到數據可視化的魅力,幫助非專業的工程師通過圖形化的界麵輕鬆搭建專業水準的可視化應用。DataV提供豐富的可視化模板,滿足您會議展覽、業務監控、風險預警、地理信息分析等多種業務的展示需求。”

態勢感知的日誌功能非常強大,目前支持查詢:所有入站的7層數據、出入站棧的4層會話以及DNS雙向日誌。其中 DNS 日誌有助於安全團隊分析服務器是否遭受入侵,被植入木馬病毒,存在異常請求等問題。

我們最關心的是:哪台服務器,通過哪個 DNS Server,解析了哪個域名?

針對該需求,如果有可視化的節點關係圖輔助分析,那麼威脅識別的效率將大幅提升。在沒有使用 DataV 之前,通常的辦法是使用一些圖表工具進行展現,而且少不了定製化開發的工作量。DataV 的出現,大大解放了數據分析人員的雙手,從而可以用於拖動進度條。僅僅通過少量的鼠標點擊和基本的 API 配置,就能瞬間讓你的數據充滿活力,開口說話。DataV 自帶節點關係圖,並內嵌原生ECharts ,完全可以滿足此類需求。

你一定很期待強勁的態勢感知與性感的 DataV強強聯合會是什麼樣子。期待不如行動,我們一起動手去實現吧。

登錄阿裏雲控製台,進入安全(雲盾)| 態勢感知功能頁,通過子菜單選擇日誌 new項目。


image


設置DNS 日誌查詢條件,分別是:

  • 日誌源:DNS
  • 字段:qtype
  • 判斷條件:包含(目前隻能選包含)
  • 關鍵字:A

再設置好查詢時間,點擊搜索就可以啦。


image


係統很快就能返回查詢結果,通過右上角導出結果將當前頁(沒錯,,是當前頁,,一次100條-_-)日誌導出到Excel 中。如果需要更多數據,得依次翻頁導出-_-。當然也有程序化解決方案,請往後看。


image

對導出的 Excel 文件進行數據抽取,關鍵是:

  • 源地址:src_ip
  • DNS Server:dst_ip
  • 嚐試解析的域名:qname


image

將源地址、DNS 地址、域名三項都納入節點範疇,同時將源地址->DNS 地址、DNS 地址->域名納入關係範疇,通過 HTTP 將節點 nodes 和關係 links 輸出為 JSON 就是一個可用的API數據輸入源。

別著急,作為良心分享,怎麼能少了技術細節呢?

為了不影響閱讀,我把數據格式化和 API 相關的具體內容放在後麵環節。

通過阿裏雲控製台大數據(數加)| DataV數據可視化進入定製界麵,直接選擇新建可視化。


image


創建大屏模板,設置一個你喜歡的名字。


image


向大屏圖層添加數據展示組件, 這裏可以選擇關係網絡或原生的 Echarts 網絡圖。


image


點選圖表組件,進入右側數據選項卡,修改默認的數據源類型靜態數據為 API。


image


填寫滿足係統要求的 API,如:https://www.test.com/datav.json ,鼠標離開輸入框,左側設計區會即時展現效果。


image

數據調試和預覽成功後,可通過右上角的發布按鈕,正式發布報表。DataV 考慮得很周到,為報表提供了密碼和 Token 兩種安全保護機製。


image

訪問發布後的報表鏈接:https://datav.aliyun.com/share/ef9aa**********a3fd8 (這是他們的秘密不可訪問的哈)

image


好吧,放一些我在測試環境模擬出來的數據。下麵是一段時間內,所有 DNS 日誌的節點(源地址、DNS服務器地址、要解析的域名)關係圖。


image


點選其中任一節點,關聯點自動高亮,非關聯節點則進入蒙版狀態,相當炫酷啊!


image

來,再看另外一組測試數據。要是有什麼可疑的節點、關係、類目,一眼就看出來!

image


小提示:萬一發現了什麼神奇的域名或 IP 地址,可以直接上微步威脅情報查詢,例如:https://x.threatbook.cn/domain/google.com 。是不是壞人立即遁形,這個庫太全了……

替你踩過的坑

  • 如果不打算使用服務器代理方式調用API,那麼一定要設置好 API 的 HTTP 頭部跨域參數
  • 如果使用了 HTTPS 訪問DataV 監控大屏,那麼 API 接口也必須是 HTTPS 形式
  • API 接口返回的數據要和靜態數據輸入框中的格式完全一樣——JSON 串
  • 如果你遇到了一些神奇的 Bug,請把圖層或組件刪除後從頭再來一遍(不要問我怎麼知道的)
  • DataV 自帶的關係圖和內嵌的原生 ECharts 在數據格式上有一定的區別,要看仔細

Show you the code

下麵這段代碼可以幫助使用者在登錄態勢感知後,自動獲取 DNS 會話日誌,並按照 DataV 關係圖所適配的數據格式生成 JSON 串。非專業開發人員的臨時代碼,寫得比較醜,別太當真。

#!/usr/bin/python# -*- coding:utf8 -*-import json# pip install requestsimport requests# 成功登錄態勢感知後,通過 Chrome 複製當前會話的 Cookie。cookie_str = 'aliyun_country=CN; aliyun_site=CN;'\             'UM_distinctid=***; JSESSIONID=***; '\             'consoleNavVersion=1.1.1; _yundun_session0=***; '\             'aliyun_choice=CN; isg=***E-'nodes_client = []  # 客戶端 IPnodes_server = []  # DNS Server IPnodes_domain = []  # 解析的域名def get_yundun_DNS_log(http_session=None, page_num = 1):
    """
    訪問阿裏雲後台,請求 DNS 日誌
    :param http_session: requests.session()
    :param page_num: page number
    :return: HTTP Response
    """
    global cookie_str
    url = 'https://yundun.console.aliyun.com/sas/slssearch/'\          'getLogList.json?__preventCache=1500********2&_timeScope=1800000'\          '&currentPage=%d&endTime=2017-07-19+19:00:00'\          '&pageSize=100&query=dns@qtype:A&reverse=true'\          '&startTime=2017-07-19+12:30:00'
    req = http_session.request('GET', url=(url % page_num), 
                                headers={'cookie': cookie_str})
    if req.status_code == 200:
        return req.text    return {}def get_group_name(node):
    """
    根據不同的節點類型,返回不同的類目組。相同組的節點將使用相同的顏色顯示。
    :param node: node_name
    :return: group_name
    """
    global nodes_client, nodes_server, nodes_domain    if node in nodes_client:
        return 'group1'
    if node in nodes_domain:
        if 'ali' in node:
            return 'group2'
        return 'group3'
    if node in nodes_server:
        if node in ('114.114.114.114'):
            return 'group4'
        if node.startswith('192'):
            return 'group5'
    return 'group6'def get_DNS_log_json_list():
    """
    返回所有 DNS 日誌記錄 JSON
    :return:
    """
    dns_log_json = []
    sessionX = requests.session()
    # 翻頁10次
    for i in range(10):
        res = get_yundun_DNS_log(sessionX, i+1)
        log_json = json.loads(res)
        dns_log_json += log_json['data']['list']
    return dns_log_jsondef geenrate_nodes_and_links():
    """
    生成所有節點和關係的List
    :return: (nodes[], links[])
    """
    global nodes_client, nodes_server, nodes_domain
    nodes = []  # 所有節點
    links = []  # 所有關係
    for log in get_DNS_log_json_list():
        (client, domain, server) = ('','','')
        for mContent in log['mContents']:
            if mContent['mKey'] == 'src_ip':
                client = mContent['mValue']
            if mContent['mKey'] == 'qname':
                domain = mContent['mValue']
            if mContent['mKey'] == 'dst_ip':
                server = mContent['mValue']
        if client == '' or domain == '' or server =='':
            continue
        #print (client, domain, server)

        if domain == 'shcmsproxy.aliyun.com':
            continue

        if client not in nodes_client:
            nodes_client.append(client)
        if client not in nodes:
            nodes.append(client)

        if domain not in nodes_domain:
            nodes_domain.append(domain)
        if domain not in nodes:
            nodes.append(domain)

        if server not in nodes_server:
            nodes_server.append(server)
        if server not in nodes:
            nodes.append(server)

        if (client, server) not in links:
            links.append((client, server))
        if (server, domain) not in links:
            links.append((server, domain))
    return (nodes, links)def get_datav_json():
    (nodes, links) = geenrate_nodes_and_links()
    graph = {'nodes':[], 'links':[]}

    for node in nodes:
        graph['nodes'].append({
                "imgPath": "",
                "name": node,
                "type": get_group_name(node)
        })
    for link in links:
        graph['links'].append({
                "source": link[0],
                "target": link[1],
                "value": 10
        })
    return '[%s]' % json.dumps(graph)if __name__ == '__main__':
    print get_datav_json()

以下是API輸出結果示例:

[
  {
    "nodes": [
      {
        "imgPath": "",
        "name": "192.168.1.1",
        "type": "group1"
      },
      {
        "imgPath": "",
        "name": "114.114.114.114",
        "type": "group2"
      },
      {
        "imgPath": "",
        "name": "taobao.com",
        "type": "group3"
      }
    ],
    "links": [
      {
        "source": "192.168.1.1",
        "target": "114.114.114.114",
        "value": 10
      },
      {
        "source": "114.114.114.114",
        "target": "taobao.com",
        "value": 15
      }
    ]  }
]

將上述內容作為企業自身 API 接口的輸出,同時設置 HTTP HEAD 相關的參數,即可通過 DataV 大屏調用並展現啦!

self.set_header('Access-Control-Allow-Origin', '*.aliyun.com')self.set_header('Content-Type', 'application/json;charset=UTF-8')

這篇文章的標題中有兩個字我很喜歡:“交互”。

除了視圖上的交互,實際上使用者還花了很長的時間用在態勢感知日誌查詢、 導出和格式化上。

這也算是一種“交互”,一種比較笨的交互。希望未來阿裏雲能在多個產品之間的數據引用、內部接口交互上再做些升級,讓我們這樣的使用者少發揮技能,直到我們徹底“自廢武功”。

來源:阿裏雲安全
原文鏈接

最後更新:2017-08-28 10:02:42

  上一篇:go  如何破解中國交通擁堵? 世界頂級算法工程師都來了
  下一篇:go  Mongodb學習記錄:入門(一)——五葉草