Rubrik セキュリティ クラウド モニタリング
最終更新日 - 03年2026月XNUMX日
LogicMonitor の Rubrik Security Cloud Monitoring パッケージは、Rubrik Security Cloud GraphQL API を活用して、Rubrik が管理するクラスターの健全性、容量、パフォーマンスを監視します。
この監視パッケージは、次の監視機能を提供します。
- クラスターパフォーマンスメトリック—使用済み、使用可能、スナップショット、容量使用率のパーセンテージを含む総容量を監視します。
- 圧縮統計—圧縮前と圧縮後のデータ量を追跡して、ストレージ効率と圧縮率を把握します。
- クラスターヘルス—クラスターのステータス、バージョン情報、ノードとディスクの数を監視します。
- Webhook の統合—Rubrik Security Cloud の Webhook 通知を使用して、リアルタイムのアラートとイベントを LM ログに直接送信します。
監視パッケージは Rubrik Security Cloud の GraphQL クエリを使用するため、個々の Rubrik ノードに直接アクセスする必要がなくなり、環境内のすべてのクラスターにわたって一元的な可視性が提供されます。
Rubrik Security Cloudの詳細については、以下を参照してください。 ルーブリック セキュリティ クラウド API Rubrick より。
Rubrik Security Cloud Monitoring の要件
Rubrik Security Cloud Monitoring パッケージを使用するには、次のものが必要です。
- Rubrik Security Cloudアカウントとポータルアクセス
- Rubrik クライアント ID と秘密鍵の資格情報、および GraphQL API を介してクラスター情報を照会するための適切な権限
詳細については、を参照してください。 認証 Rubrik より。 - Rubrik Security Cloudに登録されたクラスター
- https://[portal-name].my.rubrik.com へのコレクターのアウトバウンド HTTPS アクセス
Rubrik Security CloudのWebhook統合を設定するには、LogicMonitorで作成されたベアラートークンが必要です。詳細については、 ベアラー トークンの追加.
Rubrik Security Cloud リソースを監視に追加する
Rubrik Security Cloud リソースは、次のいずれかの方法で監視にオンボードできます。
- 拡張スクリプト NetScan (推奨)
- 手動でリソースを追加する
NetScan の詳細については、次を参照してください。 NetScan の概要。
拡張スクリプトNetScanを使用してリソースを追加する
- LogicMonitorで、次の場所に移動します モジュール > 応募者と.
- Rubrik Security Cloud モジュール パッケージを見つけてインストールします。
- MFAデバイスに移動する リソース > 追加 > 高度なネットスキャン.
- NetScan の名前を入力します (例: Rubrik Security Cloud Clusters)。
- NetScan を実行するコレクタを選択します。
- 「拡張スクリプトNetScan」を選択します。 方法 ドロップダウンメニュー。
- 拡張スクリプトセクションで、 デバイスの資格情報 > このスキャンにはカスタム資格情報を使用します。
- NetScan に必要な Rubrik Security Cloud 資格情報を提供し、リソースの編成方法を制御するには、次のプロパティを追加します。
| プロパティ | 詳細説明 | 必須 |
rubrik.rsc.portal | Rubrik Security Cloud ポータル名 | あり |
rubrik.rsc.clientid | サービスアカウントクライアントID | あり |
rubrik.rsc.key | サービスアカウントの秘密鍵 | あり |
custom.folder.name | 検出されたクラスタのルートデバイスグループ | いいえ |
lmaccess.id or logicmonitor.access.id | デバイス重複排除用の LM API アクセス ID | あり お願い: 必須。 skip.device.dedupe に設定されています true. |
lmaccess.key or logicmonitor.access.key | デバイス重複排除用の LM API アクセス キー | あり お願い: 必須。 skip.device.dedupe に設定されています true |
hostname.source | ホスト名の衝突処理を制御する | いいえ |
skip.device.dedupe | デバイスの重複排除チェックをスキップする | いいえ |
lmapi.timelimit.sec | LM APIルックアップの時間制限 | いいえ |
- 選択する Groovyスクリプトを埋め込む 次のスクリプトを埋め込みます。
警告: スクリプトを編集しないでください。 編集された拡張スクリプト NetScan はサポートされていません。 LogicMonitor が提供するスクリプトを編集した場合、問題が発生した場合、LogicMonitor サポートはサポートされているスクリプトで編集内容を上書きするよう要求する場合があります。 拡張スクリプト NetScan は、LM Envision リソースの作成を 600 時間あたり 600 以下に制限します。 9 を超えるリソースを作成するには、すべてのリソースが追加されるまで NetScan を XNUMX 時間ごとに繰り返すようにスケジュールします。 XNUMX. 「スケジュール」セクションで、「スケジュールに従ってこの NetScan を実行する」を選択します。 動的環境の場合、NetScan を XNUMX 時間ごとに実行するようにスケジュールできます。
/*******************************************************************************
* © 2007-2026 - LogicMonitor, Inc. All rights reserved.
******************************************************************************/
import com.santaba.agent.groovy.utils.GroovyScriptHelper as GSH
import com.logicmonitor.mod.Snippets
import groovy.json.JsonOutput
// To run in debug mode, set to true
Boolean debug = false
// Set props object based on whether or not we are running inside a netscan or debug console
def props
try {
hostProps.get("system.hostname")
props = hostProps
debug = true // set debug to true so that we can ensure we do not print sensitive properties
}
catch (MissingPropertyException) {
props = netscanProps
}
// Import any needed credentials or properties that have been set in the UI
// Required properties
def rscPortal = props.get('rubrik.rsc.portal')
def rscClientId = props.get('rubrik.rsc.clientid')
def rscSecret = props.get('rubrik.rsc.key')
// Optional properties
def rootFolder = props.get('custom.folder.name', 'Rubrik Security Cloud')
Boolean skipDeviceDedupe = props.get("skip.device.dedupe", "false").toBoolean()
String hostnameSource = props.get("hostname.source", "")?.toLowerCase()?.trim()
// Bail out early if we don't have the necessary credentials
if (!rscPortal || !rscClientId || !rscSecret) {
throw new Exception(" Must provide Rubrik Security Cloud credentials (rubrik.rsc.portal, rubrik.rsc.clientid, rubrik.rsc.key) to run this script.")
}
def modLoader = GSH.getInstance(GroovySystem.version).getScript("Snippets", Snippets.getLoader()).withBinding(getBinding())
def lmEmit = modLoader.load("lm.emit", "1.1")
def lmDebug = modLoader.load("lm.debug", "1.0").debugSnippetFactory(out, debug)
def http = modLoader.load("proto.http", "0").httpSnippetFactory(props)
// Only initialize lmApi snippet class if customer has not opted out
def lmApi
if (!skipDeviceDedupe) {
def lmApiSnippet = modLoader.load("lm.api", "0")
lmApi = lmApiSnippet.lmApiSnippetFactory(props, http, lmDebug)
}
// Initialize Rubrik Security Cloud snippet
def collectorCache = modLoader.load("lm.cache", "0")
def rubrikSC = modLoader.load("rubrik.securitycloud", "0").create(props, lmDebug, http, collectorCache)
// Get information about devices that already exist in LM portal
List fields = ["name", "currentCollectorId", "displayName"]
Map args = ["size": 1000, "fields": fields.join(",")]
def lmDevices
// But first determine if the portal size is within a range that allows us to get all devices at once
def pathFlag, portalInfo, timeLimitSec, timeLimitMs
if (!skipDeviceDedupe) {
portalInfo = lmApi.apiCallInfo("Devices", args)
timeLimitSec = props.get("lmapi.timelimit.sec", "60").toInteger()
timeLimitMs = (timeLimitSec) ? Math.min(Math.max(timeLimitSec, 30), 120) * 1000 : 60000 // Allow range 30-120 sec if configured; default to 60 sec
if (portalInfo.timeEstimateMs > timeLimitMs) {
lmDebug.LMDebugPrint("Estimate indicates LM API calls would take longer than time limit configured. Proceeding with individual queries by display name for each device to add.")
lmDebug.LMDebugPrint("\t${portalInfo}\n\tNOTE: Time limit is set to ${timeLimitSec} seconds. Adjust this limit by setting the property lmapi.timelimit.sec. Max 120 seconds, min 30 seconds.")
pathFlag = "ind"
}
else {
lmDebug.LMDebugPrint("Response time indicates LM API calls will complete in a reasonable time range. Proceeding to collect info on all devices to cross reference and prevent duplicate device creation.\n\t${portalInfo}")
pathFlag = "all"
lmDevices = lmApi.getPortalDevices(args)
}
}
// Retrieve all clusters from Rubrik Security Cloud
def allClustersQuery = """
query AllClusters {
clusterConnection {
nodes {
id
name
version
status
geoLocation {
address
latitude
longitude
}
metric {
totalCapacity
usedCapacity
}
}
}
}
"""
def allClustersResults = rubrikSC.graphqlQuery(allClustersQuery, [:], "AllClusters")
if (!allClustersResults) {
throw new Exception("Failed to retrieve clusters from Rubrik Security Cloud.")
}
// Extract clusters from the response
def clusters = allClustersResults?.data?.clusterConnection?.nodes
if (!clusters) {
throw new Exception("No clusters found in Rubrik Security Cloud portal.")
}
lmDebug.LMDebugPrint("Found ${clusters.size()} clusters in Rubrik Security Cloud portal.")
// Build list of resources
List<Map> resources = []
def now = new Date()
def dateFormat = "yyyy-MM-dd'T'HH:mm:ss.s z"
TimeZone tz = TimeZone.getDefault()
Map duplicateResources = [
"date" : now.format(dateFormat, tz),
"message" : "Duplicate display names found within LogicMonitor portal wherein hostname in LM does not match hostname in Netscan output. Refer to documentation for how to resolve name collisions using 'hostname.source' netscan property.",
"total" : 0,
"resources" : []
]
// Process each cluster
clusters.each { cluster ->
String clusterId = cluster.id ?: ""
String clusterName = cluster.name ?: clusterId
String hostname = "${clusterId}.rsc.invalid" // Create a fake non-routable hostname since RSC clusters do not have real hostnames
String displayName = clusterName
Integer collectorId
// Check for existing device in LM portal with this displayName
def deviceMatch = false
if (!skipDeviceDedupe) {
if (pathFlag == "ind") {
deviceMatch = lmApi.findPortalDevice(displayName, args)
}
else if (pathFlag == "all") {
deviceMatch = lmApi.checkExistingDevices(displayName, lmDevices)
}
}
if (deviceMatch) {
// Log duplicates that would cause additional devices to be created
if (hostname != deviceMatch.name) {
def collisionInfo = [
(displayName) : [
"Netscan" : [
"hostname" : hostname
],
"LM" : [
"hostname" : deviceMatch.name,
"collectorId" : deviceMatch.currentCollectorId
],
"Resolved" : false
]
]
// If user specified to use LM hostname on display name match, update hostname variable accordingly
if (hostnameSource == "lm" || hostnameSource == "logicmonitor") {
hostname = deviceMatch.name
collectorId = deviceMatch.currentCollectorId
deviceMatch = false
collisionInfo[displayName]["Resolved"] = true
}
// If user specified to use netscan data for hostname, update the display name to make it unique
else if (hostnameSource == "netscan") {
collisionInfo[displayName]["Resolved"] = true
displayName = "${displayName} - ${hostname}"
deviceMatch = false
}
duplicateResources["resources"].add(collisionInfo)
}
// Don't worry about matches where the hostname values are the same
else {
deviceMatch = false
}
}
// Build device properties
Map deviceProps = [
"rubrik.rsc.clusteruuid": clusterId,
"rubrik.rsc.portal": rscPortal,
"rubrik.rsc.clustername": clusterName,
"rubrik.rsc.clusterversion": cluster.version ?: "",
"rubrik.rsc.clusterstatus": cluster.status ?: "",
"rubrik.rsc.clientid": rscClientId ?: "",
"rubrik.rsc.key": rscSecret ?: ""
]
// Add location information if available
if (cluster.geoLocation?.address) {
deviceProps["system.location"] = cluster.geoLocation.address
}
if (cluster.geoLocation?.latitude != null) {
deviceProps["system.latitude"] = cluster.geoLocation.latitude
}
if (cluster.geoLocation?.longitude != null) {
deviceProps["system.longitude"] = cluster.geoLocation.longitude
}
// Determine group name based on status and location
List<String> groupName = [rootFolder]
if (cluster.status == "Connected") {
if (cluster.geoLocation?.address) {
groupName.add(cluster.geoLocation.address)
} else {
groupName.add("Connected")
}
} else {
groupName.add(cluster.status ?: "Unknown Status")
}
Map resource = [
"hostname" : hostname,
"displayname" : displayName,
"hostProps" : deviceProps,
"groupName" : groupName
]
// Only add the collectorId field to resource map if we found a collector ID above
if (collectorId) {
resource["collectorId"] = collectorId
duplicateResources["resources"][displayName]["Netscan"]["collectorId"] = collectorId
}
if (!deviceMatch) {
resources.add(resource)
lmDebug.LMDebugPrint("Added cluster: ${clusterName} (${clusterId}) - Status: ${cluster.status}")
}
}
// Output validated data in JSON format
lmEmit.resource(resources, debug)
// Report devices that already exist in LM via log file named after root folder
if (duplicateResources["resources"].size() > 0) {
def netscanDupLog = new File("../logs/NetscanDuplicates/${rootFolder.replaceAll(" ", "_")}.json")
new File(netscanDupLog.getParent()).mkdirs()
duplicateResources["total"] = duplicateResources["resources"].size()
def json = JsonOutput.prettyPrint(JsonOutput.toJson(duplicateResources))
netscanDupLog.write(json)
if (hostnameSource) {
lmDebug.LMDebug("${duplicateResources["resources"].size()} devices found that were resolved with hostname.source=${hostnameSource} in netscan output. See LogicMonitor/Agent/logs/NetscanDuplicates/${rootFolder.replaceAll(" ", "_")}.json for details.")
}
else {
lmDebug.LMDebug("${duplicateResources["resources"].size()} devices found that were not reported in netscan output. See LogicMonitor/Agent/logs/NetscanDuplicates/${rootFolder.replaceAll(" ", "_")}.json for details.")
}
}
lmDebug.LMDebugPrint("Successfully discovered ${resources.size()} Rubrik Security Cloud cluster(s)")
return 0- 選択する Save or 保存して実行.
NetScan を実行した後、追加されたリソースの数、または NetScan がリソースを作成しない場合はエラー メッセージの履歴を確認します。
注意: デフォルトでは、この NetScan によって検出されたクラスターは次のグループ パスを使用して編成されます。
custom.folder.name/cluster name
カスタム フォルダーが指定されていない場合、デフォルトのルート フォルダーは Rubrik Security Cloud になります。
Rubrik Security Cloud リソースを手動で監視に追加する
- LogicMonitor で、Rubrik Security Cloud リソース グループを作成します。
詳細については、を参照してください。 リソースグループの追加. - Rubrik Security クラウド リソースを Rubrik リソース グループに追加します。
- リソースまたはリソース グループに次のプロパティを追加するか、設定されていることを確認します。
| プロパティ | 値 | 必須 |
rubrik.rsc.portal | Rubrik Security Cloudポータルの名前(例: mycompany の mycompany.my.rubrik.com). | あり |
rubrik.rsc.clientid | Rubrik Security Cloud を認証するためのサービス アカウント クライアント ID。 | あり |
rubrik.rsc.key | Rubrik Security Cloud を認証するためのサービス アカウント シークレット。 | あり |
rubrik.rsc.clusteruuid | 特定のクラスタの一意の識別子(UUID)。NetScanによって自動的に設定され、手動で追加されたリソースの場合は手動で割り当てる必要があります。 | あり |
system.categories | 追加 rubrik_securitycloud デバイスの調整と分類を有効にします (PropertySource によって自動的に設定されます)。 | あり |
注意: サービス アカウントの資格情報は、親グループ レベルで設定して、すべての Rubrik Security Cloud クラスター リソースに自動的に適用できます。
プロパティの設定の詳細については、を参照してください。 リソースとインスタンスのプロパティ.
オンプレミス Rubrik ノード監視用の Webhook 統合の構成
- Rubrik Security Cloud で、Webhook を構成します。
詳細については、を参照してください。 イベント Rubrik より。
次の値が必要です:
| フィールド | 値 |
| Webhookエンドポイント | https://<your-portal>.logicmonitor.com/rest/logging/ingest/webhook |
| ベアラートークン | LogicMonitorで作成したベアラートークンを入力します |
- Webhook 構成をテストして、アラートが適切に流れていることを確認します。
詳細については、を参照してください。 イベント Rubrik より。
LogicModulesをインポートする
LM Exchange からすべての Rubrik Security Cloud LogicModules をインポートします。
モジュールが既に存在する場合は、最新バージョンであることを確認してください。インポート後、検出とデータ収集が自動的に開始されます。
トラブルシューティング
Rubrik Security Cloud Monitoring パッケージを展開または操作する際によくある問題を診断して解決するには、次のガイダンスに従ってください。
| 問題 | 解像度 |
| 認証失敗 | サービス アカウントの資格情報とポータル名の構成を確認します。 |
| データは収集されませんでした | 必要なプロパティ、クラスター UUID、コレクターの HTTPS 接続を確認します。 |
| Webhookの問題 | Webhook 構成とベアラー トークンの権限を確認します。 |
| API レート制限 | ポーリング頻度を減らすか、収集間隔を確認してください。 |
パッケージ内のLogicModules
LogicMonitorのRubrik Security Cloud Monitoringパッケージは、以下のLogicModuleで構成されています。完全なカバレッジを得るには、以下のLogicModuleがすべてLogicMonitorプラットフォームにインポートされていることを確認してください。
| 表示名 | タイプ | 詳細説明 |
addCategory_RubrikSecurityCloud | プロパティソース | 必要なカテゴリとプロパティを Rubrik Security Cloud クラスター リソースに割り当てます。 |
Rubrik_SecurityCloud_GlobalPerformance | データソース | クラスターの健全性、容量、およびインベントリ メトリックを監視します。 |
Rubrik_SecurityCloud_CompressionStatistics | データソース | クラスターの圧縮統計を監視します。 |
Rubrik_SecurityCloud_Webhooks | ログソース | Rubrik Security Cloud から Webhook アラートとログを受信します。 |
このパッケージの DataSource によって追跡されるさまざまなメトリクスに静的なデータポイントのしきい値を設定する場合、LogicMonitor はテクノロジー所有者のベスト プラクティス KPI 推奨事項に従います。
推奨事項: 必要に応じて、環境固有のニーズに合わせてこれらの事前定義されたしきい値を調整します。 データポイントのしきい値の調整の詳細については、を参照してください。 データポイントの静的しきい値.