STIX-Shifter を使用して IBM Cloud Pak for Security とのコネクターを作成する

概要

IBM Cloud Pak for Security では、フェデレーテッド検索を使用して、会社全体のセキュリティーを調査、分析して洞察を引き出すことができます。データのクエリーを行うのに、データをソースから移動する必要はありません。Cloud Pak for Security に用意されている、Cloud Pak 内のプライマリー共有データ・サービス層としての Universal Data Insights (UDI) サービスを利用できるからです。

UDI サービス API を使用すれば、どのアプリケーションでも各種の共有データ・ソースからセキュリティー・データのクエリーや読み取りを行うことができます。この API は RESTful の原則に従って作成されていて、STIX-Shifter という拡張可能なオープンソース・ソフトウェア開発キット (SDK) を統合しています。STIX-Shifter を使用することで、IBM や世界中のセキュリティー・コミュニティーは新しい変換モジュールや送信モジュールを作成して貢献できます。このオープンソース・ライブラリーには、さまざまなセキュリティー・オファリングのサンプル・コネクター、ドキュメント、テスト用 CLI が含まれています。

独自のデータ・ソース用に STIX アダプターを作成して実装し、データ・ソースと Cloud Pak for Security の間の接続を確立できます。このオープンソース・ライブラリーを使用することで、以下の目的を果たすことができます。

  • サイバーセキュリティー・データのリポジトリーを収容している任意の製品に接続する
  • STIX 2 パターンをネイティブ・データ・ソースのクエリーに変換する
  • JSON データ・ソースのクエリー結果を、観測可能なオブジェクトの STIX バンドルに変換する

新しい STIX-Shifter アダプターの開発方法とサポート対象のクエリー・データのタイプについて詳細を確認してください。

このチュートリアルでは、STIX-Shifter を使用して独自の UDI コネクターを開発する方法を説明します。

前提条件

STIX-Shifter コネクターを作成するには、その前に、以下の前提条件を満たす必要があります。

  • Cloud Pak for Security に接続させる製品へのログイン権限があることを確認します。
  • 選択した製品が JSON 形式の結果を返せることを確認します。
  • 製品の API に関するドキュメントを収集します。
  • STIX Version 2.0. Part 4: Cyber Observable Objects および STIX Version 2.0. Part 5: STIX Patterning を十分に理解します。
  • STIX のオブジェクトとプロパティーにマッピングする、製品内のフィールドを識別します。
  • カスタムのオブジェクトやプロパティーのすべてを識別します。

所要時間

STIX-Shifter SDK を使用して基本的な hello world コネクターを開発するには、8 時間かかります。

手順

コネクターを開発してテストする手順は以下のとおりです。

1. 開発環境をセットアップする

開発環境では Python 3.6 を使用する必要があります。

任意の統合開発環境 (Visual Studio Code など) を使用できます。

以下の手順に従って、開発環境を構成してテストします。

  • Python 3.6 をインストールします。
  • Python 3.6 が正常にインストールされたことを確認します。それには、ターミナル・ウィンドウを開き、python -version と入力して、このコマンドを実行します。
  • STIX-Shifter プロジェクトをフォークします。
  • 新しい作業ブランチとして、リポジトリーのクローンを作成します。

    GitHub 内の「Clone (複製)」メニューを使用してリポジトリーの URL をコピーします。

    リポジトリーのクローンを作成するために使用したのと同じターミナルで、カレント・ディレクトリーを新しく作成したリポジトリーのディレクトリーに変更します。

  • STIX-Shifter CLI コマンドを実行するための仮想環境を作成します。この環境を使用して、STIX-Shifter に必要なすべての Python パッケージをインストールします。

    ターミナルで以下のコマンドを実行します。

     virtualenv -p python3.6 –no-site-packages –distribute virtualenv && source virtualenv/bin/activate && pip install -r requirements-dev.txt
    
  • ターミナルで以下のコマンドを実行して、セットアップをテストします。

    python main.py translate dummy query '{}' "[ipv4-addr:value = '0.0.0.0']"
    

    すべてが正しくセットアップされていれば、変換後のクエリー {'queries': ["SELECT * FROM tableName WHERE (SourceIpV4 = '0.0.0.0' OR DestinationIpV4 = '0.0.0.0')"]} が出力されます。

2. コネクターを作成する

オープンソース STIX-Shifter プロジェクトをベースにコネクターを作成します。新しいコネクターを開発するには、まず、STIX-Shifter プロジェクトをフォークして新しい作業ブランチを作成します。この作業ブランチに、新しいコネクターに必要なすべてのコード変更を格納します。

新しいコネクターをレビューのために提出できる段階になったら、プル・リクエスト (PR) を送信します。この PR は、プロジェクトをフォークして作成した作業ブランチを、STIX-Shifter プロジェクトのメイン・ブランチにマージするためのリクエストです。PR が送信されると、提案された変更に対してコード・レビューが実施されます。ローカル開発環境でも作業ブランチのクローンが作成されて、STIX-Shifter の CLI コマンドを使用してテストされます。

以下の手順に従って、データ・ソース用の独自の STIX-Shifter コネクターを開発します。

  • opencybersecurityalliance/stix-shifter リポジトリーをフォークして、ライブラリーの独自のコピーで作業できるようにします。
  • 変換モジュールを作成します。
  • 送信モジュールを作成します。
  • 開発したコネクターをテストします。
  • 変更を opencybersecurityalliance/stix-shifter リポジトリーにマージするための PR を作成します。

3. コネクターをテストする

コネクターの変換機能と送信機能をテストします。コネクターが正常に機能することを確認するには、テストすることが重要です。STIX-Shifter の開発者ガイドに、以下に記載する開発プロセスの各ステップをテストする方法が説明されています。

変換

  • python main.py translate query '{}' を使用して、STIX パターンをネイティブ・クエリーに変換します。

    python main.py translate dummy query '{}' "[network-traffic:src_port NOT = 37020 AND network-traffic:dst_port != 635] OR [ipv4-addr:value = '333.333.333.0'] OR [url:value = 'www.example.com']" '{"validate_pattern": "true"}'
    

    validate_pattern オプションにより、送信されたパターンが強制的に検証されます。この検証は、パターンが変換ロジックに入る前に行われます。パターンの形式が誤っていると、エラーがスローされます。

  • python main.py translate results を使用して、JSON 形式の結果を STIX オブジェクトに変換します。

    identity オブジェクトはデータ・ソースを表します。このオブジェクトは、UDI フローでは自動的に組み込まれますが、CLI でテストする際には手作業で組み込む必要があります。通常、JSON 形式の結果はデータ・ソースの API results の呼び出しによって取得されますが、CLI で STIX への結果の変換をテストするには、テスト対象のペイロードを組み込まなければなりません。

    python main.py translate dummy results '{"type: "identity","id": "identity–f431f809-377b-45e0-aa1c-6a4751cae5ff", "name": "DummyAdapter","identity_class": "system"}' '[ { "SourcePort": 1234, "EventCount": 1, "Magnitude": 4, "DestinationIpV4": "0.0.0.0", "SourceIpV4": "9.21.123.112", "DestinationPort": 5678, "UserName": "root", "StartTime": 1540312200111}]"{"stix_validator": true}'
    

送信

送信コマンドには、pingquerystatusresultsdeleteis_async があります。

  • ping は、API を介してデータ・ソースとの接続を試みます。

    python main.py transmit dummy '{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' ping
    
  • query は、API を介してクエリーをデータ・ソースに送信します。

    python main.py transmit dummy ''{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' query "SELECT * FROM tableName"
    
  • status は、クエリーの現在のステータスをチェックします (非同期クエリーの場合)。

    python main.py transmit dummy '{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' status"b5751e36-1699-4d57-9f7e-a020b4f91176"
    
  • results は API を介してクエリー結果をフェッチします。ページとオフセットの数値が、結果の合計から取得する範囲 (サブセット) を定義します。

    python main.py transmit dummy '{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' results"b5751e36-1699-4d57-9f7e-a020b4f91176"1 3
    
  • delete は、API を介してクエリーを削除します (データ・ソースで削除がサポートされている場合)。

    python main.py transmit dummy '{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' delete "b5751e36-1699-4d57-9f7e-a020b4f91176"
    
  • is_async は、データ・ソースが非同期クエリーを使用するかどうかを示す true/false の値を返します。

    python main.py transmit dummy '{"host":"some.fake.address.com", "port":"12345"}' '{"auth":{"username": "some_user_name", "password": "some password"}}' is_async
    

実行

execute コマンドを使用すると、変換と送信のフロー全体をテストできます。CLI から execute が呼び出されると、以下の処理が行われます。

  • 送信されたパターンが検証されてからネイティブ・クエリーに変換されます。
  • 変換後のネイティブ・クエリーがデータ・ソースに送信されます。
  • is_asynccheck が実行されます。true の値が返された場合、ステータス・チェックが送信されて、クエリーが完全なものであるかどうかが確認されます。
  • データ・ソースからクエリー結果がフェッチ (送信) されます。結果のフェッチは、データ・ソースが同期の場合はクエリー直後に行われます。そうでない場合は、クエリー ID に基づいて結果がルックアップされてから結果がフェッチされます。
  • 結果が STIX サイバー観測可能オブジェクトのバンドルに変換されます。
  • 変換された各オブジェクトに対して STIX 検証が実行されます。

まとめ

このチュートリアルでは、STIX-Shifter を使用して独自の UDI コネクターを作成する方法を説明しました。詳細に興味がある場合は、GitHub 上に保管されている、Open Cybersecurity Alliance の STIX-Shifter オープンソース・プロジェクト内にあるその他のリソースを参照してください。このトピックについて専門家と対話するには、この Open Cybersecurity Alliance Slack Invite Form に記入して Slack チャネルに参加してください。