Lessons Learned and Continuous Improvement

Lessons Learned and Continuous Improvement

The lessons learned phase transforms incidents into organizational learning opportunities. Comprehensive post-incident reviews identify improvement areas, update procedures, and strengthen defenses against future attacks. This continuous improvement cycle ensures each incident makes the organization more resilient.

Implement structured lessons learned process:

#!/usr/bin/env python3
"""
Incident Lessons Learned and Improvement System
"""

import json
import datetime
from typing import List, Dict, Any
from dataclasses import dataclass, asdict
import markdown
import jinja2

@dataclass
class IncidentTimeline:
    """Timeline event during incident"""
    timestamp: datetime.datetime
    event: str
    actor: str
    impact: str
    evidence: List[str]

@dataclass
class LessonLearned:
    """Individual lesson learned"""
    category: str  # Prevention, Detection, Response, Recovery
    observation: str
    root_cause: str
    recommendation: str
    priority: str  # High, Medium, Low
    owner: str
    due_date: datetime.date

@dataclass
class ImprovementAction:
    """Improvement action item"""
    action: str
    description: str
    success_criteria: str
    resources_required: List[str]
    estimated_effort: str
    dependencies: List[str]
    status: str = "pending"

class IncidentReview:
    """Comprehensive incident review system"""
    
    def __init__(self, incident_id: str):
        self.incident_id = incident_id
        self.timeline: List[IncidentTimeline] = []
        self.lessons: List[LessonLearned] = []
        self.improvements: List[ImprovementAction] = []
        self.participants: List[str] = []
        self.review_date = datetime.datetime.now()
    
    def build_timeline(self, events: List[Dict[str, Any]]):
        """Build incident timeline from events"""
        for event in sorted(events, key=lambda x: x['timestamp']):
            self.timeline.append(IncidentTimeline(
                timestamp=datetime.datetime.fromisoformat(event['timestamp']),
                event=event['description'],
                actor=event.get('actor', 'system'),
                impact=event.get('impact', 'unknown'),
                evidence=event.get('evidence', [])
            ))
    
    def analyze_incident(self) -> Dict[str, Any]:
        """Analyze incident for improvement opportunities"""
        analysis = {
            'incident_id': self.incident_id,
            'duration': self._calculate_duration(),
            'detection_time': self._calculate_detection_time(),
            'containment_time': self._calculate_containment_time(),
            'recovery_time': self._calculate_recovery_time(),
            'root_causes': self._identify_root_causes(),
            'contributing_factors': self._identify_contributing_factors(),
            'what_went_well': self._identify_successes(),
            'what_went_wrong': self._identify_failures()
        }
        
        return analysis
    
    def _calculate_duration(self) -> datetime.timedelta:
        """Calculate total incident duration"""
        if self.timeline:
            return self.timeline[-1].timestamp - self.timeline[0].timestamp
        return datetime.timedelta(0)
    
    def _calculate_detection_time(self) -> datetime.timedelta:
        """Calculate time to detection"""
        initial_compromise = next(
            (event for event in self.timeline if 'compromise' in event.event.lower()),
            None
        )
        detection = next(
            (event for event in self.timeline if 'detected' in event.event.lower()),
            None
        )
        
        if initial_compromise and detection:
            return detection.timestamp - initial_compromise.timestamp
        return datetime.timedelta(0)
    
    def _identify_root_causes(self) -> List[str]:
        """Identify root causes using 5-why analysis"""
        root_causes = []
        
        # Analyze each major event
        for event in self.timeline:
            if 'compromise' in event.event.lower() or 'breach' in event.event.lower():
                # Perform 5-why analysis
                why_chain = self._five_why_analysis(event)
                if why_chain:
                    root_causes.append(why_chain[-1])  # Last why is root cause
        
        return list(set(root_causes))
    
    def _five_why_analysis(self, event: IncidentTimeline) -> List[str]:
        """Perform 5-why analysis on event"""
        # This would typically involve human input
        # Simplified example
        why_chain = []
        
        if 'phishing' in event.event.lower():
            why_chain = [
                "User clicked phishing link",
                "Email bypassed spam filters",
                "Spam filters not updated with latest threats",
                "No automated threat intelligence feed",
                "Lack of investment in email security"
            ]
        elif 'unpatched' in event.event.lower():
            why_chain = [
                "System compromised via unpatched vulnerability",
                "Patch not applied in timely manner",
                "No automated patching process",
                "Concerns about system stability",
                "Lack of proper testing environment"
            ]
        
        return why_chain
    
    def generate_improvement_plan(self):
        """Generate improvement action plan"""
        
        # Prevention improvements
        if any('patch' in cause.lower() for cause in self._identify_root_causes()):
            self.improvements.append(ImprovementAction(
                action="Implement automated patching",
                description="Deploy automated patch management system for critical updates",
                success_criteria="95% of critical patches applied within 48 hours",
                resources_required=["Patch management tool", "Testing environment", "Staff training"],
                estimated_effort="3 months",
                dependencies=["Tool selection", "Budget approval"]
            ))
        
        # Detection improvements
        detection_time = self._calculate_detection_time()
        if detection_time > datetime.timedelta(hours=24):
            self.improvements.append(ImprovementAction(
                action="Enhance detection capabilities",
                description="Implement advanced threat detection with ML/AI capabilities",
                success_criteria="Reduce mean time to detection to under 1 hour",
                resources_required=["EDR solution", "SIEM upgrade", "SOC training"],
                estimated_effort="6 months",
                dependencies=["Vendor selection", "SOC staffing"]
            ))
        
        # Response improvements
        if self._calculate_containment_time() > datetime.timedelta(hours=4):
            self.improvements.append(ImprovementAction(
                action="Automate incident response",
                description="Implement SOAR platform for automated response actions",
                success_criteria="Automate 80% of common response actions",
                resources_required=["SOAR platform", "Playbook development", "Integration work"],
                estimated_effort="4 months",
                dependencies=["Platform selection", "Process documentation"]
            ))
    
    def generate_report(self) -> str:
        """Generate comprehensive lessons learned report"""
        
        template = """
# Incident {{ incident_id }} - Lessons Learned Report

**Date:** {{ review_date }}  
**Participants:** {{ participants }}