このドキュメントではCloud Exchangeプラットフォームの Threat Exchange モジュールを使用して v1.0.0 Rubrik プラグインを構成する方法について説明します。 このプラグインは、MD5およびSHA256形式の脅威IoCをRubrikの脅威ハンティングページに共有することをサポートしており、 「脅威ハンティングを開始」アクションを実行できます。
前提条件
プラグインの設定を完了するには、以下が必要です。
- Netskopeテナント(または、例えば本番環境と開発/テスト環境など、複数のテナント)。
- Netskope Cloud Exchangeテナントには、テナントプラグインと脅威交換プラグインが既に設定済みです。
- Rubrik Security Cloudインスタンスへの接続(例:<customername> .my.rubrik.com)。
Rubrikプラグインのサポート
このプラグインは、SHA256とMD5をRubrikに送信することをサポートしています。このプラグインは、共有IoCに対して「脅威ハンティング開始」アクションを実行することもサポートしています。
| 取得したインジケーターの種類 | サポートされていません |
| 共有指標タイプ | SHA256、MD5 |
APIの詳細
使うAPI一覧
| 使うケース | 方法 | Endpoint | APIスコープ |
|---|---|---|---|
| 認証トークンを取得する | 役職 | /api/client_token | なし |
| Rubrik プラットフォームから objectFids を取得する | 役職 | /api/graphql | 脅威ハント(読む) |
| Rubrikに存在するクラスターを取得します | 役職 | /api/graphql | 脅威ハント
(読む) |
| Rubrik での脅威ハントの開始 | 役職 | /api/graphql | 脅威ハント(読む) |
認証トークンを取得する
API Endpoint: /api/client_token
Method: 役職
Headers
| 鍵 | Value |
|---|---|
| ユーザーエージェント | netskope-ce-5.0.1-cte-rubrik-v1.0.0 |
Payload
| パラメータ | Value |
|---|---|
| client_id | <Client ID> |
| client_secret | <Client Secret> |
Sample API Response
{
"access_token": "",
"expires_in": 43200,
"Client_id" : “”
}
脅威ハントアクションを開始するための API
RubrikからObjectFidを取得する
API Endpoint: /api/graphql
Method:ポスト
Headers
| 鍵 | Value |
| ユーザーエージェント | netskope-ce-5.0.1-cte-rubrik-v1.0.0 |
| Authorization | 無記名トークン<Bearer Token> |
| Content-Type | アプリケーション/json |
Payload
| GraphQLクエリ | Variables |
|---|---|
query SnappableQuery($first: Int, $after: String, $typeFilter: [HierarchyObjectTypeEnum!], $filter: [Filter!], $sortBy: HierarchySortByField, $sortOrder: SortOrder) {
inventoryRoot {
descendantConnection(first: $first, after: $after, typeFilter: $typeFilter, filter: $filter, sortBy: $sortBy, sortOrder: $sortOrder) {
edges {
cursor
node {
id
... on WindowsFileset {
isPassThrough
__typename
}
... on ShareFileset {
isPassThrough
__typename
}
... on LinuxFileset {
isPassThrough
__typename
}
... on O365Onedrive {
userPrincipalName
__typename
}
...EffectiveSlaColumnFragment
...HierarchyObjectClusterColumnFragment
...HierarchyObjectLocationColumnFragment
...HierarchyObjectNameColumnFragment
...HierarchyObjectTypeFragment
... on AzureNativeVirtualMachine {
region
isAdeEnabled
resourceGroup {
subscription {
name
__typename
}
__typename
}
effectiveSlaDomain {
...ArchivalSpecFragment
__typename
}
__typename
}
... on AzureNativeManagedDisk {
region
isAdeEnabled
resourceGroup {
subscription {
name
__typename
}
__typename
}
effectiveSlaDomain {
...ArchivalSpecFragment
__typename
}
__typename
}
... on CloudDirectNasExport {
exportPath
__typename
}
__typename
}
__typename
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
__typename
}
__typename
}
__typename
}
}
fragment EffectiveSlaColumnFragment on HierarchyObject {
id
effectiveSlaDomain {
...EffectiveSlaDomainFragment
... on GlobalSlaReply {
description
__typename
}
__typename
}
... on CdmHierarchyObject {
pendingSla {
...SLADomainFragment
__typename
}
__typename
}
__typename
}
fragment EffectiveSlaDomainFragment on SlaDomain {
id
name
... on GlobalSlaReply {
isRetentionLockedSla
retentionLockMode
__typename
}
... on ClusterSlaDomain {
fid
cluster {
id
name
__typename
}
isRetentionLockedSla
retentionLockMode
__typename
}
__typename
}
fragment SLADomainFragment on SlaDomain {
id
name
... on ClusterSlaDomain {
fid
cluster {
id
name
__typename
}
__typename
}
__typename
}
fragment HierarchyObjectClusterColumnFragment on HierarchyObject {
...CdmClusterLabelFragment
... on CloudDirectHierarchyObject {
cluster {
id
name
__typename
}
__typename
}
__typename
}
fragment CdmClusterLabelFragment on CdmHierarchyObject {
cluster {
id
name
version
__typename
}
primaryClusterLocation {
id
__typename
}
__typename
}
fragment HierarchyObjectLocationColumnFragment on HierarchyObject {
logicalPath {
name
objectType
__typename
}
physicalPath {
name
objectType
__typename
}
__typename
}
fragment HierarchyObjectNameColumnFragment on HierarchyObject {
name
__typename
}
fragment HierarchyObjectTypeFragment on HierarchyObject {
objectType
__typename
}
fragment ArchivalSpecFragment on GlobalSlaReply {
archivalSpec {
storageSetting {
targetType
__typename
}
__typename
}
archivalSpecs {
storageSetting {
targetType
__typename
}
__typename
}
__typename
}
|
{
"first": 1,
"filter": [
{
"texts": [
"false"
],
"field": "IS_GHOST"
},
{
"texts": [
“”
],
"field": "CLUSTER_ID"
}
],
"sortBy": "NAME",
"sortOrder": "ASC",
"typeFilter": [
"LinuxFileset",
"ShareFileset",
"VmwareVirtualMachine",
"WindowsFileset",
"HypervVirtualMachine",
"NutanixVirtualMachine",
"NAS_FILESET"
],
"after":"Y3Vyc29yOmludDow"
}
|
Sample API Response
{
"data": {
"inventoryRoot": {
"descendantConnection": {
"edges": [
{
"cursor": "Y3Vyc29yOmludDox",
"node": {
"id": "",
"effectiveSlaDomain": {
"id": "",
"name": "MGMT-12H-30D-1Y-AWS-USW1",
"isRetentionLockedSla": false,
"retentionLockMode": "NO_MODE",
"__typename": "GlobalSlaReply",
"description": "Upgraded from Cluster_A"
},
"pendingSla": null,
"__typename": "NasFileset",
"cluster": {
"id": "",
"name": "Cluster_A",
"version": "8.1.3-p11-25483",
"__typename": "Cluster"
},
"primaryClusterLocation": {
"id": "",
"__typename": "DataLocation"
},
"logicalPath": [
{
"name": "/volume1/ISO: **",
"objectType": "FilesetTemplate",
"__typename": "PathNode"
},
{
"name": "/volume1/ISO",
"objectType": "NasShare",
"__typename": "PathNode"
},
{
"name": "domain.com",
"objectType": "NasSystem",
"__typename": "PathNode"
}
],
"physicalPath": [
{
"name": "/volume1/ISO: **",
"objectType": "FilesetTemplate",
"__typename": "PathNode"
},
{
"name": "/volume1/ISO",
"objectType": "NasShare",
"__typename": "PathNode"
},
{
"name": "domain.com",
"objectType": "NasSystem",
"__typename": "PathNode"
}
],
"name": "/volume1/ISO: **",
"objectType": "NAS_FILESET"
},
"__typename": "HierarchyObjectEdge"
}
],
"pageInfo": {
"endCursor": "Y3Vyc29yOmludDox",
"hasNextPage": true,
"hasPreviousPage": true,
"__typename": "PageInfo"
},
"__typename": "HierarchyObjectConnection"
},
"__typename": "InventoryRoot"
}
}
}
Rubrikに存在するクラスターを取得する
API Endpoint: /api/graphql
Method:ポスト
Headers
| 鍵 | Value |
|---|---|
| ユーザーエージェント | netskope-ce-5.0.1-cte-rubrik-v1.0.0 |
| Authorization | 無記名トークン<Bearer Token> |
| Content-Type | アプリケーション/json |
Payload
| GraphQLクエリ | Variables |
|---|---|
query ClusterPickerQuery($first: Int, $after: String, $filter: ClusterFilterInput, $sortBy: ClusterSortByEnum, $sortOrder: SortOrder) {
clusterConnection(filter: $filter, sortBy: $sortBy, sortOrder: $sortOrder, first: $first, after: $after) {
edges {
cursor
node {
id
status
...ClusterIconNameFragment
...ClusterVersionColumnFragment
...ClusterTypeColumnFragment
...ClusterCapacityColumnFragment
...ClusterProtectedCountColumnFragment
...ClusterGeoLocationColumnFragment
...ClusterNameColumnFragment
__typename
}
__typename
}
pageInfo {
startCursor
endCursor
hasNextPage
hasPreviousPage
__typename
}
__typename
}
}
fragment ClusterIconNameFragment on Cluster {
id
name
status
pauseStatus
state {
clusterRemovalState
__typename
}
defaultAddress
passesConnectivityCheck
connectivityLastUpdated
...ClusterNodeConnectionFragment
globalManagerConnectivityStatus {
urls {
url
isReachable
__typename
}
__typename
}
systemStatus
ccprovisionInfo {
jobStatus
jobType
progress
vendor
__typename
}
__typename
}
fragment ClusterNodeConnectionFragment on Cluster {
clusterNodeConnection {
nodes {
id
status
ipAddress
__typename
}
__typename
}
__typename
}
fragment ClusterVersionColumnFragment on Cluster {
version
eosDate
eosStatus
__typename
}
fragment ClusterTypeColumnFragment on Cluster {
name
productType
type
clusterNodeConnection {
nodes {
id
__typename
}
__typename
}
__typename
}
fragment ClusterCapacityColumnFragment on Cluster {
metric {
usedCapacity
availableCapacity
totalCapacity
__typename
}
__typename
}
fragment ClusterProtectedCountColumnFragment on Cluster {
productType
noSqlWorkloadCount
...ClusterProtectedSnappablesFragment
__typename
}
fragment ClusterProtectedSnappablesFragment on Cluster {
protectedSnappables: snappableConnection(filter: {protectionStatus: Protected}) {
count
__typename
}
__typename
}
fragment ClusterGeoLocationColumnFragment on Cluster {
geoLocation {
address
__typename
}
__typename
}
fragment ClusterNameColumnFragment on Cluster {
name
__typename
}
|
{
"sortBy": "ClusterName",
"sortOrder": "ASC",
"filter": {
"type": [],
"name": [
""
]
},
"first": 1
}
|
Sample API Response
{
"data": {
"clusterConnection": {
"edges": [
{
"cursor": "Y3Vyc29yOmludDow",
"node": {
"id": "40fdb2a5-3591-40ee-a37a-50bce5240d62",
"status": "Connected",
"name": "Cluster_A",
"pauseStatus": "NOT_PAUSED",
"state": {
"clusterRemovalState": "REGISTERED",
"__typename": "clusterState"
},
"defaultAddress": "cluster-a.domain.com",
"passesConnectivityCheck": true,
"connectivityLastUpdated": "2024-08-05T10:16:10.000Z",
"clusterNodeConnection": {
"nodes": [
{
"id": "RVMHM223S002373",
"status": "OK",
"ipAddress": "10.8.107.107",
"__typename": "ClusterNode"
},
{
"id": "RVMHM223S002379",
"status": "OK",
"ipAddress": "10.8.107.106",
"__typename": "ClusterNode"
},
{
"id": "RVMHM223S002714",
"status": "OK",
"ipAddress": "10.8.107.104",
"__typename": "ClusterNode"
},
{
"id": "RVMHM223S002718",
"status": "OK",
"ipAddress": "10.8.107.105",
"__typename": "ClusterNode"
}
],
"__typename": "ClusterNodeConnection"
},
"__typename": "Cluster",
"globalManagerConnectivityStatus": {
"urls": [
{
"url": "https://mycustomername.my.rubrik.com",
"isReachable": true,
"__typename": "GlobalManagerUrl"
}
],
"__typename": "GlobalManagerConnectivity"
},
"systemStatus": "OK",
"ccprovisionInfo": {
"jobStatus": "INITIALIZING",
"jobType": "ADD_NODE",
"progress": 0,
"vendor": "VENDOR_UNKNOWN",
"__typename": "CcprovisionInfo"
},
"version": "8.1.3-p11-25483",
"eosDate": "2024-07-25",
"eosStatus": "EOS_STATUS_UNSUPPORTED",
"productType": "CDM",
"type": "OnPrem",
"metric": {
"usedCapacity": 7113709735936,
"availableCapacity": 54306599845888,
"totalCapacity": 61420309581824,
"__typename": "ClusterMetric"
},
"noSqlWorkloadCount": 0,
"protectedSnappables": {
"count": 148,
"__typename": "SnappableConnection"
},
"geoLocation": {
"address": "Santa Clara, CA, USA",
"__typename": "GeoLocation"
}
},
"__typename": "ClusterEdge"
}
],
"pageInfo": {
"startCursor": "Y3Vyc29yOmludDow",
"endCursor": "Y3Vyc29yOmludDow",
"hasNextPage": true,
"hasPreviousPage": false,
"__typename": "PageInfo"
},
"__typename": "ClusterConnection"
}
}
}
Rubrik での脅威ハントの開始
API Endpoint: /api/graphql
Method:ポスト
Headers
| 鍵 | Value |
|---|---|
| ユーザーエージェント | netskope-ce-5.0.1-cte-rubrik-v1.0.0 |
| Authorization | 無記名トークン<Bearer Token> |
| Content-Type | アプリケーション/json |
Payload
| GraphQLクエリ | Variables |
|---|---|
mutation StartThreatHuntMutation($input: StartThreatHuntInput!)
{
startThreatHunt(input: $input)
{
huntId isSyncSuccessful __typename
}
}
|
{
"input": {
"clusterUuid": "40fdb2a5-3591-40ee-a37a-50bce5240d62",
"indicatorsOfCompromise": [
{
"iocKind": "IOC_HASH",
"iocValue": "sha256:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e"
},
{
"iocKind": "IOC_HASH",
"iocValue": "sha256:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146f"
}
],
"objectFids": [
“”
],
"fileScanCriteria": {
"fileSizeLimits": {
"maximumSizeInBytes": 1024,
"minimumSizeInBytes": 5
},
"pathFilter": {
"includes": [
"*.acm",
"*.ax",
"*.cpl",
"*.dll",
"*.drv",
"*.efi",
"*.exe",
"*.mui",
"*.ocx",
"*.scr",
"*.sys",
"*.tsp"
],
"excludes": [],
"exceptions": []
}
},
"maxMatchesPerSnapshot": 1,
"name": "Sample threat hunt",
"shouldTrustFilesystemTimeInfo": true,
"snapshotScanLimit": {
"maxSnapshotsPerObject": 1
}
}
}
|
Sample API Response
{
"data": {
"startThreatHunt": {
"huntId": "892caaf9-90d3-5c87-8297-5862e972a032",
"isSyncSuccessful": true,
"__typename": "StartThreatHuntReply"
}
}
}
パフォーマンスマトリックス
以下は、これらの仕様を持つ大規模CEスタック上で、10万個の指標をRubrikに共有して実施したパフォーマンス測定結果です。
| スタックの詳細 | サイズ:大 RAM:32 GB CPU:16コア |
| Rubrikから取得した指標 | NA |
| Rubrikと共有された指標 | ~26K per minute |
ユーザーエージェント
netskope-ce-5.0.1-cte-rubrik-v1.0-0
ワークフロー
- クライアントIDとクライアントシークレットを取得してください。
- Rubrikプラグインを設定します。
- 脅威交換ビジネスルールを設定します。
- 脅威エクスチェンジ共有を設定する。
- Rubrikプラグインを検証してください。
再生ボタンをクリックして動画をご覧ください。
設定パラメータを取得する
クライアントIDとクライアントシークレットを生成するには、このドキュメントの手順に従ってください。
https://docs.rubrik.com/en-us/saas/saas/adding_a_service_account.html?hl=adding%2Cservice%2Caccount
Rubrikプラグインの設定
- Cloud ExchangeにログインしてSettings > Pluginsに移動してください。
- CTE Rubrikプラグインボックスを検索して選択してください。

- 基本情報を入力してください:
- 設定名: プラグイン設定名
- 同期間隔:このプラグインソースからデータを取得する間隔。
- 有効期限基準:特定の期間が経過すると、インジケーターが失効します。
- 評判の上書き:この設定から受信した指標の評判を上書きする値を設定します。デフォルト設定のままにする場合は空欄のままにしてください。
- SSL検証を有効にする:SSL証明書の検証を有効にします。
- システムプロキシを使う: 設定で設定されたシステムプロキシを使います。

- Nextをクリックしてください。
- 設定パラメータを入力してください:
- Base URL: Base URL of Rubrik instance, like https://rubrik01.rubrikdemo.com.
- クライアント ID: Rubrik プラットフォームから生成されたクライアント ID。 クライアントIDを取得するには、サービスアカウントのJSONを生成する必要があります。Rubrikでは、 Apps > Settings > Users and Accessに移動して生成してください。
- クライアント シークレット: Rubrik プラットフォームから生成されたクライアント シークレット。 クライアントシークレットを取得するには、サービスアカウントのJSONを生成する必要があります。RubrikでApps > Settings > Usersに移動してアクセスすると生成できます。
- Saveをクリックしてください。
Rubrikプラグインのビジネスルールを設定する
ビジネスルールは 共有する指標をフィルタリングするためのものです。 RubrikとIoCを共有するには、ビジネスルールを作成します。 次の手順:
- Threat Exchange > Business Rulesに移動してCreate New Ruleをクリックしてください。

- ルール名を追加し、IoCをフィルタリングする対象となるフィールドを選択します。完了したら、 Saveをクリックしてください。
Rubrikプラグインに共有機能を追加する
共有を設定するには、以下の手順に従ってください。
- Threat Exchange > Sharing に移動してAdd Sharing Configurationをクリックしてください。
- ソース構成(Rubrikにデータを共有するソース)、ビジネスルール、および宛先Select 。
- 目標値Select 、以下の値を入力してください。
- 脅威ハント名:脅威ハントの名前を入力してください。この名前の脅威ハントがRubrik上で開始されます。
- クラスター名:脅威ハンティングを開始するRubrikクラスター。
- スキャン対象ファイルの最大サイズ(KB):スキャン対象ファイルの最大サイズ(KB単位)。デフォルト値は1024KBです。最大サポートサイズは15000000KB、最小サポートサイズは1KBです。
- スキャンに必要な最小ファイルサイズ(KB):スキャンに必要な最小ファイルサイズ(KB)。デフォルトは5KBです。最大サポートサイズは15000000KB、最小サポートサイズは1KBです。
- インジデントの指標の最大一致数 (スナップショットごと): スナップショットごとのインジデントの指標の最大一致数。 デフォルト値は1です。最大許容値は1000、最小許容値は1です。
- 含めるファイル:脅威ハントに含めるファイル。
- 除外ファイル:脅威ハントから除外するファイル。
- 除外しないファイル:脅威ハントから除外してはならないファイル。


- Save .
をクリックしてください
Rubrikプラグインを検証する
プル機能はサポートされていません。
プッシュ通知を検証する
Rubrikへの共有IOCは、Cloud Exchangeの Logging ページで利用可能なログから検証できます。
Rubrikで共有されているIoCはApps > Data Threat Analytics > Threat Huntで検証できます。作成した脅威ハントをクリックしてください。
共有IoCを表示するには、「パラメータ」タブをクリックしてください。

トラブルシューティング
Rubrikプラグインの設定ができません
Rubrikプラグインの設定ができない場合は、以下のいずれかの理由が考えられます。
- クレデンシャルには適切な許可が与えられていません。
- 間違ったクレデンシャルが提供されました。
上記の問題を解決するには、以下の手順に従ってください。
- Cloud Exchangeでプラグインのログを確認してください。
- 提供されたクレデンシャルに適切な権限があることを確認してください。
- プラグインの構成時に正しいクレデンシャルが指定されていることを確認してください。
Rubrikにデータをプッシュできません
IoCをRubrikプラグインと共有できない場合は、以下のいずれかの理由が考えられます。
- 指定されたMD5およびSHA256の値が無効です。
- 共有データのタイプがMD5またはSHA256以外の場合。
上記の問題を解決するには、以下の手順に従ってください。
- Cloud Exchangeでプラグインのログを確認してください。
- 共有する必要のあるMD5とSHA256が有効であることを確認してください。
- IoC(侵害指標)がMD5またはSHA256のいずれかのタイプであることを確認してください。

