feat(fail2ban): manage trusted IP addresses and networks

This commit is contained in:
Codex
2026-08-06 16:57:38 +02:00
parent 7d781d570c
commit 3a7e450b55
6 changed files with 738 additions and 23 deletions
+76
View File
@@ -5,6 +5,8 @@ ProxMenux Security Routes
Flask blueprint for firewall management and security tool detection.
"""
import ipaddress
from flask import Blueprint, jsonify, request
from jwt_middleware import require_auth
@@ -234,6 +236,80 @@ def fail2ban_jail_config():
return jsonify({"success": False, "message": str(e)}), 500
@security_bp.route('/api/security/fail2ban/trusted-networks', methods=['GET'])
@require_auth
def fail2ban_trusted_networks():
"""List global IP/CIDR addresses excluded from all Fail2Ban jails."""
if not security_manager:
return jsonify({"success": False, "message": "Security manager not available"}), 500
try:
detected_ip = request.remote_addr
try:
parsed_ip = ipaddress.ip_address(detected_ip) if detected_ip else None
if isinstance(parsed_ip, ipaddress.IPv6Address) and parsed_ip.ipv4_mapped:
parsed_ip = parsed_ip.ipv4_mapped
if not parsed_ip or parsed_ip.is_loopback:
detected_ip = None
else:
detected_ip = str(parsed_ip)
except ValueError:
detected_ip = None
return jsonify({
"success": True,
"entries": security_manager.get_fail2ban_trusted_networks(),
"detected_ip": detected_ip,
})
except Exception as e:
return jsonify({"success": False, "message": str(e)}), 500
@security_bp.route('/api/security/fail2ban/trusted-networks', methods=['POST'])
@require_auth
def fail2ban_add_trusted_network():
"""Add one global Fail2Ban IP/CIDR exclusion."""
if not security_manager:
return jsonify({"success": False, "message": "Security manager not available"}), 500
try:
data = request.json or {}
success, message, value = security_manager.add_fail2ban_trusted_network(data.get("value", ""))
status = 200 if success else 400
return jsonify({"success": success, "message": message, "value": value}), status
except Exception as e:
return jsonify({"success": False, "message": str(e)}), 500
@security_bp.route('/api/security/fail2ban/trusted-networks', methods=['DELETE'])
@require_auth
def fail2ban_remove_trusted_network():
"""Remove one user-managed global Fail2Ban IP/CIDR exclusion."""
if not security_manager:
return jsonify({"success": False, "message": "Security manager not available"}), 500
try:
data = request.json or {}
success, message = security_manager.remove_fail2ban_trusted_network(data.get("value", ""))
status = 200 if success else 400
return jsonify({"success": success, "message": message}), status
except Exception as e:
return jsonify({"success": False, "message": str(e)}), 500
@security_bp.route('/api/security/fail2ban/trusted-networks', methods=['PUT'])
@require_auth
def fail2ban_update_trusted_network():
"""Replace one user-managed global Fail2Ban IP/CIDR exclusion."""
if not security_manager:
return jsonify({"success": False, "message": "Security manager not available"}), 500
try:
data = request.json or {}
success, message, value = security_manager.update_fail2ban_trusted_network(
data.get("old_value", ""), data.get("new_value", "")
)
status = 200 if success else 400
return jsonify({"success": success, "message": message, "value": value}), status
except Exception as e:
return jsonify({"success": False, "message": str(e)}), 500
@security_bp.route('/api/security/fail2ban/apply-jails', methods=['POST'])
@require_auth
def fail2ban_apply_jails():