MSPツール
お使いのRMMはすでにAPI呼び出しを行っています。Clavitorがその安全性を確保します。
技術者の皆様は毎日Datto、N-able、ConnectWiseを使用しています。すべてのスクリプト、自動化、スケジュールタスクには資格情報が必要です。現在、これらはスクリプト変数、カスタムフィールド、または誰でも読み取り可能な共有ボールトに保存されています。ClavitorのプロキシとCLIは、ワークフローを変更することなくこの状況を改善します。
RMM向けプロキシパターン
エンドポイントでHTTPS_PROXYを設定すると、既存のスクリプトは変更なしで動作します。プロキシは送信HTTPSリクエストを傍受し、ヘッダー内のclavitor://参照を解決して、実際の資格情報を挿入します。スクリプトがシークレットを認識することはありません。RMMコンソールにログが記録されることもありません。
# On the managed endpoint — one-time setup
$env:HTTPS_PROXY = "http://localhost:1983"
# Your existing automation scripts work unchanged
# The proxy resolves clavitor:// references in request headers
Invoke-RestMethod -Uri "https://api.openai.com/v1/models" `
-Headers @{ Authorization = "Bearer clavitor://OpenAI/key" }PowerShell
PowerShellはMSPにとって日常的な言語です。CLIとプロキシの両方がネイティブに動作します。
CLI — 単一の値
# Resolve, use, scrub — the credential lives for one statement $cred = clavitor-cli get "Client-Acme/VPN" --field password Add-VpnConnection -Name "Acme" -ServerAddress "vpn.acme.com" -AuthenticationMethod MSChapv2 $secure = ConvertTo-SecureString $cred -AsPlainText -Force Set-VpnConnectionUsernamePassword -ConnectionName "Acme" -Password $secure Remove-Variable cred, secure
Render — 設定テンプレート
# Template with clavitor:// references (safe to store in your RMM) clavitor-cli render monitoring-config.json | ` Set-Content -Path "C:\ProgramData\Monitor\config.json"
プロキシ — 透過的な注入
$env:HTTPS_PROXY = "http://localhost:1983"
# Every Invoke-RestMethod and Invoke-WebRequest now resolves clavitor://
Invoke-RestMethod -Uri "https://api.datto.com/v1/devices" `
-Headers @{ Authorization = "Bearer clavitor://Datto API/key" }Atera
Ateraは実行時に{[Atera.<level>.CustomField.<name>]}構文を使用して、カスタムフィールドのプレースホルダーをスクリプトパラメータに置換します。Clavitorトークンをワンタイムインストールスクリプトのパラメータとして渡します。以降のスクリプトでは、エンドポイント上のCLIを呼び出します。
IT Automationプロファイルを使用したインストール
Ateraのスクリプトライブラリで、1つのパラメータを持つInstall Clavitor PowerShellスクリプトを作成します。これを実行するIT Automationプロファイルで、顧客レベルのフィールドプレースホルダーを指定して呼び出します:
Install-Clavitor.ps1 -Token "{[Atera.Customer.CustomField.ClavitorToken]}"Ateraは、エージェントが引数リストを読み取る前に値を置換します。スクリプト:
param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
実行時に資格情報を解決
エンドポイントの登録が完了すると、その後のすべてのAteraスクリプトはボールトから資格情報を読み取ります。Ateraが保持するのはトークンスロットのみです:
$pass = clavitor-cli get "Client-Acme/SQL Server" --field password
$secure = ConvertTo-SecureString $pass -AsPlainText -Force
Invoke-Sqlcmd -ServerInstance "sql.acme.local" `
-Credential (New-Object PSCredential("sa", $secure)) -Query "SELECT 1"
Remove-Variable pass, secureConnectWise Automate
Automateは{%^el:FieldName^%}構文(コンピューターレベルEDF)を使用して、Extra Data Field(EDF)マクロをスクリプトステップの引数に置換します。CLIは、バイナリをダウンロードし、トークンをパラメータとして渡すPowerShellステップを呼び出すAutomateスクリプト経由でインストールされます。EDFの値は、スクリプトステップが実行される前に置換されます。
Automateスクリプト:インストール
Automateスクリプトエディタで、2つのステップを持つスクリプトを作成します:
Step 1 File Download from LTShare clavitor-cli.exe → %windir%\Temp\
Step 2 Shell Execute (PowerShell) Install-Clavitor.ps1 -Token "{%^el:ClavitorToken^%}"PowerShellステップが実行される前に、{%^el:ClavitorToken^%}マクロはコンピューターレベルEDFの値に置換されます。LabReplaceの置換制限内に収めるため、トークンは255文字以下にしてください。スクリプト自体:
# Install-Clavitor.ps1 param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
Automateスクリプト:ドメイン資格情報のローテーション
その後のスクリプトはボールトから読み取り、ダッシュボード表示用にEDFへステータスを書き戻します:
$cred = clavitor-cli get "Client-Delta/Domain Admin" --field password
$secure = ConvertTo-SecureString $cred -AsPlainText -Force
Reset-ComputerMachinePassword `
-Credential (New-Object PSCredential("administrator", $secure))
# Push timestamp back to EDF "LastRotation" via Automate's ExtraData Set Value step
Write-Output (Get-Date -Format o)
Remove-Variable cred, secureDatto RMM
Datto RMMは、サイト変数とグローバル変数を$env:プレフィックス付きの環境変数としてPowerShellコンポーネントに公開します。ユーザー定義フィールド(UDF)は$env:UDF_1から$env:UDF_30として公開されます。1つのコンポーネントでCLIをインストールし、その後の処理はすべてボールトから読み取ります。
コンポーネント:インストールと初期化
Dattoコンソールでサイト変数ClavitorTokenを定義します。これはコンポーネント内で$env:ClavitorTokenとして公開されます:
# Datto RMM component: bootstrap Clavitor CLI # Site variable "ClavitorToken" → $env:ClavitorToken at runtime $env:ClavitorToken | clavitor-cli init
コンポーネント:プロキシ経由のAPIモニター
その後のコンポーネントは、リクエストヘッダーにclavitor://参照を書き込みます。プロキシがホスト上でそれらを解決します。資格情報がスクリプトのメモリやDattoのログに記録されることはありません:
# Scheduled monitor — runs every 15 minutes
$env:HTTPS_PROXY = "http://localhost:1983"
$response = Invoke-RestMethod -Uri "https://api.client.com/v1/status" `
-Headers @{ Authorization = "Bearer clavitor://Client-Bravo/Monitoring API" }
# Push a status code back into UDF_5 for the Datto dashboard
New-ItemProperty -Path "HKLM:\SOFTWARE\CentraStage" `
-Name "Custom5" -Value $response.status -Force | Out-NullKaseya VSA
VSAエージェント手順は、実行時に#variable#マクロをPowerShell引数に置換し、executePowershellステップファミリー(executePowerShell64BitSystemなど)を使用してスクリプトを実行します。エージェントレコードのカスタムフィールドにClavitorトークンを保持し、手順はstdin経由でinitにトークンを渡します。
エージェント手順:インストール
エージェントのカスタムフィールドClavitorTokenを追加し(Audit → Edit Profile → Custom Fields)、2つのステップからなる手順を作成します:
Step 1 Get File from VSA Server clavitor-cli.exe → C:\Program Files\Clavitor\
Step 2 Execute PowerShell (64 Sys) "C:\Program Files\Clavitor\clavitor-cli.exe init" \
stdin = "#vAgentConfiguration.ClavitorToken#"VSAがコマンドを実行する前に、#vAgentConfiguration.ClavitorToken#マクロはカスタムフィールドの値に置換されます。トークンがVSAの手順履歴に表示されることはありません。
エージェント手順:特権資格情報のローテーション
初期化が完了すると、その後のすべての手順はボールトから読み取ります:
# Executed via executePowerShell64BitSystem $cred = clavitor-cli get "Client-Hotel/Local Admin" --field password $secure = ConvertTo-SecureString $cred -AsPlainText -Force Set-LocalUser -Name "Administrator" -Password $secure Remove-Variable cred, secure
N-able N-central
自動化の単位はAMP(Automation Manager Policy)であり、Automation Managerで構築されるPowerShellベースのポリシーです。組織、顧客、またはサイトレベルのカスタムプロパティは、Run PowerShell Scriptオブジェクトに入力パラメータとして渡すことができます。
AMP:カスタムプロパティを入力としたインストール
顧客レベルでカスタムプロパティClavitorTokenを追加します(Administration → Custom Properties)。Automation Managerで、Run PowerShell Scriptオブジェクトの入力パラメータTokenをそのカスタムプロパティにバインドするAMPを作成します。スクリプト:
param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
カスタムプロパティの値は$Tokenとして渡されます。この値がAMPのエクスポートされたXMLやN-centralの監査ログに表示されることはありません。
スクリプトリポジトリ:実行時に資格情報を取得
スクリプトリポジトリ(Configuration → Repository → Scripts/Software)経由でプッシュされるアドホックスクリプトの場合、エンドポイントはすでに初期化されているため、スクリプトはCLIを呼び出すだけです:
$dbPass = clavitor-cli get "Client-Bcme/SQL Server" --field password
$secure = ConvertTo-SecureString $dbPass -AsPlainText -Force
Invoke-Sqlcmd -ServerInstance "sql.bcme.com" `
-Credential (New-Object PSCredential("sa", $secure)) -Query "SELECT 1"
Remove-Variable dbPass, secureN-able N-sight
N-sight(旧SolarWinds RMM)はN-centralと同じAutomation Managerエンジンを実行し、さらに.ps1、AMP、バッチなどのスクリプトタイプ用のスクリプトマネージャーを備えています。パターンはN-centralと同様で、トークン用の入力パラメータを持つAMPを使用し、その後の処理はすべて実行時に解決されます。
スクリプトマネージャー:Automated Taskを使用したインストール
トークン用のパラメータを持つInstall-Clavitor.ps1を、Settings → Script Managerにアップロードします。これをエンドポイントのAutomated Taskとしてアタッチし、デバイスレベルの設定からトークンをスクリプト引数として渡します:
param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
Automated Task:ボールトの資格情報を使用したスケジュールバックアップ
初期化が完了すると、スケジュールされたタスクはボールトから資格情報を取得します。255文字までの標準出力はN-sightダッシュボードに表示されます:
$pass = clavitor-cli get "Client-India/SQL Backup" --field password
$secure = ConvertTo-SecureString $pass -AsPlainText -Force
Backup-SqlDatabase -ServerInstance "sql.india.com" -Database "AppDB" `
-Credential (New-Object PSCredential("backup-svc", $secure))
Write-Output "backup OK $(Get-Date -Format o)"
Remove-Variable pass, secureNinjaOne
エンドポイントで実行されるNinjaOneスクリプトは、組み込みコマンドレットを使用してカスタムフィールドの読み書きが可能です。Ninja-Property-Get <name>は値を返し、Ninja-Property-Set <name> <value>は値を書き戻します。Clavitorトークンは組織のカスタムフィールド(コンソールからは書き込みのみ可能なSecureタイプ)に保存します。インストールスクリプトはこれを1回だけ読み取ります。
インストールスクリプト:カスタムフィールドからトークンを読み取る
Administration → Library → Custom Fieldsで、Secureタイプの組織フィールドclavitorTokenを追加します。次に、インストールスクリプトを実行します:
$token = Ninja-Property-Get clavitorToken $token | clavitor-cli init Remove-Variable token
カスタムアクション:プロキシ経由のAPI呼び出し
インストールが完了すると、自動化スクリプトはプロキシ経由で外部APIを呼び出します。資格情報がスクリプト変数にコピーされることはありません:
$env:HTTPS_PROXY = "http://localhost:1983"
$response = Invoke-RestMethod -Uri "https://api.client-echo.com/v1/status" `
-Headers @{ Authorization = "Bearer clavitor://Client-Echo/Monitoring API" }
# Push the result back to a device custom field for dashboarding
Ninja-Property-Set lastApiStatus $response.statusSyncro
Syncroは{{asset_custom_field_<name>}}二重中括弧構文を使用して、アセットのカスタムフィールドとタグをPlatformスクリプト変数として公開します。Platformタイプのスクリプト変数を定義し、フィールドにバインドします。Syncroはスクリプト実行時に値をPowerShellパラメータに置換します。
Syncroスクリプト:インストール
アセットのカスタムフィールドclavitor_tokenを作成します。スクリプトエディタで、{{asset_custom_field_clavitor_token}}にバインドされたPlatformタイプの変数Tokenを宣言し、スクリプト本体のPowerShellパラメータに渡します:
param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
各Syncroスクリプトエディタの下部にあるQuick Helpパネルには、アセット、顧客、チケットのコンテキストで利用可能なすべてのプラットフォーム変数が一覧表示されます。
Syncroスクリプト:ボールトの資格情報を使用したVPN接続
インストール後、スクリプトとAutomated Remediationsはボールトから資格情報を解決し、直接使用します:
$pass = clavitor-cli get "Client-Golf/VPN" --field password $secure = ConvertTo-SecureString $pass -AsPlainText -Force Add-VpnConnection -Name "Golf" -ServerAddress "vpn.golf.com" ` -AuthenticationMethod MSChapv2 -Force Set-VpnConnectionUsernamePassword -ConnectionName "Golf" -Password $secure # Write status back to asset for Syncro dashboard Rmm-Alert -Category "vpn-status" -Body "Golf connected $(Get-Date -Format o)" Remove-Variable pass, secure
MSPにとって重要な理由
すべてのRMMプラットフォームは、カスタムプロパティ、サイト変数、拡張データフィールド、スクリプトパラメータなど、どこかに資格情報を保存しています。コンソールにアクセスできるすべての技術者がそれらを閲覧できます。RMMコンソールが侵害されると、すべてのクライアントの資格情報が露呈します。
Clavitorは資格情報をRMMの外に移動します。RMMが保存するのはエージェントトークン(クライアントごとに1つ)のみです。トークンは、そのクライアントのボールトへのスコープ付きアクセスを許可します。RMMコンソールが侵害されても露呈するのは資格情報ではなくトークンであり、各トークンはデプロイ先のエンドポイントのIPホワイトリストに登録されています。
クライアントごとのスコープ設定
各クライアントのボールトには独自のエージェントトークンがあります。技術者のアクセスは、「誰がRMMコンソールにログインできるか」ではなく、スコープによって制御されます。
スクリプトごとの監査
すべての資格情報アクセスは、どのスクリプト、どのエンドポイント、どの資格情報、いつアクセスしたかがログに記録されます。クライアントは監査証跡を確認でき、誰が何にアクセスしたかを証明できます。
ワンクリックで失効
クライアントが離脱した場合は、エージェントトークンを失効させます。すべてのエンドポイントで資格情報の解決が即座に停止します。200台のマシン全体でパスワードをローテーションしたり、カスタムプロパティをクリアしたりする必要はありません。
RMMに資格情報を保存するのはやめましょう。
1つのCLIですべてのクライアントに対応。すべての資格情報がスコープ設定され、監査可能で、失効可能です。