Get UEBA Endpoints by Operating System#
Retrieve User and Entity Behavior Analytics (UEBA) endpoint information filtered by operating system.
✅ All code examples tested: Verified against FortiAnalyzer v7.4.8, v7.6.4, v8.0.0.
Overview#
This endpoint retrieves UEBA endpoint data filtered by operating system type - useful for:
Security posture assessment by OS platform
Identifying vulnerable OS versions requiring patches
Compliance monitoring for specific OS platforms
Asset inventory and management by OS type
Risk analysis across different operating systems
Planning OS migration or upgrade strategies
UEBA provides behavioral analytics and risk scoring for endpoints, helping security teams identify anomalous behavior and potential threats across different operating system platforms.
Endpoint Details#
Method: POST
URL: /jsonrpc
API Path: /ueba/adom/{adom}/endpoints/
ADOM Support: Yes
Requires Authentication: Yes
Minimum Version: 7.4.0
Prerequisites#
UEBA feature must be enabled on FortiAnalyzer
Endpoints must be registered and reporting to FortiAnalyzer
Read access to UEBA data in specified ADOM
Request Format#
Parameters#
Parameter |
Type |
Required |
Default |
Description |
|---|---|---|---|---|
|
|
Yes |
- |
ADOM name (e.g., “root”) |
|
|
Yes |
- |
Filter expression: |
|
|
No |
|
Maximum results to return |
|
|
No |
|
Starting position for pagination |
|
|
No |
|
Detail level: |
|
|
No |
- |
Sorting specification |
|
|
No |
- |
Activity time range filter |
|
|
No |
- |
First seen time range filter |
Common OS Name Values#
Windows 10Windows 11Windows Server 2019Windows Server 2022DebianUbuntuCentOSRed Hat Enterprise LinuxmacOSiOSAndroid
Sorting Configuration#
Parameter |
Type |
Description |
|---|---|---|
|
|
Field to sort by (e.g., “epid”, “risk_score”) |
|
|
Sort order: |
Request Example#
{
"method": "get",
"params": [{
"url": "/ueba/adom/root/endpoints/",
"filter": "osname=Debian",
"limit": 1000,
"offset": 0,
"detail-level": "standard",
"sort-by": [{
"field": "epid",
"order": "asc"
}],
"time-range": {
"start": "2023-10-06 13:09:00",
"end": "2023-12-05 13:09:00"
},
"firstseen-time-range": {
"start": "1970-01-01 00:00:01",
"end": "2023-12-05 13:09:29"
}
}],
"session": "{{session_id}}",
"id": 1
}
{
"result": [{
"data": [
{
"epid": 2045,
"hostname": "debian-server-01",
"ip": "10.0.2.50",
"mac": "00:0c:29:4b:6f:23",
"osname": "Debian",
"osversion": "11.5",
"risk_score": 25,
"first_seen": "2023-08-20 10:15:00",
"last_seen": "2023-12-05 11:30:00",
"user": "admin",
"status": "active"
},
{
"epid": 2108,
"hostname": "debian-web-02",
"ip": "10.0.2.75",
"mac": "00:0c:29:5c:7a:34",
"osname": "Debian",
"osversion": "12.0",
"risk_score": 18,
"first_seen": "2023-09-10 14:22:00",
"last_seen": "2023-12-05 12:15:00",
"user": "webadmin",
"status": "active"
}
],
"status": {
"code": 0,
"message": "OK"
}
}]
}
Response Fields#
Field |
Type |
Description |
|---|---|---|
|
|
Unique endpoint identifier |
|
|
Endpoint hostname |
|
|
IP address |
|
|
MAC address |
|
|
Operating system name |
|
|
OS version |
|
|
UEBA risk score (0-100) |
|
|
First seen timestamp |
|
|
Last activity timestamp |
|
|
Associated user |
|
|
Endpoint status |
Complete Python Example#
import json
import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def get_ueba_endpoints_by_os(session_id, adom, os_name, time_range=None, limit=1000):
"""
Get UEBA endpoints filtered by operating system
Args:
session_id: Active session ID
adom: ADOM name
os_name: Operating system name to filter
time_range: Optional time range dict
limit: Maximum results (default: 1000)
Returns:
list: Endpoint data
"""
url = "https://faz.example.com/jsonrpc"
params_data = {
"url": f"/ueba/adom/{adom}/endpoints/",
"filter": f"osname={os_name}",
"limit": limit,
"offset": 0,
"detail-level": "standard",
"sort-by": [{
"field": "epid",
"order": "asc"
}]
}
if time_range:
params_data["time-range"] = time_range
payload = {
"method": "get",
"params": [params_data],
"session": session_id,
"id": 1
}
response = requests.post(url, json=payload, verify=False)
result = response.json()
if result['result'][0]['status']['code'] == 0:
return result['result'][0].get('data', [])
else:
raise Exception(f"API error: {result['result'][0]['status']['message']}")
# Example: Get all Debian endpoints
endpoints = get_ueba_endpoints_by_os(
session_id="your_session_id",
adom="root",
os_name="Debian",
time_range={
"start": "2023-10-06 13:09:00",
"end": "2023-12-05 13:09:00"
}
)
# Display results
print(f"Found {len(endpoints)} Debian endpoints:\n")
for ep in endpoints:
print(f" {ep['hostname']} ({ep['ip']})")
print(f" OS Version: {ep['osversion']}")
print(f" Risk Score: {ep['risk_score']}")
print(f" Last Seen: {ep['last_seen']}")
print()
Use Cases#
Vulnerability Assessment by OS#
# Identify all Windows 10 endpoints for patching
win10_endpoints = get_ueba_endpoints_by_os(
session_id=session,
adom="root",
os_name="Windows 10"
)
high_risk = [ep for ep in win10_endpoints if ep['risk_score'] > 60]
print(f"High-risk Windows 10 endpoints: {len(high_risk)}")
for ep in high_risk:
print(f" {ep['hostname']} - Risk: {ep['risk_score']}")
OS Migration Planning#
# Get all endpoints running legacy OS versions
legacy_os = ["Windows 7", "Windows Server 2008", "Ubuntu 16.04"]
endpoints_to_migrate = []
for os_name in legacy_os:
endpoints = get_ueba_endpoints_by_os(
session_id=session,
adom="root",
os_name=os_name
)
endpoints_to_migrate.extend(endpoints)
print(f"Total endpoints requiring migration: {len(endpoints_to_migrate)}")
# Generate migration report
for ep in endpoints_to_migrate:
print(f"{ep['hostname']}: {ep['osname']} {ep['osversion']} -> Upgrade Required")
Compliance Reporting#
# Check compliance: All servers must run approved OS versions
approved_server_os = ["Windows Server 2019", "Windows Server 2022", "Ubuntu 22.04", "Debian"]
server_endpoints = get_ueba_endpoints_by_os(
session_id=session,
adom="root",
os_name="Windows Server 2016" # Non-compliant version
)
if server_endpoints:
print("⚠️ COMPLIANCE ALERT: Non-compliant OS detected")
for ep in server_endpoints:
print(f" {ep['hostname']} running {ep['osname']} {ep['osversion']}")
Security Posture by Platform#
# Analyze risk scores by OS platform
os_platforms = ["Windows 10", "Windows 11", "macOS", "Ubuntu", "Debian"]
risk_by_os = {}
for os_name in os_platforms:
endpoints = get_ueba_endpoints_by_os(
session_id=session,
adom="root",
os_name=os_name
)
if endpoints:
avg_risk = sum(ep['risk_score'] for ep in endpoints) / len(endpoints)
risk_by_os[os_name] = {
'count': len(endpoints),
'avg_risk': round(avg_risk, 2)
}
# Display results
print("Security Posture by OS Platform:")
for os_name, data in sorted(risk_by_os.items(), key=lambda x: x[1]['avg_risk'], reverse=True):
print(f" {os_name}: {data['count']} endpoints, Avg Risk: {data['avg_risk']}")
Error Handling#
{
"result": [{
"status": {
"code": -2,
"message": "No data available"
}
}]
}
Common causes:
No endpoints with specified OS name
UEBA not enabled
No data for specified time range
Incorrect OS name format
Insufficient permissions
Best Practices#
💡 Tip: Use exact OS names as they appear in FortiAnalyzer. OS names are case-sensitive.
💡 Tip: Combine with risk_score sorting to prioritize high-risk endpoints for remediation.
⚠️ Warning: Legacy OS versions (Windows 7, Server 2008) pose significant security risks and should be upgraded.
💡 Tip: Regular OS inventory helps identify unauthorized or non-compliant systems.