Skip to main content

Tag: powershell

ConnectSecure v4 uitlezen met Powershell en API

Om als MSP’er te zorgen voor goed patchbeheer, moet je ook de zwakke punten weten van al je beheerde devices. Wij gebruiken hiervoor https://ConnectSecure.com versie 4 via https://Portland.nl

Prachtig dashboard voor de techneuten en security officers, maar voor de sales willen we graag alle MSP- producten (en hun status) rapporteren in een centraal systeem. Wij gebruiken hiervoor een Azure Database met PowerBi en html dashboards.

Met versie 4 zijn er wijzigingen in het gebruik van de API waardoor we weer even terug moesten naar de tekentafel en door mijn gebrekkige kennis, matige documentatie was ik hier toch weer een dag mee bezig. Om jullie deze tijd te besparen deel ik graag mijn opgedane kennis met jullie zodat je hiet zelf ook leuke dingen mee kunt maken!

Zorg ervoor dat je via de V4 webinterface als admin een Client-Id en Secret hebt (zie user beheer) en dat je de juiste URL weet (je POD nr, zie user afbeelding, API documentatie en bekijk de URL!)

Ik bouw een PowerShell script die ik via task-scheduler elke dag laat lopen om te synchroniseren met de Azure Reporting Database. Voor vandaag deel 1 uitlezen CyberCNS:

############################################################
# Connect to the Connect Secure v4 API
############################################################
#vul hier uw eigen gegeven is:
$TenantName="uw eigen tenant naam in ConnectSecure"
$BaseURL="https://podxxx.myconnectsecure.com"
$ClientID="uw-client-id-voor-connectsecure"
$AppSecret="een hele lange code als secret"
#tot hier

#Voeg gegevens samen codeer deze Base64:
$auth = "$TenantName+$ClientID" + ':' + $AppSecret
$Encoded = [System.Text.Encoding]::UTF8.GetBytes($auth)
$authorizationInfo = [System.Convert]::ToBase64String($Encoded)
$header = @{"Client-Auth-Token"="$authorizationInfo"}

#Start connecting:
Write-Host "Connection to ConnectSecure v4 API:"
$ConnectURL=$BaseURL+"/w/authorize"
$Response=Invoke-WebRequest -Uri $ConnectURL -Method POST -Headers $header -ContentType 'application/json'
$APIError=$Response.StatusCode
$APIStatus=$Response.StatusDescription
Write-host "Connection: $APIError $APIStatus"

$Content=$Response.content | Convertfrom-json
$Xuser=$Content.User_id
$AToken=$Content.access_token
$Header2=@{
"X-USER-ID"="$Xuser"
"Authorization"="bearer $AToken"
}

Na de authenticatie kan je nu door met het uitlezen van de companies:

############################################################
# Lees alle Companies uit                                                             
############################################################
$companiesUrl = $BaseURL+"/r/company/companies?skip=0&limit=9999"
$companiesResponse = Invoke-WebRequest -Uri $companiesUrl -Headers $Header2 -Method Get -ContentType 'application/json'
$CompaniesData=$companiesResponse.Content | ConvertFrom-Json
$AllCompanies=$CompaniesData.data | Sort-Object -Property Name
$Totaal=$AllCompanies.count
Write-Host "Gevonden Companies: $Totaal"

Als je de $AllCompanies bekijkt, zie je alle organisaties vanuit ConnectSecure en kan je deze verder behandelen met ForEach loop.

Je kan natuurlijk ook alle Agents uitlezen:

############################################################
# Lees alle Agents uit                            
############################################################
$AgentUrl= "$BaseURL/r/company/agents?limit=99999"
$AgentData = Invoke-RestMethod -Uri $AgentUrl -Method Get -ContentType 'application/json' -Headers $Header2
$Agents=$AgentData.data 
$Totaal=$Agents.count
Write-Host "Gevonden Agents: $Totaal"

En natuurlijk ook alle Assets:

############################################################
# Lees Asset details uit                        
############################################################
$AssetURL = $BaseURL+"/r/asset/assets?skip=0&limit=9999" #Get All Asset Details!
$AssetsData = Invoke-RestMethod -Uri $AssetURL -Method Get -Headers $Header2 -ContentType 'application/json'
$Assets=$DataAssets.data
$Totaal=$Assets.count
Write-Host "Gevonden Assets: $Totaal"

Meer details kan je ophalen via Assets_view:

############################################################
# Lees Asset_View details uit                              #
############################################################
$URI = $BaseURL+"/r/asset/asset_view?skip=0&limit=9999" #Get All Asset Details!
$RawAssetsView = Invoke-RestMethod -Uri $URI -Method Get -Headers $Header2 -ContentType 'application/json'
$AllAssetsView=$RawAssetsView.data
$Totaal=$AllAssetsView.count
Write-Host "Gevonden AssetsView: $Totaal"

Als voorbeeld exporteer ik de data naar een Excel sheet in de C:\Temp directory, hiervoor moet je wel eerst de module ImportExcel laden in PowerShell ( Install-Module -Name ImportExcel )

############################################################
# Export naar XLS in C:\temp                               #
############################################################
$Filename= "ConnectSecure.xlsx"
$filepad = "C:\temp\" 
$File = $filepad + $filename
$filetest = New-Object -TypeName System.IO.FileInfo -ArgumentList $file
$ErrorActionPreference = "SilentlyContinue"
[System.IO.FileStream] $fs = $filetest.OpenWrite(); 
if (!$?) {
    Write-host "Error skipping XLSX!" -ForegroundColor Red
}else{
    $fs.Dispose()
    Write-host Creating XLSX -ForegroundColor Yellow
    remove-item -Path $File
    $Title = Get-Date -Format dd-MM-yyyy--HH:mm
    $AllCompanies | Select-object name, id, description | Sort-Object -Property Name |Export-Excel -Path $file -WorksheetName 'Companies' -AutoSize -AutoFilter -TableStyle Medium6 -Title $Title
    Write-host "Companies"
    Start-Sleep -Milliseconds 550
    #$AllAgents | Sort-Object -Property Partner, Name | Export-Excel -Path $file -WorksheetName 'Agents' -AutoSize -AutoFilter -TableStyle Medium6 -BoldTopRow
    $AllAgents | Select-object company_id,host_name,Agent_type, agent_version,last_ping_time,last_reported,last_scanned_time | Sort-Object -Property company_id,hostname | Export-Excel -Path $file -WorksheetName 'Agents' -AutoSize -AutoFilter -TableStyle Medium6 -BoldTopRow
    Write-host "Agents"
    Start-Sleep -Milliseconds 850
    $AllAssets| Select-object company_id,name,logged_in_user,last_ping_time, os_name, platform,ad_check,agent_id,agent_type,hardware_model,id,ip | Sort-Object company_id,name | Export-Excel -Path $file -WorksheetName 'Assets' -AutoSize -AutoFilter -TableStyle Medium6 -BoldTopRow
    Write-host "Assets"
    Start-Sleep -Milliseconds 850
    #$AllAssetsView| Select-object company_id,name,logged_in_user,last_ping_time, os_name, platform,ad_check,agent_id,agent_type,hardware_model,id,ip | Sort-Object company_id,name | Export-Excel -Path $file -WorksheetName 'Assets' -AutoSize -AutoFilter -TableStyle Medium6 -BoldTopRow
    $AllAssetsView | Select-object company_id,company_name,host_name,ad_check,agent_id,logged_in_user,id,agent_type,security_grade,max_risk_score,avg_risk_score,critical,high,medium,low,total_vul,cisa_vul,epss_vul,platform,hardware_model,updated |Sort-Object company_id,name | Export-Excel -Path $file -WorksheetName 'AssetsView' -AutoSize -AutoFilter -TableStyle Medium6 -BoldTopRow
    Write-host "AssetsView"
    Start-Sleep -Milliseconds 850
}

Mocht je meer vragen hebben over PowerShell met ConnectSecure v4 API, dan mag je me altijd een berichtje sturen via Teams: a.smit@smiletools.nl