Create ESA RADIUS clients via API
If you have integrated ESA protection for many Linux/Mac desktop logins via PAM modules, and you need to configure many RADIUS clients in ESA, the following PowerShell script will ease your work.
Prerequisites
- Configure a RADIUS client in ESA Web Console.
- Basic Settings > IP address: Type in the IP address of the computer hosting the PAM module by which the ESA RADIUS server can reach it
- Basic Settings > Shared Secret: Type in the same shared secret as you entered in your VPN appliance
- Authentication > Client Type > Client validates user name and password - use Access-Challenge
- Enable ESA API and add API credentials for Management API in ESA Web Console.
- List the IP address and Shared Secret of each VPN appliance in a .csv file as <IP address>;<Shared Secret> pairs.
For example:
192.168.0.11;test1
192.168.0.12;test2
192.168.0.13;test3
How does the script work?
The script reads each row of the .csv file and creates as many RADIUS clients as many rows of IP address and Shared Secret pairs are found. The Authentication section of each RADIUS client will be configured based on the pre-configured RADIUS client.
Sample PowerShell script to create new ESA RADIUS clients via ESA API - we name the file create_radius_clients.ps1
# configuration
# Management API credentials - username:password $credentials = "kjssgmarkm:dapweburnx"
# IP address or FQDN of the Authentication Server $esaAuthenticationServer = "esac.eset.com"
# Name of ESA RADIUS Server found in ESA Web Console at Componets > RADIUS $radiusServerName = "WIN-FMPA4KUT4S8 (invited by New invitation)"
# Name of the pre-configured ESA RADIUS client $baseRadiusClientName = "Base Client"
# List of IP Address and Shared Secret of each VPN appliance is saved in the clients.csv file. # The clients.csv file is in the same directory where this PowerShell script resides $csvImportFilePath = $PSScriptRoot + "\\clients.csv"
# headers preparation
$ErrorActionPreference = "Stop"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credentials)) $basicAuthHeader = "Basic $encodedCredentials" $headers = @{Authorization = $basicAuthHeader}
# find RADIUS server
$body = @{ componentType = "radius" } $bodyStr = $body | ConvertTo-Json $response = Invoke-WebRequest -Uri https://$esaAuthenticationServer/manage/v2/GetComponentSettings -Method POST -Body $bodyStr -ContentType "application/json" -Headers $headers
$components = $response.Content | ConvertFrom-Json
$radiusServerKey = $null foreach ($component in $components) { if ($component.Info.Name -ceq $radiusServerName) { $radiusServerKey = $component.Info.Key } }
if ($radiusServerKey -ceq $null) { Throw "RADIUS server not found: " + $radiusServerName }
# base RADIUS client
$body = @{ componentKey = $radiusServerKey } $bodyStr = $body | ConvertTo-Json $response = Invoke-WebRequest -Uri https://$esaAuthenticationServer/manage/v2/GetRadiusClients -Method POST -Body $bodyStr -ContentType "application/json" -Headers $headers
$clients = $response.Content | ConvertFrom-Json
$baseRadiusClientSettings = $null foreach ($client in $clients) { if ($client.ClientName -ceq $baseRadiusClientName) { $baseRadiusClientSettings = $client } }
if ($baseRadiusClientSettings -ceq $null) { Throw "RADIUS client not found: " + $baseRadiusClientName }
# create clients
foreach($line in [System.IO.File]::ReadLines($csvImportFilePath)) { $fields = $line.Split(';') if ($fields.Count -cne 2) { Throw "Invalid fields count: " + $line }
$ip = $fields[0] $sharedSecret = $fields[1]
$newClientSettings = $baseRadiusClientSettings | ConvertTo-Json | ConvertFrom-Json $newClientSettings.Id = [guid]::NewGuid().ToString("d") $newClientSettings.ClientName = "Generated - " + $ip $newClientSettings.ClientIp = $ip $newClientSettings.SharedSecret = $sharedSecret
$body = @{ componentKey = $radiusServerKey; client = $newClientSettings } $bodyStr = $body | ConvertTo-Json $response = Invoke-WebRequest -Uri https://$esaAuthenticationServer/manage/v2/CreateRadiusClient -Method POST -Body $bodyStr -ContentType "application/json" -Headers $headers }
echo "success" |