このドキュメントでは、 Netskope Cloud Exchangeプラットフォームの Risk Exchange モジュール用に Elastic v1.0.0 プラグインを構成する方法について説明します。 このプラグインは 設定済みのElasticインスタンスから、セキュリティ > 探索 > ユーザー > すべてのユーザーページで利用可能なユーザーと、セキュリティ > 探索 > ユーザー > ユーザーリスクページで利用可能なそれぞれのリスクスコアを取得します。 このプラグインは、ユーザーに対するいかなる操作もサポートしていません。
リスク交換スコアの計算 => | 100 – エラスティックリスクスコア | x 10。
前提条件
この統合を完了するには、以下が必要です。
- Netskopeテナント(または、例えば本番環境と開発/テスト環境など、複数のテナント)。
- Netskope Cloud Exchangeテナントには、テナントプラグインとリスクエクスチェンジプラグインが既に設定済みです。
- Elastic インスタンス クレデンシャル (ユーザー名、パスワード、Elastic Search の API ベース URL、API キー)
- 以下のホストへの接続:Elasticインスタンス。
Elasticプラグインのサポート
このプラグインは、設定済みのElasticインスタンスから、「セキュリティ」>「探索」>「ユーザー」>「すべてのユーザー」ページで利用可能なユーザーと、「セキュリティ」>「探索」>「ユーザー」>「ユーザーリスク」ページで利用可能なそれぞれのリスクスコアを取得します。
| 取得したデータの種類 | ユーザーとそのリスクスコア |
| サポートされているアクション | No action |
マッピング
マッピングは 取得したユーザーの詳細を表示します。 プラグイン設定時にマッピングされたフィールドは、データが取得されるとレコードページに表示されます。以下は、プラグインの設定時に使用すべき推奨マッピングです。 プラグインの設定時に使用してください。
ユーザー向けプルマッピング
| プラグインフィールド | 想定されるデータ型 | 提案されたフィールド名 | 提案された現場集約戦略 |
|---|---|---|---|
| ユーザー名 | String | Username | Unique |
| calculated_score_norm | Number | Score | Overwrite |
| calculated_score | Number | 計算されたスコア | Overwrite |
| calculated_level | String | スコアレベル | Overwrite |
| Netskope正規化スコア | Number | 正規化スコア | Overwrite |
Note that Netskope Normalized Score will be calculated using calculated_score_norm.
スコアマッピング
スコアはCloud Exchangeで正規化されます 以下の式:
リスクエクスチェンジスコアの計算 => | 100 – エラスティックリスクスコア | x 10
| Netskope Score | Netskopeスコア範囲 |
|---|---|
| 致命的 | 0-250 |
| 高い | 251-500 |
| 中くらい | 501-750 |
| 低い | 751-1000 |
| エラスティックスコア | 弾性スコア範囲 |
|---|---|
| 未知 | 20歳未満 |
| 低い | 20 – 40 |
| Moderate | 40 – 70 |
| 高い | 70 – 90 |
| 致命的 | > 90 ** |
権限
このプラグインに必要な権限は以下のとおりです。
- クラスタ権限 > manage_tokens
- インデックス権限 > logs-* および risk-score.*
- 特典 > 読む
- APIキー > 権限の制限
APIの詳細
使うAPI一覧
| APIエンドポイント | 方法 | APIクライアントのスコープ | 使うケース |
|---|---|---|---|
| /_security/oauth2/token | 役職 | manage_token | Get OAuth2 token |
| /logs-*/_search | 役職 | logs-* => 読むアクセス | Fetch users |
| /risk-score.*/_search | 役職 | リスクスコア* => 読むアクセス | スコアを取得 |
認証トークンを取得する
API Endpoint: <Base URL>/_security/oauth2/token
Method: POST
Headers:
| 鍵 | Value | デスクリプション |
|---|---|---|
| Content-Type | アプリケーション/json | |
| Accept | アプリケーション/json | |
| Authorization | ApiKey <Token> | ユーザー名とパスワードなどの基本認証の場合、トークンはUTF-8でエンコードされている必要があります。 |
| Basic <Token> |
Body:
{
"grant_type" : "client_credentials"
}
Sample API Response:
{
"access_token": "gLuKBBjxurcPqq7cZyTj4jL0A****j*******",
"type": "Bearer",
"expires_in": 1200,
"authentication": {
"username": "test user",
"roles": [
"Netskope"
],
"full_name": "Test",
"email": "",
"metadata": {},
"enabled": true,
"authentication_realm": {
"name": "native",
"type": "native"
},
"lookup_realm": {
"name": "native",
"type": "native"
},
"authentication_type": "realm"
}
}
レコードを取得する
API Endpoint: <Base URL>/logs-*/_search
Method: POST
Headers:
| 鍵 | Value |
|---|---|
| Content-Type | アプリケーション/json |
| Accept | アプリケーション/json |
| Authorization | ベアラー <access_token> |
Body:
{
"query": {
"bool": {
"must_not": {"exists": {"field": "host.name"}},
"filter": [
{"exists": {"field": "user.name"}},
{"range": {"@timestamp": {"gte": "2023-01-01T18:08:11.148813Z"}}},
],
}
},
"sort": [{"@timestamp": "asc"}],
"_source": True,
"size": 10000,
}
Sample API Response:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 75,
"successful": 75,
"skipped": 53,
"failed": 0
},
"hits": {
"total": {
"value": 491,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "logs-tes",
"_id": "wHUW2YEyx7Kaj*****",
"_score": null,
"_source": {
"event": {
"kind": "alert",
"module": "proofpoint"
},
"user": {
"name": "kamlesh.solanki@crestdatasys.com"
},
"@timestamp": "2024-01-03T09:00:00.000Z"
},
"sort": [
1704272400000
]
}
]
}
}
スコアを取得
API Endpoint: <Base URL>/risk-score.*/_search
Method: POST
Headers:
| 鍵 | Value |
|---|---|
| Content-Type | アプリケーション/json |
| Accept | アプリケーション/json |
| Authorization | ベアラー <access_token> |
Body:
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [{"match_phrase": {"user.name": "testuser@test.com"}}]
}
}
}
Sample API Response:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.9808291,
"hits": [
{
"_index": "risk-score.risk-score-latest-default",
"_id": "X2vS7pclkEYZFSG************",
"_score": 0.9808291,
"_source": {
"@timestamp": "2024-01-23T11:16:33.549Z",
"user": {
"name": "testuser@test.com",
"risk": {
"id_field": "user.name",
"id_value": "testuser@test.com",
"calculated_level": "Low",
"calculated_score": 92.29454468696414,
"calculated_score_norm": 35.33481802716851,
"category_1_score": 89,
"category_1_count": 9,
"notes": [],
"inputs": [
{
"id": "953f2530b0ea1ca14876583df459c8e24a21e9989876876869*****************",
"index": ".internal.alerts-security.alerts-default-000003",
"description": "Alert from Rule: External Alerts [Duplicate]",
"category": "category_1",
"risk_score": 47,
"timestamp": "2024-01-10T09:36:16.888Z"
},
{
"id": "2b1f87b7353ae4f1cebc95fc618a6b4cb3696b5b8383c3f***********",
"index": ".internal.alerts-security.alerts-default-000003",
"description": "Alert from Rule: External Alerts [Duplicate]",
"category": "category_1",
"risk_score": 47,
"timestamp": "2024-01-10T09:36:16.890Z"
},
{
"id": "3b5d3e2b1b0017567b3e2dc6835957a3118486e89fa20***********************",
"index": ".internal.alerts-security.alerts-default-000003",
"description": "Alert from Rule: External Alerts",
"category": "category_1",
"risk_score": 47,
"timestamp": "2024-01-05T11:53:39.960Z"
},
{
"id": "fe788d9601e817f0e7219b56686d9ba4a55d90c5ea4627***************a",
"index": ".internal.alerts-security.alerts-default-000003",
"description": "Alert from Rule: External Alerts",
"category": "category_1",
"risk_score": 47,
"timestamp": "2024-01-05T11:53:39.963Z"
},
{
"id": "7c7f1da36f5fbc904bb109c38d677e061fd4cbc************************************",
"index": ".internal.alerts-security.alerts-default-000003",
"description": "Alert from Rule: External Alerts [Duplicate]",
"category": "category_1",
"risk_score": 47,
"timestamp": "2024-01-05T11:49:27.539Z"
}
]
}
}
}
}
]
}
}
パフォーマンスマトリックス
以下は、これらのVM仕様を持つ大規模CEスタック上で、10万件のユーザーリスクスコアを取得して実施したパフォーマンス測定結果です。
| スタックの詳細 | サイズ:大 RAM:32 GB CPU:16コア |
| 取得および更新されたユーザーレコードを保存するのにかかる時間 | 約32分 |
ユーザーエージェント
netskope-ce-5.1.0-cre-elastic-v1.0.0
ワークフロー
- 役割を作成します。
- ユーザーに役割を設定します。
- APIキーを作成します。
- Elasticプラグインを設定します。
- Elasticのリスク交換ビジネスルールを追加します。
- Elasticのリスク交換アクションを追加します。
- Elasticプラグインを検証してください。
再生ボタンをクリックして動画をご覧ください。
役割を作成する
- Elastic(Kibana、Elastic Search)にログインし、左側のパネルからManagement > Stack Management > Security > Rolesに移動します。
- Create Roles .
をクリックしてください
- 役割名を指定し、クラスタ権限でmanage_tokenアクセスを選択してください。
- インデックス権限までスクロールダウンし、logs-* と risk-score.* を追加します。インデックス内のインデックスを選択し、「役割の作成」をクリックします。

新しい役割を持つユーザーを作成する
- スタック管理からUsersへ移動してください。Create Userをクリックしてユーザー名、電子メールアドレス、パスワード、パスワード確認を入力し、権限ドロップダウンで以前作成した役割を選択します。Create User .
をクリックしてください。
APIキーを作成する(APIキー認証方式の場合)
- スタック管理のセキュリティにあるAPI Keysに移動してください。Create API Key .
をクリックしてください
- 名前を入力し、 「権限制限」の切り替えボタンを有効にしてください。この辞書を役割記述子に追加してください。
{ "role-a": { "cluster": [ "all" ], "indices": [ { "names": [ "logs-*", "risk-score.*" ], "privileges": [ "read" ], "allow_restricted_indices": false } ], "applications": [], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true } } } - Enable Include metadata and add this in it.
{ "application": "Netskope Cloud Exchange" }
- Create API Keyをクリックしてください。
ページ上に表示されているAPIキーをコピーし、安全な場所に保存してください。このキーは一度しか表示されません。
Elasticプラグインを設定する
- Cloud Exchange でSettings > Pluginsに移動してください。Elastic v1.0.0 (CRE)プラグインボックスを検索して選択します。

- 構成名と同期間隔を入力してください。

- Nextをクリックして、以下の設定パラメータを入力してください。
- ベースURL:ElasticインスタンスのAPIベースURL。
- 認証方法:認証方法の種類Select ElasticインスタンスへのAPI呼び出しを実行するための認証方法の種類を選択してください。
- ユーザー名:Elasticインスタンスのユーザー名。「基本認証(ユーザー名とパスワード)」認証タイプに必須です。
- パスワード:Elasticインスタンスのパスワード。基本認証(ユーザー名とパスワード)認証タイプに必須です。
- APIキー:Elasticインスタンスから生成されたAPIキー。APIキー認証タイプの場合に必須です。
- 初期範囲:初回実行時にユーザーを抽出する日数。

- Nextをクリックしてください。エンティティのドロップダウンからエンティティをSelectしてください。
エンティティフィールドはスキーマエディタのページから作成するか、フィールドのドロップダウンから + Add Field オプションを使うできます。
現場のマッピング情報を提供してください。推奨されるマッピングについては、 「マッピング」セクションを参照してください。

- Save .
をクリックしてください
Elastic のリスク交換ビジネスルールを追加する
- Risk ExchangeでBusiness Rulesに移動してください。
- 右上隅のCreate New Ruleクリックしてください。
- ルール名を入力し、要件に基づいてクエリを設定してください。

- Saveをクリックしてください。
Elastic のリスク交換アクションを追加する
Elasticプラグインはアクションの実行をサポートしていません。ただし、アクションを使用しないと、チケット オーケストレーター モジュールでアラートが生成される場合があります。
Netskopeテナント上で、Elasticから取得したユーザーに対してアクションを実行できます。
このアクションを設定するには:
- Risk ExchangeでActionsに移動してください。
- 左上隅のAdd Action Configurationをクリックしてください。
- それぞれのドロップダウンメニューから、ビジネスルール、プラグインの設定、およびアクション(アクションなし) Select 。

- Ticket Orchestratorモジュールでアラートを生成するには、 「アラート生成」トグルを有効にします。同様に、メンテナンスウィンドウ中にアクションを実行する場合は、「メンテナンスウィンドウ中にアクションを実行」を有効にします。チケットオーケストレーターモジュールを有効にしてください。
- アクションを実行する前に承認が必要な場合は、 「承認が必要」トグルを有効にしてください。
- Saveをクリックしてください。
Elasticプラグインを検証する
Cloud Exchangeで検証する
Elasticから取得したユーザーを確認するには、 Risk Exchange > Recordsにアクセスしてください。Elasticプラグインの設定時に使うエンティティをSelectします。
Loggingに移動して、プラグインの設定に基づいてログを検索してください。

Elastic 上で検証する
左側のパネルからSecurityに移動し、 Explore > Users > All usersをクリックします。
ユーザー評価はSecurity > Explore > Users > User riskから取得されます。
このプラグインはアクションの実行をサポートしていません。
Elasticプラグインのトラブルシューティング
ユーザーまたはユーザースコアを取得できません
Cloud Exchangeでユーザーまたはユーザースコアを取得できない場合、以下のいずれかの理由が考えられます。
- プラットフォーム上でユーザーが利用可能です。
- ユーザーは、プラグインで指定された初期範囲内で利用可能です。
- ユーザーのスコアはCloud Exchangeには反映されません。
- プラグインの設定時に適切なマッピングが行われていません。
What to do:
- プラグインからユーザーが取得されない場合は、Elasticsearchにユーザーが登録されているかどうかを確認してください。
- Elasticsearchで取得可能なユーザーが存在する場合は、ユーザーが最後に確認された日付を確認してください。プラグイン設定で指定されている初期範囲を確認してください。初期範囲は、Elasticで利用可能な最終確認時刻以上である必要があります。そうすることで、ユーザーを取得できます。
- ユーザーを取得した後でユーザースコアを取得できない場合は、ユーザーに適切な権限が追加されているか、またスコアがユーザーに利用可能になっているかを確認してください。
- 適切なマッピングを必ず行い、スコアフィールドを正しくマッピングしてください。
プラグインを設定できません
プラグインの設定ができない場合、以下のいずれかの理由が考えられます。
- クレデンシャルを提供するために適切な権限が設定されています。
- 正しい値は設定パラメータに指定されています。
What to do:
- 適切な権限を付与するようにしてください。
- 設定パラメータには正しい値を指定してください。
第三者に対して操作を実行できません
プラグインの設定ができない場合は、アクション実行中に「承認が必要」トグルボタンが有効になっていることを確認してください。
What to do:
承認チェックを無効にするか、リクエストを承認してください。

