コマンドラインで SDEE イベントをCSV化する

  • センサーのSDEEサーバCGIからセッションキーを受け取り,そのキーでイベントを取出すため,2回に分けてアクセスが必要
  • 取得データはXMLであるため, xsltprocでパースして整形する
  • 最大500イベントまでしか取得できない.
  • 開始時刻を date -d '1 days ago' '+%s000000000' 等で定めておく
  • wget --no-check-certificate -q -O - 'https://センサーのIP/cgi-bin/sdee-server?'`wget --no-check-certificate -q -O - --http-user="cisco" --http-password="パスワード" "https://センサーのIP/cgi-bin/sdee-server?action=open&force=yes&events=evIdsAlert&idsAlertSeverities=Informational+low+medium+high&startTime=開始時刻" | xsltproc sdee-session.xsl - ` | xsltproc sdee-tsv.xsl -
  • セッションキーを切り出し, CGIへ渡すパラメータに整形する sdee-session.xsl
    • 名前空間を使用しているので, xmlnsの定義行が必要.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:sd="http://example.org/2003/08/sdee" xmlns:cid="http://www.cisco.com/cids/2006/08/cidee">

  <xsl:output method="text" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates select="env:Envelope" />
  </xsl:template>

  <xsl:template match="env:Envelope">
    <xsl:text>action=get&amp;sessionId=</xsl:text>
    <xsl:apply-templates select="env:Header" />
    <xsl:text>&amp;subscriptionId=</xsl:text>
    <xsl:apply-templates select="env:Body" />
  </xsl:template>

  <xsl:template match="env:Header">
    <xsl:apply-templates select="sd:oobInfo" />
  </xsl:template>

  <xsl:template match="sd:oobInfo">
    <xsl:value-of select="sd:sessionId" />
  </xsl:template>

  <xsl:template match="env:Body">
    <xsl:value-of select="sd:subscriptionId" />
  </xsl:template>

</xsl:stylesheet>
  • イベント時刻, IPアドレスなどを切り出し, タブ区切りにする sdee-tsv.xsl
  • 元のデータは, サービスアカウントでログインしたとき, /usr/cids/idsRoot/var/eventStore/IdsEventStore に格納されている. このcontextデータはバイナリのまま.
    • xsltproc はビルトインテンプレートを持っており,定義されていないテンプレートに対してあらゆるテキストデータを拾い出してしまう. env:Headerからの出力を抑制するため, 存在しないselectを記述
    • なぜか/のテンプレートでenv:Bodyだけをselectさせても正しい動作にならない.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:sd="http://example.org/2003/08/sdee" xmlns:cid="http://www.cisco.com/cids/2006/08/cidee">

  <xsl:output method="text" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates select="*" />
  </xsl:template>

  <xsl:template match="env:Header">
    <xsl:apply-templates select="NONE" />
  </xsl:template>

  <xsl:template match="env:Body">
    <xsl:apply-templates select="sd:events" />
  </xsl:template>

  <xsl:template match="sd:events">
    <xsl:apply-templates select="sd:evIdsAlert" />
  </xsl:template>

  <xsl:template match="sd:evIdsAlert">
    <xsl:value-of select="sd:time" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="@eventId" />
    <xsl:text>&#09;</xsl:text>
    <xsl:apply-templates select="sd:participants" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="cid:protocol" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="cid:threatRatingValue" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="cid:riskRatingValue" />
    <xsl:text>&#09;</xsl:text>
    <xsl:apply-templates select="sd:signature" />
    <xsl:text>&#09;</xsl:text>
    <xsl:comment>
    <xsl:apply-templates select="cid:context" />
    </xsl:comment>
    <xsl:text>&#10;</xsl:text>
  </xsl:template>

  <xsl:template match="sd:signature">
    <xsl:value-of select="@id" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="cid:subsigId" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="cid:sigDetails" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="@description" />
  </xsl:template>

  <xsl:template match="sd:participants">
    <xsl:apply-templates select="sd:attacker" />
    <xsl:text>&#09;</xsl:text>
    <xsl:apply-templates select="sd:target" />
  </xsl:template>

  <xsl:template match="sd:attacker">
    <xsl:value-of select="sd:addr" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="sd:port" />
  </xsl:template>

  <xsl:template match="sd:target">
    <xsl:value-of select="sd:addr" />
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="sd:port" />
  </xsl:template>

  <xsl:template match="cid:context">
    <xsl:value-of select="cid:fromAttacker" />
  </xsl:template>

</xsl:stylesheet>