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 자동화 프로필을 통한 설치
Atera 스크립트 라이브러리에서 매개 변수가 하나인 Install Clavitor PowerShell 스크립트를 만들어요. 이를 실행하는 IT 자동화 프로필에서 고객 수준 필드 자리 표시자를 사용하여 호출해요:
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)을 사용하여 스크립트 단계 인수에 EDF(Extra Data Field) 매크로를 대체해요. CLI는 바이너리를 다운로드하고 토큰을 매개 변수로 전달하여 PowerShell 단계를 호출하는 Automate 스크립트를 통해 설치되며, 스크립트 단계가 실행되기 전에 EDF 값이 대체돼요.
Automate 스크립트: 설치
Automate 스크립트 편집기에서 두 단계로 스크립트를 만들어요:
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까지 노출되죠. 한 구성 요소가 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 에이전트 프로시저는 런타임에 PowerShell 인수에 #variable# 매크로를 대체한 다음, executePowershell 단계 패밀리(executePowerShell64BitSystem 등)를 통해 스크립트를 실행해요. 에이전트 레코드의 사용자 지정 필드는 Clavitor 토큰을 보유하며, 프로시저는 stdin을 통해 이를 init에 전달해요.
에이전트 프로시저: 설치
에이전트 사용자 지정 필드 ClavitorToken을 추가하고(Audit → Edit Profile → Custom Fields), 두 단계로 프로시저를 구축해요:
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를 사용하고, 나머지 모든 것은 런타임에 확인되죠.
스크립트 관리자: 자동화 작업을 통한 설치
토큰에 대한 매개 변수와 함께 Install-Clavitor.ps1을 Settings → Script Manager에 업로드해요. 엔드포인트에서 자동화 작업으로 연결하고, 장치 수준 설정에서 토큰을 스크립트 인수로 전달해요:
param([Parameter(Mandatory)][string]$Token) $Token | clavitor-cli init Remove-Variable Token
자동화 작업: 볼트 자격 증명을 사용한 예약 백업
초기화되면 예약된 작업은 볼트에서 자격 증명을 가져와요. 최대 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 연결
설치 후 스크립트와 자동화된 복구는 볼트에서 자격 증명을 확인하고 직접 사용해요:
$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은 에이전트 토큰(고객당 하나)만 저장하죠. 토큰은 해당 고객 볼트에 대한 범위 지정 액세스를 부여해요. RMM 콘솔이 침해당하면 자격 증명이 아닌 토큰만 노출되며, 각 토큰은 배포된 엔드포인트로 IP 화이트리스트가 적용돼요.
고객별 범위 지정
각 고객 볼트에는 고유한 에이전트 토큰이 있어요. 기술자 액세스는 '누가 RMM 콘솔에 로그인할 수 있는지'가 아닌 범위에 의해 제어돼요.
스크립트별 감사
모든 자격 증명 액세스는 기록돼요. 어떤 스크립트, 어떤 엔드포인트, 어떤 자격 증명, 언제인지 말이죠. 고객은 감사 추적을 볼 수 있어요. 누가 무엇에 액세스했는지 증명할 수 있죠.
한 번의 클릭으로 취소
고객이 떠나나요? 해당 에이전트 토큰을 취소해요. 모든 엔드포인트는 즉시 자격 증명 확인을 중단해요. 교체할 비밀번호도 없고, 200대의 머신에서 지울 사용자 지정 속성도 없죠.
RMM에 자격 증명 저장을 멈춰요.
하나의 CLI. 모든 고객. 모든 자격 증명은 범위가 지정되고, 감사되며, 취소할 수 있어요.