Share code or advice about how you've used the STIGMan API! #497
Replies: 4 comments 8 replies
-
PowerShell using stigman-watcher client_id - This script should get the asset information from STIG-Manager when provided the Collection and the asset FQDN.
|
Beta Was this translation helpful? Give feedback.
-
Anyone interested in how to install Stig Manger in Azure? We have it successfully running with CAC authentication. Stig manager is running in an Azure container instance, HTTPS is handled using an Azure Application Gateway, OIDC is Azure AD (via app registration). There is little documentation online on how to set this all up in Azure. |
Beta Was this translation helpful? Give feedback.
-
Any samples out there for accessing the APIs in python? Just need a sample for one of the APIs and I can build from there |
Beta Was this translation helpful? Give feedback.
-
Some functions I wrote to get a new client secret and to get a token for powershell. Also have a script to rotate keycloakkeys function Invoke-NewSecret {
param (
[Parameter(Mandatory = $true)]
[string]$Server,
[Parameter(Mandatory = $false)]
[string]$Port = "443",
[Parameter(Mandatory = $false)]
[string]$KeycloakBaseURL = "keycloak",
[Parameter(Mandatory = $false)]
[string]$realm = "stigman",
[Parameter(Mandatory = $true)]
[string]$Account = "",
[Parameter(Mandatory = $true)]
$headers
)
$URL = "https://$server:$Port/$KeycloakBaseURL/admin/realms/$realm/clients"
try {
$ClientResponse = Invoke-RestMethod -Uri "$URL" -Headers $headers -Method GET
}
catch {
Return $global:error[0]
}
$userID = $ClientResponse | Where-Object {$_."clientId" -eq $account}
if ($userID.count -eq 0) {
Throw "Unable to find $account in $URL"
}elseif ($userID.count -gt 1) {
Throw "Too many result returned for $account in $URL"
}
try {
$SecretResponse = Invoke-RestMethod -Uri "$URL/$($userID.id)/client-secret" -Headers $headers -Method POST
}
catch {
Return $global:error[0]
}
return $SecretResponse.value
} function Get-Token {
param (
[Parameter(Mandatory = $true)]
[string]$Server,
[Parameter(Mandatory = $false)]
[string]$Port = "443",
[Parameter(Mandatory = $false)]
[string]$KeycloakBaseURL = "keycloak",
[Parameter(Mandatory = $false)]
[string]$realm = "stigman",
[Parameter(Mandatory = $true)]
[string]$Account = "",
[Parameter(Mandatory = $true)]
[string]$SecretKey
)
$URL = "https://$server:$Port/$KeycloakBaseURL/realms/$realm/protocol/openid-connect/token"
$body = @{
client_id = $Account.tolower()
client_secret = $secretkey
grant_type = "client_credentials"
}
try {
$tokenRequest = Invoke-RestMethod -Uri "$URL" -ContentType "application/x-www-form-urlencoded" -Body $body -UseBasicParsing -Method POST -ErrorAction Stop
}
catch {
Return $global:error[0]
}
return @{'Content-Type' = 'application/json';'Authorization' = "Bearer $($tokenRequest.access_token)"}
} function Invoke-KeycloakKeys {
param (
$Server
)
$date = (Get-date).date
$headers = Get-Token -Server $Server
try {
$KeyProviders = Invoke-RestMethod -Uri "https://$Server/keycloak/admin/realms/stigman/components?type=org.keycloak.keys.KeyProvider" -Headers $headers -Method GET -ErrorAction STOP
} catch {
Write-Host "Unable to connect to Keycloak" -BackgroundColor Red
continue
}
$KeyProviders | Add-Member -MemberType NoteProperty -Name "ProviderDate" -Value ""
for ($i = 0; $i -lt $KeyProviders.Count; $i++) {
try {
$KeyProviders[$i].providerDate = [datetime](($KeyProviders[$i].name -split "_")[1])
} catch {
Write-host "Unable to parse date from $($KeyProviders[$i].name)" -BackgroundColor Red
$KeyProviders[$i].providerDate = "Unknown"
}
}
foreach ($KeyProvider in $KeyProviders | Where-Object {$_.providerDate -ne "Unknown"}) {
if (($date - $KeyProvider.providerDate).Days -gt 30 -and [bool]::parse($KeyProvider.config.active)) {
$JSONBody = ""
$JSONBody = switch ($KeyProvider.providerId) {
"aes-generated" {
@{
"name" = "aes-generated_$($date.tostring("yyyy-MM-dd"))"
"providerId" = "aes-generated"
"providerType" = "org.keycloak.keys.KeyProvider"
"parentId" = "stigman"
"config" = @{
"secretSize" = @(16)
"active" = @("true")
"priority" = @(100)
"enabled" = @("true")
}
}
}
"hmac-generated" {
if ($KeyProvider.config."algorithm" -eq "HS256") {
@{
"name" = "hmac-generated_$($date.tostring("yyyy-MM-dd"))"
"providerId" = "hmac-generated"
"providerType" = "org.keycloak.keys.KeyProvider"
"parentId" = "stigman"
"config" = @{
"secretSize" = @(128)
"algorithm" = @("HS256")
"active" = @("true")
"priority" = @(100)
"enabled" = @("true")
}
}
} else {
@{
"name" = "hmac-generated-hs512_$($date.tostring("yyyy-MM-dd"))"
"providerId" = "hmac-generated"
"providerType" = "org.keycloak.keys.KeyProvider"
"parentId" = "stigman"
"config" = @{
"secretSize" = @(128)
"algorithm" = @("HS512")
"active" = @("true")
"priority" = @(100)
"enabled" = @("true")
}
}
}
}
"rsa-generated" {
@{
"name" = "rsa-generated_$($date.tostring("yyyy-MM-dd"))"
"providerId" = "rsa-generated"
"providerType" = "org.keycloak.keys.KeyProvider"
"parentId" = "stigman"
"config" = @{
"secretSize" = @(2048)
"algorithm" = @("RS256")
"active" = @("true")
"priority" = @(100)
"enabled" = @("true")
}
}
}
}
if ([string]::IsNullOrEmpty($JSONBody)) {
Write-host "Unable to parse provider $($KeyProvider.providerId) for $($KeyProvider.name)" -BackgroundColor Red
continue
}
try {
Invoke-RestMethod -Uri "https://$Server/keycloak/admin/realms/stigman/components" -Headers $headers -Body ($JSONBody | ConvertTo-Json) -Method POST -ErrorAction Stop | Out-Null
Write-host "Published new key provider $($JSONBody.name)"
} catch {
Write-Host "Unable to add a new key provider $($JSONBody.name) in Keycloak" -BackgroundColor Red
continue
}
$JsonBody = @{
"providerId" = $KeyProvider.providerId
"providerType" = $KeyProvider.providerType
"config" = @{
"active" = @("false")
}
} | Convertto-json
try {
Invoke-RestMethod -Uri "https://$Server/keycloak/admin/realms/stigman/components/$($KeyProvider.id)" -Headers $headers -Body $JSONBody -Method PUT -ErrorAction Stop | Out-Null
Write-host "Put old key provider $($KeyProvider.name) in passive mode"
} catch {
Write-Host "Unable to put old key provider $($KeyProvider.id) in passive mode" -BackgroundColor Red
continue
}
}elseif (($date - $KeyProvider.providerDate).Days -gt 35 -and -not [bool]::parse($KeyProvider.config.active)) {
try {
Invoke-RestMethod -Uri "https://$Server/keycloak/admin/realms/stigman/components/$($KeyProvider.id)" -Headers $headers -Method DELETE -ErrorAction Stop | Out-Null
Write-host "Removed old key provider $($KeyProvider.name)"
} catch {
Write-Host "Unable to remove old key provider $($KeyProvider.id) Keycloak" -BackgroundColor Red
continue
}
}
}
} |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
If you've written your own client to make use of our API, or have any tips or tricks for other users, post them below!
If you can post the repo of your code publicly, even better! Share a link below!
Thanks for using STIG Manager OSS.
Beta Was this translation helpful? Give feedback.
All reactions