added webhooks, moved app name and verison to simple config file
This commit is contained in:
@@ -282,7 +282,8 @@ class AlertService:
|
||||
# Get all certificates from the scan
|
||||
certificates = (
|
||||
self.db.query(ScanCertificate, ScanPort, ScanIP)
|
||||
.join(ScanPort, ScanCertificate.port_id == ScanPort.id)
|
||||
.join(ScanServiceModel, ScanCertificate.service_id == ScanServiceModel.id)
|
||||
.join(ScanPort, ScanServiceModel.port_id == ScanPort.id)
|
||||
.join(ScanIP, ScanPort.ip_id == ScanIP.id)
|
||||
.filter(ScanPort.scan_id == scan.id)
|
||||
.all()
|
||||
@@ -329,29 +330,34 @@ class AlertService:
|
||||
# Get all TLS version data from the scan
|
||||
tls_versions = (
|
||||
self.db.query(ScanTLSVersion, ScanPort, ScanIP)
|
||||
.join(ScanPort, ScanTLSVersion.port_id == ScanPort.id)
|
||||
.join(ScanCertificate, ScanTLSVersion.certificate_id == ScanCertificate.id)
|
||||
.join(ScanServiceModel, ScanCertificate.service_id == ScanServiceModel.id)
|
||||
.join(ScanPort, ScanServiceModel.port_id == ScanPort.id)
|
||||
.join(ScanIP, ScanPort.ip_id == ScanIP.id)
|
||||
.filter(ScanPort.scan_id == scan.id)
|
||||
.all()
|
||||
)
|
||||
|
||||
# Group TLS versions by port/IP to create one alert per host
|
||||
tls_by_host = {}
|
||||
for tls, port, ip in tls_versions:
|
||||
weak_versions = []
|
||||
# Only alert on weak TLS versions that are supported
|
||||
if tls.supported and tls.tls_version in ['TLS 1.0', 'TLS 1.1']:
|
||||
key = (ip.ip_address, port.port)
|
||||
if key not in tls_by_host:
|
||||
tls_by_host[key] = {'ip': ip.ip_address, 'port': port.port, 'versions': []}
|
||||
tls_by_host[key]['versions'].append(tls.tls_version)
|
||||
|
||||
if tls.tls_1_0:
|
||||
weak_versions.append("TLS 1.0")
|
||||
if tls.tls_1_1:
|
||||
weak_versions.append("TLS 1.1")
|
||||
|
||||
if weak_versions:
|
||||
severity = rule.severity or 'warning'
|
||||
alerts_to_create.append({
|
||||
'alert_type': 'weak_tls',
|
||||
'severity': severity,
|
||||
'message': f"Weak TLS versions supported on {ip.ip_address}:{port.port}: {', '.join(weak_versions)}",
|
||||
'ip_address': ip.ip_address,
|
||||
'port': port.port
|
||||
})
|
||||
# Create alerts for hosts with weak TLS
|
||||
for host_key, host_data in tls_by_host.items():
|
||||
severity = rule.severity or 'warning'
|
||||
alerts_to_create.append({
|
||||
'alert_type': 'weak_tls',
|
||||
'severity': severity,
|
||||
'message': f"Weak TLS versions supported on {host_data['ip']}:{host_data['port']}: {', '.join(host_data['versions'])}",
|
||||
'ip_address': host_data['ip'],
|
||||
'port': host_data['port']
|
||||
})
|
||||
|
||||
return alerts_to_create
|
||||
|
||||
@@ -437,10 +443,35 @@ class AlertService:
|
||||
logger.info(f"Email notification would be sent for alert {alert.id}")
|
||||
# TODO: Call email service
|
||||
|
||||
# Webhook notification will be implemented in webhook_service.py
|
||||
# Webhook notification - queue for delivery
|
||||
if rule.webhook_enabled:
|
||||
logger.info(f"Webhook notification would be sent for alert {alert.id}")
|
||||
# TODO: Call webhook service
|
||||
try:
|
||||
from flask import current_app
|
||||
from .webhook_service import WebhookService
|
||||
|
||||
webhook_service = WebhookService(self.db)
|
||||
|
||||
# Get matching webhooks for this alert
|
||||
matching_webhooks = webhook_service.get_matching_webhooks(alert)
|
||||
|
||||
if matching_webhooks:
|
||||
# Get scheduler from app context
|
||||
scheduler = getattr(current_app, 'scheduler', None)
|
||||
|
||||
# Queue delivery for each matching webhook
|
||||
for webhook in matching_webhooks:
|
||||
webhook_service.queue_webhook_delivery(
|
||||
webhook.id,
|
||||
alert.id,
|
||||
scheduler_service=scheduler
|
||||
)
|
||||
logger.info(f"Queued webhook {webhook.id} ({webhook.name}) for alert {alert.id}")
|
||||
else:
|
||||
logger.debug(f"No matching webhooks found for alert {alert.id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to queue webhook notifications for alert {alert.id}: {e}", exc_info=True)
|
||||
# Don't fail alert creation if webhook queueing fails
|
||||
|
||||
def acknowledge_alert(self, alert_id: int, acknowledged_by: str = "system") -> bool:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user