Replace inventory-counting risk with bounded workload scoring and separate confidence

This commit is contained in:
2026-10-30 12:34:39 -07:00
parent f65ade9fff
commit 57e716b710
26 changed files with 10351 additions and 87 deletions

View File

@@ -1,8 +1,9 @@
"""Compact, evidence-based presentation of the full assessment."""
import re
from samsara.analyzers.dependencies import service_family
# Name hints for server workloads, not a comprehensive application classifier.
WORKLOAD = re.compile(r'(?:nginx|apache|httpd|iis|w3svc|sql|postgres|mariadb|mysql|redis|mongo|oracle|tomcat|haproxy|docker|containerd|podman|samba|smbd|nfs|bind|named|rabbitmq|kafka|jenkins|backup|reporting)', re.I)
WORKLOAD = re.compile(r'(?:nginx|apache|httpd|iis|w3svc|sql|postgres|mariadb|mysql|redis|mongo|oracle|tomcat|haproxy|docker|containerd|podman|samba|smbd|nfs|bind|named|rabbitmq|kafka|jenkins|backup|reporting|dedicated server|minecraft|valheim|rustdedicated)', re.I)
def summarize(data, assessment):
@@ -20,15 +21,17 @@ def summarize(data, assessment):
'evidence': 'Installed software name matches a server-workload hint; use unverified'})
names = {row['name'].lower().split(':')[0] for row in important}
for row in inventory.get('services', []):
if row.get('state') == 'Running' and WORKLOAD.search(row['name']) and row['name'].lower().removesuffix('.service') not in names:
if row.get('state') == 'Running' and service_family(row['name']) is not None and row['name'].lower().removesuffix('.service') not in names:
important.append({'name': row['name'], 'version': 'Not collected', 'evidence': 'Running service; application ownership requires review'})
jobs = []
for row in inventory.get('tasks', []):
if row.get('enabled') or row.get('state') == 'Running':
task_classes = {row['inventory_index']: row['classification'] for row in assessment.get('task_observations', [])}
for index, row in enumerate(inventory.get('tasks', [])):
if (row.get('enabled') or row.get('state') == 'Running') and task_classes.get(index) != 'Standard operating system activity':
jobs.append({'name': row['name'], 'schedule': row.get('triggers', 'Schedule not collected'),
'status': row.get('state', 'Enabled schedule; execution unverified'),
'account': row.get('account', 'Not collected')})
return {'os_type': os_name, 'version': version,
'risk_score': assessment['score'], 'risk_level': assessment['level'],
'software': important, 'jobs': jobs,
'incomplete': sum(check['status'] != 'complete' for check in data['checks'].values())}
'incomplete': len(assessment['coverage']['incomplete_checks']),
'coverage_percent': assessment['coverage']['percent'], 'confidence': assessment['confidence']['level']}