Measuring Remediation Effectiveness

Measuring Remediation Effectiveness

Track remediation progress and effectiveness:

# remediation-metrics.py

class RemediationMetrics:
    def __init__(self, historical_data: List[Dict]):
        self.historical_data = historical_data
        
    def calculate_metrics(self) -> Dict:
        """Calculate key remediation metrics"""
        
        metrics = {
            'mttr': self.calculate_mttr(),  # Mean Time To Remediate
            'remediation_rate': self.calculate_remediation_rate(),
            'vulnerability_density': self.calculate_vulnerability_density(),
            'sla_compliance': self.calculate_sla_compliance(),
            'remediation_efficiency': self.calculate_efficiency()
        }
        
        return metrics
    
    def calculate_mttr(self) -> Dict:
        """Calculate Mean Time To Remediate by severity"""
        mttr = {
            'critical': [],
            'high': [],
            'medium': [],
            'low': []
        }
        
        for vuln in self.historical_data:
            if vuln.get('remediated_date'):
                time_to_remediate = (
                    datetime.fromisoformat(vuln['remediated_date']) -
                    datetime.fromisoformat(vuln['discovered_date'])
                ).days
                
                mttr[vuln['severity'].lower()].append(time_to_remediate)
        
        return {
            severity: sum(times) / len(times) if times else 0
            for severity, times in mttr.items()
        }
    
    def calculate_sla_compliance(self) -> Dict:
        """Calculate SLA compliance by severity"""
        sla_targets = {
            'critical': 1,   # 1 day
            'high': 7,       # 7 days
            'medium': 30,    # 30 days
            'low': 90        # 90 days
        }
        
        compliance = {severity: {'compliant': 0, 'total': 0} 
                     for severity in sla_targets}
        
        for vuln in self.historical_data:
            severity = vuln['severity'].lower()
            if severity in compliance:
                compliance[severity]['total'] += 1
                
                if vuln.get('remediated_date'):
                    time_to_remediate = (
                        datetime.fromisoformat(vuln['remediated_date']) -
                        datetime.fromisoformat(vuln['discovered_date'])
                    ).days
                    
                    if time_to_remediate <= sla_targets[severity]:
                        compliance[severity]['compliant'] += 1
        
        return {
            severity: (data['compliant'] / data['total'] * 100) if data['total'] > 0 else 100
            for severity, data in compliance.items()
        }
    
    def generate_remediation_dashboard(self) -> str:
        """Generate remediation metrics dashboard"""
        metrics = self.calculate_metrics()
        
        dashboard = f"""
# Vulnerability Remediation Dashboard
Generated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}