Netskope LogoNetskope Logo
  • セキュリティサービス
  • AIサービス
  • ネットワークサービス
  • 分析サービス
  • 統合
  • getting-started.svg始める
    • サポート
    • コミュニティ
    • Netskope.com
    © 2026 無断転載を禁じます。Netskope 株式会社
    トップページ
    Netskope Cloud Exchange
    脅威交換モジュール
    Threat Exchangeカスタムプラグイン開発者ガイド

    Threat Exchangeカスタムプラグイン開発者ガイド

    このドキュメントでは、新しい脅威交換プラグインを作成する方法と、脅威交換モジュール内で提供される機能を活用して脅威エコシステムから最大限の価値を引き出す方法について説明します。新しい開発者ガイドを作成するには、このテンプレートを使用します。

    前提条件

    新しいプラグインを作成するには、以下が必要です。

    • Python 3.xのプログラミング経験(中級レベル)。
    • Netskope Cloud Exchangeプラットフォームへのアクセス。
    • プラグインを作成する必要のある製品またはソリューションへのAPIまたはPython SDKへのアクセス。
    • 製品に対する最低限の権限を持つアカウント。

    脅威交換モジュール

    Cloud Exchange (CE) プラットフォームとその脅威交換モジュールには、高度なカスタマイズを可能にする豊富な機能が備わっています。そのため、以下に挙げるプラットフォームのさまざまな側面について理解を深めておくことをお勧めします。

    注記

    このモジュールは、Netskopeからサードパーティへのデータ共有、およびその逆方向のデータ共有をサポートします。

    Netskopeの概念と用語

    • コア: CE コア エンジンは、サードパーティのプラグインとそのライフサイクル メソッドを管理し、さらにプラットフォームと対話してさまざまなタスクを実行するための API エンドポイントを備えています。
    • モジュール:さまざまなワークフローを実行するために、モジュール固有のプラグインを呼び出す機能的なコード領域。Threat Exchangeは、Cloud Exchangeのモジュールの1つです。
    • プラグイン:プラグインは、サードパーティの脅威インテリジェンスシステムとの間で脅威IoC情報を送受信するロジックを持つPythonパッケージであり、取得した情報は脅威エクスチェンジに保存されます。
    • プラグイン構成:プラグイン構成とは、脅威IoC情報の取得と送信のために、必要なパラメータで構成され、Cloud Exchangeコアエンジンによってスケジュールされたプラグインクラスオブジェクトのことです。
    • インジケーター (脅威 IoC): インジケーターは、さまざまな脅威インテル プラットフォームから収集され、 Cloud Exchangeデータベースに保存されるマルウェア ハッシュとマルサイト URL オブジェクトです。

    開発ガイドライン

    • すべての Python コードのパッケージ ディレクトリ構造を使用します。
    • プラグインパッケージに同梱されているすべてのサードパーティライブラリについて、既知の脆弱性がないか確認してください。
    • 標準的な Python コーディング規約 ( PEP 8 – Python コードのスタイルガイド)に従ってください。
    • flake8 lint チェックを実行し、ドキュメント文字列チェックを有効にした状態で合格することを確認してください。また、1行あたりの最大長は80である必要があります。
    • タイムスタンプ値を人間が読みやすい形式に変換します(エポックからDateTimeオブジェクトへ)。UIに表示される時刻が、現地のタイムゾーンであることを確認してください。
    • 可能であれば、プラグインで設定パラメータを追加する際に、デフォルト値を追加してください。
    • Pythonで記述されたスクリプトや統合機能については、必ず単体テストを作成してください。詳細については、単体テストのページをご覧ください。
    • プラグインアーキテクチャでは状態の保存が可能ですが、状態管理のために巨大なオブジェクトを保存することは避けてください。
    • Pythonコードに脆弱性がないか確認してください。
    • プラグインのアイコンは10KB未満でなければなりません。必ず会社のロゴ (製品のロゴではなく) を透明なバックグランドで使用してください。 ロゴの推奨サイズは300×50ピクセル、またはそれに近いアスペクト比です。
    • 独自のチェックポイントを実装するのではなく、脅威交換コアが提供するチェックポイントを使用してください。
    • プラグインディレクトリ構造に従ってください。
    • プラグインのドキュメントリプションにリンクが含まれている場合は、ドキュメントページにリダイレクトするハイパーリンクである必要があります。
    • ロガーメッセージとトーストメッセージには、APIトークンとパスワードタイプのフィールド値を含めてはいけません。
    • プラグインの機能開発においては、ページネーションを常に考慮に入れるべきです。
    • ステータスコード429に対する再試行メカニズムを必ず追加してください。
    • システムを最大限に活用するためには、API呼び出しで取得した様々なフィールドをインジケーターデータモデルにマッピングするようにしてください。評判、初見、コメントなどのフィールドを追加することで、SOCユーザーがデータを分析する際に、指標フィールドのデータがより分かりやすくなる。
    • SOCアナリストにより多くの情報を提供するコメント欄を必ずマッピングしてください。コメント欄にはファイル名(ハッシュのケース内)を含めることができます。
    • 独自のチェックポイントを実装するのではなく、 Cloud Exchangeコアが提供するチェックポイントを使用します。
    • プラグインがプッシュメカニズムをサポートしているかどうかを必ず確認し、manifest.json の push_supported 変数を適切に設定してください。
    • validateメソッドに渡されるパラメータを適切に検証し、すべてのパラメータに対して適切なヘルプテキストを提供します。
    • 障害や重大な状況(レート制限、ペイロードサイズの超過など)が発生した場合に通知を発行し、プラグインの状態をユーザーに通知するための通知オブジェクト。
    • Cloud Exchangeプラットフォームによって渡されるロガー オブジェクトを使用して、適切なログ メカニズムを実装してください。 運用チームがトラブルシューティングを行う際に役立つよう、十分なログ記録が行われるようにしてください。通知に機密データが記録されたり、漏洩したりしないようにしてください。
    • すべてのパラメータに対して適切なヘルプテキスト(ツールチップ)を提供してください。可能であれば、ツールチップでそのパラメータの重要性を説明するようにしてください。
    • テキスト形式の設定パラメータ用のプレースホルダーが必要です。
    • プラグイン設定パラメータには必ず意味のある名前とデスクリプションを指定してください。
    • 設定パラメータには、適切な設定タイプ(テキスト、数値、パスワード、選択式、複数選択式)を指定してください。
    • アウトバウンド リクエスト (API/SDK) の作成中に、CE プラットフォームによって渡されるプロキシ構成辞書と SSL 証明書検証フラグを必ず使用してください。
    • 必須ではないパラメーターの値を取得するようにしてください .get() メソッドを作成し、 .get() を使用するときにデフォルト値を提供します 方法。
    • プラグインディレクトリ名(例:sample_plugin)がmanifest.jsonと一致していることを確認してください。IDフィールド。
    • API呼び出しを行う際には、ユーザーエージェントをヘッダーに追加する必要があります。ユーザーエージェントの形式: netskope-ce-<ce_version>-<module>-<plugin_name>-<plugin_version> 。

      注記

      プラグインバージョンは動的にフェッチされるべきで、-ce-<version>文字列 Netskope使う coreで定義されたメソッドをフェッチします。

    • API トークンとパスワード フィールドでは、strip() を使用しないでください。
    • ログメッセージは「<module> <app name>から始まるはずです。プラグイン [configuration_name]: ".

      例:「URE Crowdstrik Plugin [CrowdStrike 設定名]: <log_message>」。[これは提案です。設定名は省略できます]。(logger.info(“<module><plugin_name> プラグイン: <message>”))

    • エラーログを記録する際は、可能であれば例外のトレースバックを追加してください。
      使う: self.logger.error(error, details=traceback.format_exc())。
    • The Toast message should not contain the “<app_name> <module> Plugin:” in the message.
    • API呼び出し中および呼び出し後に、適切な例外とステータスコードを捕捉するようにしてください。
    • CHANGELOG.md ファイルには、追加、変更、修正などの適切なタグと、ユーザーにとって分かりやすいメッセージを追加して更新する必要があります。ファイル名がCHANGELOG.mdと完全に一致していることを確認してください。

    プラグインの作成

    このセクションでは、プラグインをゼロから作成するプロセスについて説明します。

    NetskopeOSSの公開GitHubリポジトリからサンプルプラグインをダウンロードしてください。

    開発環境のセットアップ

    Python

    Threat ExchangeはPython3(バージョン3.7以降)を使用しています。開発環境にPython3がインストールされていることを確認してください。Pytest は単体テストを実行するために使います。

    含まれるPythonライブラリ

    次の Python ライブラリがNetskope Threat Exchange プラットフォームに含まれています。

    図書館名バージョン
    aiofiles22.1.0
    amqp5.1.1
    anyio3.6.2
    asgiref3.6.0
    attrs22.2.0
    azure-core1.26.2
    azure-storage-blob12.14.1
    bcrypt4.0.1
    boto31.26.51
    botocore1.29.51
    billiard3.6.4.0
    celery5.2.7
    cabby0.1.23
    cachetools5.2.1
    celerybeat-mongo0.2.0
    certifi2022.12.7
    cffi1.13.2
    chardet5.1.0
    charset-normalizer3.0.1
    click8.1.3
    click-didyoumean0.3.0
    click-plugins1.1.1
    click-repl0.2.0
    colorama0.4.6
    colorlog6.7.0
    cryptography39.0.0
    cybox2.1.0.21
    defusedxml0.7.1
    dnspython2.3.0
    docker6.0.1
    fastapi0.89.1
    furl2.1.3
    google-api-core2.11.0
    google-auth2.16.0
    google-cloud-core2.3.2
    google-cloud-pubsub2.13.12
    google-cloud-pubsublite1.6.0
    google-cloud-storage2.7.0
    google-crc32c1.5.0
    google-resumable-media2.4.0
    googleapis-common-protos1.58.0
    grpc-google-iam-v10.12.6
    grpcio1.51.1
    grpcio-status1.51.1
    gunicorn20.1.0
    h110.14.0
    idna3.4
    importlib-metadata6.0.0
    isodate0.6.1
    jmespath1.0.1
    jsonpath0.8
    jsonschema4.17.3
    kombu5.2.4
    libcst0.3.21
    libtaxii1.1.119
    lxml4.9.2
    mongoengine0.25.0
    mongoquery1.4.2
    more-itertools9.0.0
    MarkupSafe2.1.2
    memory-profiler0.61.0
    mixbox1.0.5
    msrest0.7.1
    multidict6.0.4
    mypy-extensions0.4.3
    netskopesdk0.0.25
    numpy1.23.5
    oauthlib3.2.2
    onelogin3.1.0
    ordered-set4.1.0
    orderedmultidict1.0.1
    overrides6.5.0
    pandas1.5.0
    packaging23.0
    passlib1.7.4
    pycparser2.21
    prompt-toolkit3.0.36
    proto-plus1.22.2
    protobuf4.21.12
    psutil5.9.4
    pydantic1.10.4
    pyasn10.4.8
    pyasn1-modules0.2.8
    PyJWT2.6.0
    pymongo4.3.4
    pyparsing3.0.9
    python-dateutil2.8.2
    pyrsistent0.15.6
    python-multipart0.0.5
    python3-saml1.15.0
    pytz2022.7.1
    PyYAML6.0
    requests2.28.2
    requests-oauthlib1.3.1 4.9
    rsa4.9
    six1.16.0
    starlette0.22.0
    sniffio1.3.0
    s3transfer0.6.0
    stix1.2.0.11
    taxii2-client2.3.0
    typing-inspect0.8.0
    typing-utils0.1.0
    typing_extensions4.4.0
    urllib31.26.14
    uvicorn0.20.0
    vine5.0.0
    wcwidth0.2.6
    weakrefmethod1.0.3
    websocket-client1.4.2
    Werkzeug2.2.2
    xmlsec1.3.11
    zipp3.11.0
    requests-mock1.7.0
    カスタムプラグインライブラリを含む

    Netskopeは、プラグインが必要とするサードパーティ製のPythonライブラリを、プラグインパッケージ自体に同梱することを推奨しています。このバンドルを実現するには pipインストーラーを使用します。ディレクトリを入力として受け取るスイッチが用意されています。 指定されている場合、pipはそのディレクトリにパッケージをインストールします。

    For example, the command shown below will install the cowsay package into the directory lib.

    > pip install cowsay --target ./lib

    これに関する公式ドキュメントについては、 https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-tを参照してください。

    上記のlibフォルダからモジュールをインポートする際は、 以下に示すように、絶対インポートではなく相対インポートを使用する必要があります。

    rom .lib import cowsay
    IDE

    推奨されるIDEはPyCharmまたはVisual Studio Codeです。

    プラグインディレクトリ構造

    このセクションでは、Threat Exchangeプラグインの一般的なディレクトリ構造について説明します。

    /sample_plugin/
      ├──__init__.py
      ├──CHANGELOG.md
      ├──icon.png
      ├──main.py
      ├──manifest.json
    サンプルプラグインの内容
    • README.md: README ファイルには、プラグイン統合のためのドキュメントが含まれています。
    • __init__.py:Cloud Exchangeのコードでは、すべてのプラグインパッケージはPythonモジュールとして扱われます。すべてのプラグインパッケージに空の「__init__.py」が含まれていることを確認してください。ファイル。
    • CHANGELOG.md:このファイルにはプラグインの更新に関する詳細が含まれており、追加、変更、修正などの適切なタグと適切なユーザーフレンドリーなメッセージで更新する必要があります。
    • icon.png: プラグインのアイコンロゴ。これは、UI 上のプラグインのチクレットと設定カードに表示されます。ロゴには、推奨サイズ 300*50 ピクセルまたは同様のアスペクト比の透明なバックグランドが必要です。
    • main.py:このPythonファイルには、pull、push、validateメソッドの具体的な実装を含むPluginクラスが含まれています。
    • manifest.json:プラグインパッケージのマニフェストファイル。設定可能なすべてのパラメータとそのデータ型に関する情報が含まれています。このファイルには、プラグインの統合に関する詳細情報も記載されています。

    ここに記載されているファイルは、プラグインの統合に必須ですが、特定の統合要件に基づいて他のファイルを追加することもできます。

    Note: プラグインディレクトリ名(例:sample_plugin)がmanifest.jsonと一致していることを確認してください。IDフィールド。

    CHANGELOG.md

    これはプラグインの更新に関する詳細情報を含むファイルであり、追加、変更、修正などの適切なタグと、ユーザーにとって分かりやすい適切なメッセージを追加して更新する必要があります。

    • 追加: 新しい機能が追加されたときに使用します。
    • 修正済み: バグやエラーが修正されたときに使用します。
    • 変更: プラグインの既存の実装に変更があった場合に更新します。

    Sample Changelog.md

    # 1.0.1
    ## Fixed
    - Fixed pagination when there are more than 10k Logs
    # 1.0.0
    ## Added
    - Initial release.
    Manifest.json

    これは、プラグインに関連するメタ情報を格納する JSON ファイルです。このファイルは、Threat Exchange モジュールによって読み込まれ、UI にプラグインを表示するとともに、Threat Exchange モジュールがプラグインに関する詳細情報(必要な構成パラメータ、プラグイン ID、プラグイン名など)を把握できるようにします。

    • すべてのプラグインには、Threat Exchangeがプラグインオブジェクトを適切にインスタンス化できるように、必要な情報を含むこのファイルが含まれている必要があります。
    • マニフェスト.json の一般的なパラメーターには次のものがあります。
      • name: (文字列) プラグインの名前。(必須)
      • id: (文字列) プラグインパッケージのID。Cloud Exchangeにインストールされているすべてのプラグインで、それが一意であることを確認してください。IDはプラグインパッケージのディレクトリ名と一致する必要があります。(必須)
      • version: (文字列) プラグインのバージョン。MAJOR.MINOR.PATCH の使用 (例:1.0.1)バージョン管理方式は推奨されますが、特に制限はありません。(必須)
      • デスクリプション: (文字列) プラグインのデスクリプション。 プラグインの機能と使用手順について説明した詳細なデスクリプションを提供します。 このプラグインは製品fooと連携し、md5とsha256のハッシュ値、およびmalURLをThreat Exchangeに抽出し、それらを製品fooにプッシュします。このデスク リプションは、プラグイン設定カードに表示されます。 (必須)
      • push_supported: (boolean) このフラグは、プラグインがプッシュメソッドをサポートしているかどうかを示します。falseに設定すると、共有関連のフィールドはUIに表示されません。(オプション、デフォルトはtrue)
      • patch_supported: (ブール値) このフラグは、統合製品が指標の増分報告をサポートしているかどうかを示します。特定の製品(例:Netskope機能 RESTAPIv1)では、すべての指標が毎回報告される必要があることを想定しています。 このような場合、「patch_supported」を「False」に設定する必要があります。 あるいは、ServiceNowでは指標を一度に1つずつ共有することができ、以前に共有された指標は保持されます。このケースでは、patch_supported を「True」に設定する必要がありました。 (必須)
      • 設定: (配列) プラグインに必要なすべてのパラメーターに関する情報 (名前、タイプ、ID など) を含む JSON オブジェクトの配列。ネストされた JSON オブジェクトによくあるパラメーターについては、以下で説明します。
        • ラベル:パラメータの名前。これはプラグインの設定ページに表示されます。(必須)
        • key: プラグイン設定が使用される Python dict オブジェクト内のキーとして使用される一意のパラメーター キー。 (必須)
        • type: パラメータの値の型。使用可能な値は、「text」、「password」、「number」、「choice」、「multichoice」です。(必須)詳細については、下記のプラグイン設定パラメータの種類を参照してください。
        • default: このパラメータのデフォルト値。この値は、Threat Exchange UI のプラグイン設定ページに表示されます。サポートされているデータ型は、「テキスト」、「数値」、「リスト」(複数選択型の場合)です。(必須)
        • mandatory: このパラメータが必須かどうかを示すブール値。パラメータが必須の場合、Threat Exchange UI ではパラメータに空の値を指定することはできません。許容される値は「true」と「false」です。(必須)
        • デスクリプション: パラメータと期待値に関する詳細を提供する、パラメータのヘルプ テキスト レベルのデスクリプション。 この文字列は、プラグインの設定ページにヘルプテキストとして表示されます。(必須)
        • 選択肢:キーと値をJSONキーとして含むJSONオブジェクトのリスト。このパラメータは「type」:「choice」および「multichoice」でのみサポートされています。
    Plugin Configuration Parameter Types

    プラグインのmanifest.jsonファイルのconfigurationセクションに、必要なプラグイン設定パラメータがすべて記載されていることを確認してください。

    Password Parameter

    このパラメータは、API エンドポイントでの認証のためのシークレット/パスワードを保存するために使用されます。 パスワードを型とするパラメータは、プラグイン設定ページにパスワード入力欄が表示され、プラットフォームによって難読化および暗号化されます。

    サンプルJSON

    "configuration": [
        {
            "label": "Api token",
            "key": "api_token",
            "type": "password"
        },
    ]

    プラグイン設定画面:

    image1.png
    Text Parameter

    このパラメータは、ベースURL、ユーザー名などの文字列情報を格納します。 このパラメータは、プラグイン設定ページに通常のテキスト入力欄として表示されます。

    サンプルJSON

    "configuration": [
        {
            "label": "Tenant Name",
            "key": "tenant_name",
            "type": "text"
        },
    ]

    プラグイン設定画面:

    image2.png
    Number Parameter

    このパラメータは数値/浮動小数点値を保存するために使用されます。 このパラメータは、プラグイン設定ページに数値入力フィールドとして表示されます。

    サンプルJSON

    "configuration": [
        {
            "label": "Maximum File hash list size in MB.",
            "key": "max_size",
            "type": "number"
        },
    ]

    プラグイン設定画面:

    image3.png
    Choice Parameter

    Use this parameter for storing any enumeration parameter values. This parameter will have a dropdown on the plugin configuration page.

    サンプルJSON

    "configuration": [
    {
    "label": "Type of Threat data to pull",
    "key": "ioc_type",
    "type": "choice",
    "choices": [
        {
          "key": "Both",
          "value": ["malware", “malsite”]
        },
        {
          "key": "Malware",
          "value": "malware"
        },
        {
          "key": "Malsite",
          "value": "malsite"
        }
      ]
     },
    ]

    プラグイン設定画面:

    image4.png

    入力項目を選択した後。

    image5.png
    Multichoice Parameter

    このパラメータは、複数の選択肢の値を保存するために使用します。 このパラメータは、プラグイン設定ページにドロップダウンリストとして表示され、複数の値を選択できるようになります。

    サンプルJSON

    "configuration": [
        {
            "label": "Severity",
            "key": "severity",
            "type": "multichoice",
            "choices": [
                {
                    "key": "Unknown",
                    "value": "unknown"
                },
                {
                    "key": "Low",
                    "value": "low"
                },
                {
                    "key": "Medium",
                    "value": "medium"
                },
                {
                    "key": "High",
                    "value": "high"
                },
                {
                    "key": "Critical",
                    "value": "critical"
                }
            ],
            "default": [
                "critical",
                "high",
                "medium",
                "low",
                "unknown"
            ],
            "mandatory": false,
            "description": "Only indicators with matching severity will be saved."
        }
    ]

    プラグイン設定ビュー:

    image6.png
    Toggle Parameter

    このパラメータにはブール値が格納されます。トグル有効はTrue、トグル無効はFalseです。

    • SSL検証を有効にする:この変数は プラグインでAPI呼び出しを行う際に有効にする必要があります。
    • システム プロキシを使う ('proxy'): 設定で設定されたシステム プロキシを使う。(デフォルト: 間違い)

    プラグイン設定ビュー:

    Config-Name.png

    注記

    このパラメータはCoreによって提供されるものであり、プラグインのmanifest.jsonファイルから追加することはできません。

    main.py

    このPythonファイルには、プラグインの中核となる実装が含まれています。

    標準輸入
    from netskope.integrations.cte.plugin_base import PluginBase, ValidationResult, PushResult
    from netskope.integrations.cte.models import Indicator, IndicatorType
    from netskope.integrations.cte.models.business_rule import Action, ActionWithoutParams
    PluginBase変数

    PluginBaseは、プラグインのライフサイクル中に使用できる変数へのアクセスを提供します。

    方法。以下は変数の一覧です。

    変数名Usageデスクリプション
    self.loggerself.logger.error(“Message”)

    self.logger.warn(“メッセージ”)

    self.logger.info(“Message”)

    コアによって提供されるロガーハンドル。このオブジェクトを使用して重要なイベントを記録します。 ログはCloud Exchange監査ログに表示されます。 ログ記録に関するドキュメントを参照してください。
    self.configurationself.configuration.get()<attribute-key-name>プラグインインスタンスの設定オブジェクトのJSON表現。これを使用して、認証クレデンシャル、サーバーの詳細などの構成属性にアクセスします。manifest.json に記載されている属性のキー名を使用します。
    self.last_run_atself.last_run_at の場合:

    self.last_run_at.timestamp()

    この形式は、最後の実行時間をエポック形式に変換するためのものです。

    プラグインのプルメソッドが最後に正常に実行された時刻のタイムスタンプを提供します。Cloud Exchange コアは、pull() の実行が成功するたびにチェックポイント時刻を保持します。初回実行時の値はNoneになります。オブジェクトのデータ型はdatetimeです。
    self.storage Cloud Exchangeは、プラグインが状態を維持するためのメカニズムを提供する。このオブジェクトは、後続の呼び出しで必要となる状態を保持します。 このオブジェクトのデータ型はPythonの辞書型です。
    self.notifierself.notifier.info(“message”)

    self.notifier.warn(“message”)

    self.notifier.error(“message”)

    このオブジェクトは、Cloud Exchangeコアの通知機能のハンドルを提供します。このオブジェクトを使用して、プラットフォームに通知をプッシュします。 通知はThreat ExchangeのUIに表示されます。ユーザーが読んで必要な行動を取れるよう、メッセージには要約された情報を含めるようにしてください。

    例えばNetskopeプラグインの通知機能で、push()メソッドが製品の8MB制限を超えた場合に通知します。

    self.proxyrequests.get(url=url,プロキシ=self.proxy)システムのプロキシ設定が設定されている場合はそのハンドル、設定されていない場合は {}。
    self.ssl_validationrequests.get(url=url,verify=self.ssl_validation)REST API呼び出しに対してSSL検証を強制するかどうかを示すブール値。
    プラグインクラス
    • プラグインクラスはPluginBaseクラスを継承する必要があります。PluginBase クラスはNetskope .integrations.cte.plugin_baseで定義されています。
    • Plugin クラスが pull、push、validate メソッドの実装を提供していることを確認してください。
    • プラグインクラスには、サードパーティAPIとの接続と認証を確立するために必要なすべてのパラメータが含まれます。
    • PLUGIN_NAME、LIMITなどの定数は宣言する必要があります。
    """Sample plugin implementation.
    This is a sample implementation of base PluginBase class. Which explains the concrete implemetation
    of the base class.
    """
    from netskope.integrations.cte.plugin_base import PluginBase, ValidationResult, PushResult
    from netskope.integrations.cte.models import Indicator, IndicatorType
    from typing import List
    from datetime import datetime
    import requests
    PLUGIN_NAME = "<module> <plugin_name> Plugin
    class SamplePlugin(PluginBase):
       """SamplePlugin class having concrete implementation for pulling and pushing threat information.
       This class is responsible for implementing pull, push and validate methods with proper return types,
       so that it's lifecycle execution can be scheduled by the CTE core engine.
       """
    Def Pull()

    これはPluginBaseクラスの抽象メソッドです。

    • このメソッドは、API エンドポイントから脅威 IoC (マルウェアおよびマルサイト) をプルするロジックを実装します。 このメソッドは定期的に呼び出されます。
    • 単体テストが可能であることを確認してください。
    • self.last_run_atを呼び出して、 Cloud Exchangeプラットフォームによって渡されたチェックポイントを使用します このメソッドは、最後に正常に実行された時刻のタイムスタンプを含む datetime.datetime Python オブジェクトを返します。
    • self.proxyを呼び出して、 Cloud Exchangeプラットフォームによって渡されたプロキシ構成を使用します。 これは、Pythonの辞書オブジェクトを返します。 requestsモジュールで直接使用できます。
    • API認証のすべての設定パラメータは、 self.configurationを呼び出すことでPython辞書が受け取る形で渡されます。
    • すべてのログは、適切なログレベル(info、warn、error)でself.loggerオブジェクトによって記録されます。このオブジェクトはログをMongoDBに記録し、API呼び出しを介してアクセスできます。
    • Use self.ssl_validation bool to enable/disable validation of the SSL server certificate.
    • API エンドポイントから受信したデータを含む Indicator オブジェクト (以下を参照) のリストを返します。
    • 失敗した場合は、適切なメッセージとともに、適切な種類のエラーまたは例外を発生させる。
    def pull(self):
    """Pull the Threat information from the 3rd part Threat Intel systems.
    Implement the logic of pulling Threat data from 3rd party apis and return the list of objects netskope.integrations.cte.models.Indicators on successful pull otherwise raises an exception.
    Returns:
        List[netskope.integrations.cte.models.Indicators]: List of indicator objects received from the 3rd-party Threat Intel Systems.
    """
    # Load all the configured plugin parameters as python dict object.
    # Use the key name provided in the manifest.json file for the configuration parameters to
    # get the value of that particular parameter.
    config = self.configuration
    # get proxy settings dict, just the way requests module requires.
    proxy_dict = self.proxy
    # get the ssl_validation bool for enabling/disabling validation of SSL server certificates.
    ssl_validation = self.ssl_validation
    start_time = self.last_run_at  # datetime.datetime object.
    # How to use proxy dict and ssl_validation flag.
    resp = requests.get("www.example.com", proxies=proxy_dict, verify=ssl_validation)  # noqa: F841
    # Get the logger object for logging purpose. This logger object logs all the logs to mongodb
    # under the cte database logs collection. Log timestamp is automatically recorded by the logger library.
    # Supported logging levels are info, warn and error.
    logger = self.logger
    logger.info(f"{PLUGIN_NAME}: Starting Pulling data for sample plugin.")
    indicator_list = self.pull_data_from_3rd_party_api(config, logger)
    logger.info(f"{PLUGIN_NAME}:logger.info("{PLUGIN_NAME}: Finished pulling data")
    return indicator_list
    Def Push()

    これはPluginBaseクラスの抽象メソッドです。

    • このメソッドは、 Cloud Exchangeプラットフォームによって共有される Threat IoC 情報を製品 API エンドポイントにプッシュするロジックを実装します。
    • このメソッドは、Pull メソッドが受け取るすべてのパラメータを受け取るだけでなく、統合製品と共有される Cloud Exchange プラットフォームからの Indicator オブジェクトのリストをメソッド引数として受け取ります。
    • このメソッドはCloud Exchangeプラットフォームがソースから新しいインジケーターを受信し、現在のプラグイン構成でインジケーターの共有が構成されているときに呼び出されます。
    • APIがインジケーターを共有するためのPATCHメソッドをサポートしている場合、このメソッドはリスト内のインジケーターオブジェクトを1つだけ受け取ります。そうでない場合は、Threat Exchangeのデータベース内のすべてのインジケーターに共有フィルターを適用した後に返されるすべてのインジケーターオブジェクトを受け取ります。
    • APIエンドポイントがサポートする最大ペイロードサイズを超えた場合は必ず対処してください。 このケースに対処する方法は複数考えられます。
      • API エンドポイントがペイロード サイズが固定された複数のリクエストをサポートしている場合は、データをチャンクで送信します。
      • API エンドポイントが複数のリクエストをサポートしていない場合 (つまり、 (1回のAPI呼び出しでのみプッシュできます)プラグインは残りのインジケーターをスキップして、共有フィルターを調整するようにユーザーに通知するか、ペイロードサイズ超過のエラーで失敗することができます。
    • PushResult オブジェクトを返します ( PushResult クラスを参照)。成功フラグは、Push 操作が成功したかどうかを示します。
    • 接続とHTTPレスポンスコードを使用して、すべての例外を処理します。
    def push(self, indicators: List[Indicator]):
        """Push the Indicator list to the 3rd party Threat Intel systems.
        Implement the logic of spliting the indicators list according to their type and push the data
        to the 3rd party APIs. This method will be invoked while sharing the Threat information with 3rd party.
        Args:
            indicators (List[netskope.integrations.cte.models.Indicators]): List of Indicator objects to be pushed.
        Returns:
            netskope.integrations.cte.plugin_base.PushResult: PushResult object with success flag and Push result message.
        """
        # Load all the configured plugin parameters as python dict object.
        # Use the key name provided in the manifest.json file for the configuration parameters to
        # get the value of that particular parameter.
        config = self.configuration
        # get proxy settings dict, just the way requests module requires.
        proxy_dict = self.proxy
        # get the ssl_validation bool for enabling/disabling validation of SSL server certificates.
        ssl_validation = self.ssl_validation
        # How to use proxy dict and ssl_validation flag.
        resp = requests.get("www.example.com", proxies=proxy_dict, verify=ssl_validation)   # noqa: F841
        # Get the logger object for logging purpose. This logger object logs all the logs to mongodb
        # under the cte database logs collection. Log timestamp is automatically recorded by the logger library.
        # Supported logging levels are info, warn and error.
        logger = self.logger
        logger.info(f"{PLUGIN_NAME}: Starting Pulling data for sample plugin.")
        push_result = self.push_data_to_3rd_party_api(config, logger, indicators)
        logger.info("f"{PLUGIN_NAME}: Finished Pushing data for sample plugin.")
        return push_result
    定義 Validate()

    これはPluginBaseクラスの抽象メソッドです。

      • このメソッドは、プラグイン構成を作成する際に渡されたプラグイン構成および認証パラメータを検証します。
      • このメソッドは、新しい設定が作成または更新された場合にのみ呼び出されます。
      • 必須パラメータがすべて適切なデータ型で渡されていることを検証します。

    <li">認証パラメータとAPIエンドポイントを検証し、プラグインライフサイクルの円滑な実行を保証します。

    • 検証の成功または失敗を示す成功フラグと、検証失敗の理由を含む検証メッセージを含むValidationResultオブジェクト( ValidationResultクラスを参照)を返します。
    def validate(self, data):      
         """Validate the Plugin configuration parameters.
      Validation for all the parameters mentioned in the manifest.json for the existence and
      data type. Method returns the netskope.integrations.cte.plugin_base.ValidationResult object with success = True in the case
      of successful validation and success = False and a error message in the case of failure.
      Args:
          data (dict): Dict object having all the Plugin configuration parameters.
      Returns:
          netskope.integrations.cte.plugin_base.ValidateResult: ValidateResult object with success flag and message.
      """
      self.logger.info(f"{PLUGIN_NAME}: Executing validate method for Sample plugin")
      if (
          "secret_field_id1" not in data
          or not data["secret_field_id1"]
          or type(data["secret_field_id1"]) != str
      ):
          self.logger.error(
              f"{PLUGIN_NAME}: Validation error occurred Error: Secret Field1 is required with type string."
          )
          return ValidationResult(
              success=False, message="Invalid Secret Field 1 provided.",
          )
    else:
    return ValidationResult(
            success=True, message="Validation Successful for Sample plugin"
       )
    def get_actions()

    これはPluginBaseクラスの抽象メソッドです。

    • このメソッドは、プラグインがインジケーターの共有をサポートしている場合(つまり、マニフェストに push_supported=true が設定されていない場合は、空のリストを返す必要があります。
    • ActionWithoutParams クラスにサポートされているすべてのアクションを追加し、ActionWithoutParams クラスのオブジェクトのリストを返します。
    • プラグインがインジケーターの共有をサポートしている場合、このメソッドは少なくとも1つのアクションを返す必要があります。

    マニフェストに push_supported=false が含まれている場合:

    def get_actions(self):
    """Get available actions.
    Returns:
     List[ActionWithoutParams]: List of ActionWithoutParams objects that are supported by the plugin.
    """
     return []

    マニフェストに push_supported=true が含まれている場合:

    def get_actions(self): 
    """Get available actions.
    Returns:
    List[ActionWithoutParams]: List of ActionWithoutParams objects that are supported by the plugin.
    """
    return [
    ActionWithoutParams(label=”Share Indicators”, value=”share”)
    ActionWithoutParams(label=”Add to Group”, value=”add”)
    ]
    def get_action_fields():

    これはPluginBaseクラスの抽象メソッドです。

    • このメソッドは、ドロップダウンリストからターゲットが選択されたときにUIに表示されるフィールドのリストを返す必要があります。
    • このメソッドは、ユーザーがいずれかのアクションを選択した後に呼び出す必要があります。
    • 選択されたアクションにパラメータが必要な場合は、辞書のリスト(各辞書は設定可能な入力)を返し、そうでない場合は空のリストを返します。
    • フィールドの定義方法については、 Manifest.jsonを参照してください。

    マニフェストに push_supported=false が含まれている場合:

    def get_action_fields(self, action: Action):
    """Get fields required for an action.
    Args: 
     action (Action): Action object which is selected as Target.
    Return:
     List[Dict]: List of configurable fields based on selected action.
    """
     return []

    マニフェストに push_supported=true が含まれている場合:

    def get_action_fields(self, action: Action):
    """Get fields required for an action.
    Args: 
     action (Action): Action object which is selected as Target.
    Return:
     List[Dict]: List of configurable fields based on selected action.
    """
     if action.value == “add”:
             return [
         {
           “label”: “Group Name”,
           “key”: “group_name”,
           “type”: “text”,
           “default”: “”,
           “mandatory”: True,
           “description”: “Name of group.”
         }
     ]
    else:
     return []
    def validate_action():

    これはPluginBaseクラスの抽象メソッドです。

    • このメソッドは、アクションとそのパラメータを検証します。
    • このメソッドは、新しい共有設定が作成されたとき、または既存の共有設定が更新されたときにのみ呼び出されます。
    • 必須パラメータがすべて適切なデータ型で渡されていることを検証します。
    • 検証の成功または失敗を示す成功フラグと、検証失敗の理由を含む検証メッセージを含むValidationResultオブジェクト( ValidationResultクラスを参照)を返します。
    • プラグインがプッシュをサポートしていない場合は、成功フラグ付きのValidationResultオブジェクトを返し、そうでない場合は検証をチェックします。

    マニフェストに push_supported=false が含まれている場合:

    def validate_action(self, action: Action):
    """Validate Action Parameters.
    Args: 
    action (Action): Action object having all the configurable parameters.
    Return:
    netskope.integrations.cte.plugin_base.ValidateResult: ValidateResult object with success flag and message.
    """
    return ValidationResult(success=True, message=”Validation successful.”)

    マニフェストに push_supported=true が含まれている場合:

    def validate_action(self, action: Action):
    """Validate Action Parameters.
    Args: 
    action (Action): Action object having all the configurable parameters.
    Return:
    netskope.integrations.cte.plugin_base.ValidateResult: ValidateResult object with success flag and message.
    """
    if action.value not in [“share”, “add”]:
    return ValidationResult(
     success=False, message=”Unsupported action provided.”
           )
    if action.value == “add”:
    if action.parameters.get(“group_name”) is None:
    return ValidationResult(
     success=False, message=”Group Name should not be empty.”
           )
    return ValidationResult(
     success=True, message=”Validation successful.”
     )
    データモデル

    このセクションでは、データモデルとその特性を一覧表示します。

    指標タイプモデル
    • このクラスは、IndicatorType オブジェクトの Python データ モデルを提供します。
    • このモデルには、URL、SHA256、MD5という文字列型の3つのフィールドがあります。
    • サードパーティに指標のリストを送信する際に、pushメソッド内でモデルとやり取りすることになります。

    データモデルの特性

    名前タイプデスクリプション
    URLstringURLに使える
    SHA256stringsha256タイプのファイルハッシュに使用できます
    MD5stringそれは MD5タイプのファイルハッシュの場合
    from netskope.integrations.cte.models import ( Indicator,
    IndicatorType,
    SeverityType,
    )
    Indicator(
    value=behavior_info.get("ioc_value"),
    type=IndicatorType.SHA256,
    comments=behavior_info.get("ioc_description", ""),
    firstSeen=datetime.datetime.strptime(
    behavior_info.get("timestamp"),
    "%Y-%m-%dT%H:%M:%SZ",
    ),
    lastSeen=datetime.datetime.strptime(
    behavior_info.get("timestamp"),
    "%Y-%m-%dT%H:%M:%SZ",
    ),
    severity=self.get_severity_from_int(behavior_info.get("severity", 0)),
    )
    重症度タイプモデル
    • このクラスは、SeverityType オブジェクトの Python データ モデルを提供します。
    • このモデルには、UNKNOWN、LOW、MEDIUM、HIGH、CRITICAL の 5 つのフィールドがあり、型は文字列です。
    • プルメソッド内でモデルとやり取りし、インジケーターのリストを返します。

    データモデルの特性

    名前タイプデスクリプション
    UNKNOWNstringそれは 重症度不明
    LOWstring重大度が低い場合は使用できる
    MEDIUMstring中程度の重大度では使用できる
    HIGHstring重大度が高い場合に使用できる
    CRITICALstringクリティカルな重大度の場合に使用される可能性があります
    from netskope.integrations.cte.models import SeverityType
    if type(severity) is not int or severity == 0:
    return SeverityType.UNKNOWN
    if 10 <= severity <= 39:
    return SeverityType.LOW
    if 40 <= severity <= 69:
    return SeverityType.MEDIUM
    if 70 <= severity <= 89:
    return SeverityType.HIGH
    if 90 <= severity <= 100:
    return SeverityType.CRITICAL
    return SeverityType.UNKNOWN
    ActionWithoutParamsモデル
    • このクラスは、ActionWithoutParams オブジェクトの Python データ モデルを提供します。
    • このモデルには、ラベルと値の2つのフィールドがあり、いずれも文字列型です。
    • get_actions メソッドでは、利用可能なアクションのリストを返す際に、モデルとやり取りを行います。

    データモデルの特性

    名前タイプデスクリプション
    labelstringUIに表示されるラベル
    valuestringフィールドの値
    from netskope.integrations.cte.models.business_rule import
    ActionWithoutParams
    ActionWithoutParams(
    label="Add to Suspicious Object List",
    value="suspicious_object",
    )
    • このクラスは、Indicator オブジェクトの Python データ モデルを提供します。
    • pull メソッドは、API 呼び出しから受け取った情報を含む Indicator クラスのオブジェクトのリストを返します。
    • type フィールドでサポートされている値は、 IndicatorType.MD5 、 IndicatorType.SHA256 、およびIndicatorType.URLです。MD5 および SHA256 タイプはマルウェア インジケーターを表すために使用され、URL タイプはマルサイト インジケーターを表すために使用されます。
    • 評判欄の値は1~10の範囲内である必要があります。評判フィールドが指定されていない場合、デフォルト値は5です。(その範囲内で)入力された場合、CTEはそれを受け入れて表示します。

    データモデルの特性

    名前タイプデスクリプション
    valuestring指標値。マルウェアインジケーターのケースにはMD5/SHA256ハッシュ値、マルサイトインジケーターのケースにはドメイン名/URLを指定できます。
    タイプEnum (IndicatorType)マルウェア インジケーターの場合は IndicatorType.MD5 または IndicatorType.SHA256、マルサイト インジケーターの場合は IndicatorType.URL になります。
    testboolそれがテストインジケーターであるかどうかを示します。

    Default – False

    reputationint指標の評判スコア。

    Default – 5

    expiresAtdatetime.datetimeCloud Exchangeによってインジケーターが非アクティブとしてマークされるまでの時間。
    firstSeendatetime.datetimeインジケーターが初めて発見された日時を示す datetime.datetime オブジェクト。

    デフォルト – インジケーターオブジェクトが作成された時点の現在のシステム時刻。

    lastSeendatetime.datetimedatetime.datetime オブジェクトは、インジケーターが最後に検出された日時を示します。

    デフォルト – インジケーターオブジェクトが作成された時点の現在のシステム時刻。

    コメントstringインジケーターに関する詳細情報を提供するコメント文字列。
    重大度列挙型(重大度タイプ)指標の深刻度。可能な値は次のとおりです。

    SeverityType.LOW

    SeverityType.MEDIUM

    SeverityType.HIGH

    SeverityType.CRITICAL

    SeverityType.UNKNOWN

    extendedInformationstring当該指標に関する詳細情報を提供する外部サイトへのリンク。このフィールドに入力された値は、UI上でクリック可能なURLとして表示されます。URLスキームはHTTPまたはHTTPSのいずれかでなければなりません。
    from netskope.integrations.cte.models import Indicator, IndicatorType  
    Indicator(
          value="md5hash",         # md5 hash value of the indicator.
          type=IndicatorType.MD5,  # Type of indicator.
          test=True,               # Indicates whether it's test indicator or not. Defaults to False.
          reputation=7,            # Reputation score of Indicator. Defaults to 5.
          # Time after which Indicator will be marked as inactive.
          expiresAt=datetime.datetime(2022, 12, 23, 15, 22, 52, 667126),
          # Time when the Indicator was discovered first time. Defaults to current time.
          firstSeen=datetime.datetime(2017, 1, 11, 15, 22, 52, 667126),
          # Time when the Indicator was discovered last time. Defaults to current time.
          lastSeen=datetime.datetime(2019, 12, 23, 15, 22, 52, 667126),
          # Comment which gives more information about the indicator.
          comments="Indicator explanation",
      ),
    PushResultクラス
    • このクラスには、製品 API エンドポイントへのインジケーターのプッシュ操作の結果が含まれます。
    • 成功フラグはプッシュ操作の結果を示し、メッセージフラグは失敗した場合に適切なエラーメッセージを示す必要があります。 (成功した場合は、成功フラグがTrueのシンプルな成功メッセージが返されます。)

    データモデルの特性

    名前タイプデスクリプション
    successbool成功フラグは、プッシュ操作が成功したか失敗したかの結果を示します。
    messagestringメッセージフィールドは失敗の場合のエラーを示します。 成功の場合には、シンプルな成功メッセージで十分です。
    from netskope.integrations.cte.plugin_base import PushResult
    PushResult(
        success=True, 
        message=" Successfully pushed data to 3rd party."
    )
    ValidationResultクラス
    • このクラスには、プラグインの新しい設定を作成する際にPluginオブジェクトに渡されるプラグイン設定パラメータに対する検証プロセスの結果が含まれています。
    • validate メソッドに渡されるすべてのパラメータが、データ型と値に対して検証されていることを確認してください。
    • Validate メソッドは、検証操作の結果を示す成功フラグと、検証が失敗した場合に適切なエラーメッセージを含む message フィールドを持つ、このクラスのオブジェクトを返します。 (成功した場合は、成功フラグがTrueの単純な成功メッセージを返す必要があります。)

    データモデルの特性

    名前タイプデスクリプション
    successbool成功フラグは、検証操作の結果(成功したか失敗したか)を示します。
    messagestringメッセージフィールドは失敗の場合のエラーを示します。 成功の場合には、シンプルな成功メッセージで十分です。
    from netskope.integrations.cte.plugin_base import ValidationResult
    ValidationResult(
               success=True,
               message="Validation Successfull for Sample plugin"
           )
    ログ記録

    Cloud Exchangeは、ログ記録用のロガーオブジェクトのハンドルを提供します。

    • コード内でprint文を使用することは避けてください。
    • このオブジェクトは、タイムスタンプフィールドを使用して中央のCloud Exchangeデータベースにログを記録します。 サポートされているログレベルはinfo 、 warn 、 errorです。
    • API認証情報やその他の機密情報がログメッセージに漏洩しないようにしてください。
    • CE プラットフォームによって渡されるロガー オブジェクトを使用して、適切なロギング メカニズムを実装してください。
    • 運用チームがトラブルシューティングを行う際に役立つよう、十分なログ記録が行われるようにしてください。
    • 通知やログに機密データが記録されたり、漏洩したりしないようにしてください。
    self.logger.error(
                   f"{PLUGIN_NAME}: Error log-message goes here."
     )
     self.logger.warn(
                   f"{PLUGIN_NAME}: Warning log-message goes here."
     )
     self.logger.info(
                   f"{PLUGIN_NAME}: Info log-message goes here."
     )
    通知

    Cloud Exchange通知オブジェクトのハンドルを提供します。このハンドルはCloud Exchange UI 上で通知を生成するために使用できます。

    • このオブジェクトは、Cloud Exchangeからプラグインオブジェクトに渡されます。すべてのプラグイン統合は 障害が発生した場合、このオブジェクトはユーザーに即座に通知する必要があります。 通知のタイムスタンプはCloud Exchangeによって管理されます。
    • このオブジェクトは、障害の深刻度に応じて色分けされた通知をUI上に表示します。サポートされている通知の重要度は、 info 、 warn 、およびerrorです。
    • 通知メッセージに、API認証情報やその他の機密情報が含まれていないことを確認してください。
    • 障害や重大な状況(レート制限、ペイロードサイズの超過など)が発生した場合に通知を発生させ、プラグインの状態をユーザーに通知するための通知オブジェクト。
    self.notifier.info(
                  f"{PLUGIN_NAME}: Info notification-message goes here."
    )
    self.notifier.error(
                  f"{PLUGIN_NAME}: Error notification-message goes here."
    )
    self.notifier.warn(
                  f"{PLUGIN_NAME}: Warning notification-message goes here."
    )
    Tagging

    Threat Exchangeは、プラグインのプッシュ/プル/検証メソッドからタグ付け関連の機能を処理するユーティリティクラスを提供します。以下に、それが何であるかの例をいくつか示します。 のためです。

    新しいタグを作成する
    from netskope.integrations.cte.models import TagIn
    from netskope.integrations.cte.utils import TagUtils
    utils = TagUtils()
    utils.create_tag(Tag(name="Tag Name", color="#FF0000"))
    指定された名前のタグが既に存在するかどうかを確認する
    utils = TagUtils()
    if utils.exists("Tag Name"):
        pass  # tag already exists
    一部のインジケーターからタグを削除する
    utils = TagUtils()
    utils.on_indicators({
        "source": "Test"
    }).remove("Tag Name")

    これにより、source=”Test” のすべてのインジケーターから Tag Name タグが削除されます。'on_indicators' の最初で唯一の引数は 'dict' オブジェクトです。これは有効なMongoDBクエリである必要があります。

    一部の指標にタグを追加する
    utils = TagUtils()
    utils.on_indicators({
        "source": "Test"
    }).add("Tag Name")

    Testing

    Linting

    ビルドプロセスの一環として、いくつかのリンターを実行して、 プログラミングエラー、スタイルエラー、および潜在的なセキュリティ問題を検出します。

    Flake8

    これは基本的なリンターです。必要な依存関係がすべて揃っていなくても実行でき、不要なエラーを検出します。 また このリンターを使用して、標準的な Python PEP8 フォーマットスタイルを強制します。 まれに、このリンターから返されるエラーや警告を無効にする必要が生じる場合があります。エラーを無効にしたい行に、次のようなインラインコメントを追加することで、この操作を実行できます。

    # # noqa: <error-id>

    例えば、

    example = lambda: 'example' # example = lambda: 'example' # noqa: E731

    インラインコメントを追加する際は、必ず無効化するエラーコードも併せて記載してください。そうすれば、同じ行に他のエラーがあった場合も報告されます。

    参照先: https ://flake8.pycqa.org/en/latest/user/violations.html#in-line-ignoring-errors

    Flake8リンターでは、PEP8スタイルのドキュメント文字列チェックも有効になっています。したがって、すべての関数/モジュールに適切なドキュメンテーション文字列が追加されていることを確認してください。

    単体テスト

    単体テストを実施し、コードの小さな単位を隔離された状態で、かつ決定論的にテストするようにしてください。単体テストでは、外部 API との通信や モックの使用を避けるようにしてください。 単体テストによってコードカバレッジが70%以上であることを確認してください。

    環境設定

    単体テストを行うには、統合スクリプトまたは自動化スクリプトをプラグインディレクトリ構造に従って開発する必要があります。セットアップに必要なすべてのPythonモジュール依存関係をインストールするために使うPIPを使います。 テストを実行する前に、Cloud Exchangeコアリポジトリの requirements.txt に記載されているすべての必要な依存関係をインストールしてください。

    ユニットテストを作成する

    ユニットテストは、 <your_plugin_name> _test.py という名前の別の Python ファイルに記述してください。単体テストファイル内では、各単体テスト関数は test_ という名前を付ける必要があります。<your test case>単体テストの書き方やフォーマットに関する詳細は、 PyTest ドキュメントをご覧ください。

    Mocking

    モックにはpytest-mockを使います。 pytest-mockはデフォルトで有効になっており、上記の基本環境にインストールされています。モッカーオブジェクトを使うには、テスト関数のパラメータとしてパスするだけです。モッカーは プラグインクラスオブジェクトと外部APIの両方をモックできます。

    例:

    def test_netskope_pull_success(mocker):
       mocker.patch("cte.plugins.netskope.main.NetskopePlugin.pull")
       pull_return_result = [
           Indicator(value="ind1", type=IndicatorType.MD5),
           Indicator(value="ind2", type=IndicatorType.SHA256),
           Indicator(value="ind3", type=IndicatorType.URL),
       ]
       NetskopePlugin.pull.return_value = pull_return_result
       ns = NetskopePlugin(None, None, None, logger)
       actual_pull = ns.pull()
       assert pull_return_result == actual_pull

    API呼び出しのリクエストモジュール応答をモックするには(requests_mock Pytestプラグインはすべての依存関係とともにインストールされています):

    def test_fetch_threat_data_malware(requests_mock):
       endpoint_url = "https://example-api.com"
       mock_response_json = {
           'status': 'success',
           'data': [
               {
                   'local_md5': 'ind1',
               },
               {
                   'local_md5': 'ind2',
               },
               {
                   'local_md5': 'ind3',
               },
           ]
       }
       requests_mock.get(endpoint_url, json=mock_response_json)
       config_dict = {
           "api_token": "abc",
           "tenant_name": "partners",
           "file_list": "test",
           "url_list": "sample",
           "threat_data_type": "URL",
           "is_pull_required": "Yes",
           "max_file_hash_cap": 8,
           "max_url_list_cap": 8,
       }
       ns = NetskopePlugin(config_dict, None, None, logger)
       actual_ind_list = ns.fetch_threat_data(
           endpoint_url,
           config_dict['api_token'],
           datetime.datetime.now(),
           time.time(),
           "malware"
       )
       indicator_list = [
           Indicator(value="ind1", type=IndicatorType.MD5),
           Indicator(value="ind2", type=IndicatorType.MD5),
           Indicator(value="ind3", type=IndicatorType.MD5),
       ]
       assert len(actual_ind_list) == len(indicator_list)
       for i in range(len(actual_ind_list)):
           assert actual_ind_list[i].value == indicator_list[i].value
    ユニットテストを実行する
    $ PYTHONPATH=. pytest

    プラグインをCloud Exchangeにデプロイする

    プラグインをパッケージ化する

    Cloud Exchangeでは、開発されたプラグインはzipまたはtar.gz形式であることを想定しています。

    パッケージを圧縮するには、次のコマンドを実行してください。

    zip -r sample_plugin.zip sample_plugin

    tar.gzパッケージを生成するには、以下のコマンドを実行してください。

    tar -zcvf sample_plugin.tar.gz sample_plugin

    プラグインをアップロードする

    プラグインをデプロイするためのzipまたはtar.gzファイル。

    1. Cloud Exchangeで Setting > Pluginsに行ってください。
      image1.png
    2. Add New Plugin .
      をクリックしてください
      image2.png
    3. Browseをクリックしてください。
    4. zipファイルまたはtar.gzファイルSelect 。
      image3.png
    5. Uploadをクリックしてください。

    注記

    このプラグインは、脅威交換モジュールのみに対応しています。

    Add a Repository

    Cloud Exchangeプラットフォームにプラグインをデプロイするには、プラグインを保存するリポジトリを追加できます。

    1. Cloud Exchangeで Setting > Plugin Repositoryに行ってください。
      image6.png
    2. Configure New Repository .
      をクリックしてください
      image5.png
    3. リポジトリ名、リポジトリURL、ユーザー名、および個人アクセストークンを入力してください。
    4. Save .
      をクリックしてください
      image7.png
    5. Settings > Pluginsへ移動してください。
    6. リポジトリのドロップダウンリストからリポジトリ名Select 。
      image4.png

    このトピックでは
    • Threat Exchangeカスタムプラグイン開発者ガイド