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^%}"{%^el:ClavitorToken^%}マクロは、PowerShellステップが実行される前にコンピュータレベルの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トークンを保持し、プロシージャは標準入力を介してそれを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#"#vAgentConfiguration.ClavitorToken#マクロは、VSAがコマンドを実行する前にカスタムフィールドの値に置換されます。トークンは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、バッチなどのスクリプトタイプに対応するScript Managerを備えています。パターンはN-centralと同様で、トークンの入力パラメータを持つAMPを使用し、それ以外のすべてを実行時に解決します。
Script Manager: 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スクリプトは、組み込みのcmdletを介してカスタムフィールドの読み書きが可能です。Ninja-Property-Get <name>は値を返し、Ninja-Property-Set <name> <value>は値を書き戻します。Clavitorトークンを組織のカスタムフィールドに保存します(コンソールからの書き込み専用とするため、タイプはSecureにします)。インストールスクリプトはこの値を一度だけ読み取ります。
インストールスクリプト: カスタムフィールドからトークンを読み取る
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スクリプトエディタの下部にあるクイックヘルプパネルには、アセット、顧客、チケットの各コンテキストで利用可能なすべてのプラットフォーム変数が一覧表示されます。
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で、すべてのクライアントに対応。すべての資格情報のアクセス範囲を限定し、監査し、取り消し可能です。