mirror of
https://github.com/wshobson/agents.git
synced 2026-03-18 09:37:15 +00:00
feat: add 5 new specialized agents with 20 skills
Add domain expert agents with comprehensive skill sets: - service-mesh-expert (cloud-infrastructure): Istio/Linkerd patterns, mTLS, observability - event-sourcing-architect (backend-development): CQRS, event stores, projections, sagas - vector-database-engineer (llm-application-dev): embeddings, similarity search, hybrid search - monorepo-architect (developer-essentials): Nx, Turborepo, Bazel, pnpm workspaces - threat-modeling-expert (security-scanning): STRIDE, attack trees, security requirements Update all documentation to reflect correct counts: - 67 plugins, 99 agents, 107 skills, 71 commands
This commit is contained in:
@@ -0,0 +1,745 @@
|
||||
---
|
||||
name: threat-mitigation-mapping
|
||||
description: Map identified threats to appropriate security controls and mitigations. Use when prioritizing security investments, creating remediation plans, or validating control effectiveness.
|
||||
---
|
||||
|
||||
# Threat Mitigation Mapping
|
||||
|
||||
Connect threats to controls for effective security planning.
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
- Prioritizing security investments
|
||||
- Creating remediation roadmaps
|
||||
- Validating control coverage
|
||||
- Designing defense-in-depth
|
||||
- Security architecture review
|
||||
- Risk treatment planning
|
||||
|
||||
## Core Concepts
|
||||
|
||||
### 1. Control Categories
|
||||
|
||||
```
|
||||
Preventive ────► Stop attacks before they occur
|
||||
│ (Firewall, Input validation)
|
||||
│
|
||||
Detective ─────► Identify attacks in progress
|
||||
│ (IDS, Log monitoring)
|
||||
│
|
||||
Corrective ────► Respond and recover from attacks
|
||||
(Incident response, Backup restore)
|
||||
```
|
||||
|
||||
### 2. Control Layers
|
||||
|
||||
| Layer | Examples |
|
||||
|-------|----------|
|
||||
| **Network** | Firewall, WAF, DDoS protection |
|
||||
| **Application** | Input validation, authentication |
|
||||
| **Data** | Encryption, access controls |
|
||||
| **Endpoint** | EDR, patch management |
|
||||
| **Process** | Security training, incident response |
|
||||
|
||||
### 3. Defense in Depth
|
||||
|
||||
```
|
||||
┌──────────────────────┐
|
||||
│ Perimeter │ ← Firewall, WAF
|
||||
│ ┌──────────────┐ │
|
||||
│ │ Network │ │ ← Segmentation, IDS
|
||||
│ │ ┌────────┐ │ │
|
||||
│ │ │ Host │ │ │ ← EDR, Hardening
|
||||
│ │ │ ┌────┐ │ │ │
|
||||
│ │ │ │App │ │ │ │ ← Auth, Validation
|
||||
│ │ │ │Data│ │ │ │ ← Encryption
|
||||
│ │ │ └────┘ │ │ │
|
||||
│ │ └────────┘ │ │
|
||||
│ └──────────────┘ │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
## Templates
|
||||
|
||||
### Template 1: Mitigation Model
|
||||
|
||||
```python
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from typing import List, Dict, Optional, Set
|
||||
from datetime import datetime
|
||||
|
||||
class ControlType(Enum):
|
||||
PREVENTIVE = "preventive"
|
||||
DETECTIVE = "detective"
|
||||
CORRECTIVE = "corrective"
|
||||
|
||||
|
||||
class ControlLayer(Enum):
|
||||
NETWORK = "network"
|
||||
APPLICATION = "application"
|
||||
DATA = "data"
|
||||
ENDPOINT = "endpoint"
|
||||
PROCESS = "process"
|
||||
PHYSICAL = "physical"
|
||||
|
||||
|
||||
class ImplementationStatus(Enum):
|
||||
NOT_IMPLEMENTED = "not_implemented"
|
||||
PARTIAL = "partial"
|
||||
IMPLEMENTED = "implemented"
|
||||
VERIFIED = "verified"
|
||||
|
||||
|
||||
class Effectiveness(Enum):
|
||||
NONE = 0
|
||||
LOW = 1
|
||||
MEDIUM = 2
|
||||
HIGH = 3
|
||||
VERY_HIGH = 4
|
||||
|
||||
|
||||
@dataclass
|
||||
class SecurityControl:
|
||||
id: str
|
||||
name: str
|
||||
description: str
|
||||
control_type: ControlType
|
||||
layer: ControlLayer
|
||||
effectiveness: Effectiveness
|
||||
implementation_cost: str # Low, Medium, High
|
||||
maintenance_cost: str
|
||||
status: ImplementationStatus = ImplementationStatus.NOT_IMPLEMENTED
|
||||
mitigates_threats: List[str] = field(default_factory=list)
|
||||
dependencies: List[str] = field(default_factory=list)
|
||||
technologies: List[str] = field(default_factory=list)
|
||||
compliance_refs: List[str] = field(default_factory=list)
|
||||
|
||||
def coverage_score(self) -> float:
|
||||
"""Calculate coverage score based on status and effectiveness."""
|
||||
status_multiplier = {
|
||||
ImplementationStatus.NOT_IMPLEMENTED: 0.0,
|
||||
ImplementationStatus.PARTIAL: 0.5,
|
||||
ImplementationStatus.IMPLEMENTED: 0.8,
|
||||
ImplementationStatus.VERIFIED: 1.0,
|
||||
}
|
||||
return self.effectiveness.value * status_multiplier[self.status]
|
||||
|
||||
|
||||
@dataclass
|
||||
class Threat:
|
||||
id: str
|
||||
name: str
|
||||
category: str # STRIDE category
|
||||
description: str
|
||||
impact: str # Critical, High, Medium, Low
|
||||
likelihood: str
|
||||
risk_score: float
|
||||
|
||||
|
||||
@dataclass
|
||||
class MitigationMapping:
|
||||
threat: Threat
|
||||
controls: List[SecurityControl]
|
||||
residual_risk: str = "Unknown"
|
||||
notes: str = ""
|
||||
|
||||
def calculate_coverage(self) -> float:
|
||||
"""Calculate how well controls cover the threat."""
|
||||
if not self.controls:
|
||||
return 0.0
|
||||
|
||||
total_score = sum(c.coverage_score() for c in self.controls)
|
||||
max_possible = len(self.controls) * Effectiveness.VERY_HIGH.value
|
||||
|
||||
return (total_score / max_possible) * 100 if max_possible > 0 else 0
|
||||
|
||||
def has_defense_in_depth(self) -> bool:
|
||||
"""Check if multiple layers are covered."""
|
||||
layers = set(c.layer for c in self.controls if c.status != ImplementationStatus.NOT_IMPLEMENTED)
|
||||
return len(layers) >= 2
|
||||
|
||||
def has_control_diversity(self) -> bool:
|
||||
"""Check if multiple control types are present."""
|
||||
types = set(c.control_type for c in self.controls if c.status != ImplementationStatus.NOT_IMPLEMENTED)
|
||||
return len(types) >= 2
|
||||
|
||||
|
||||
@dataclass
|
||||
class MitigationPlan:
|
||||
name: str
|
||||
threats: List[Threat] = field(default_factory=list)
|
||||
controls: List[SecurityControl] = field(default_factory=list)
|
||||
mappings: List[MitigationMapping] = field(default_factory=list)
|
||||
|
||||
def get_unmapped_threats(self) -> List[Threat]:
|
||||
"""Find threats without mitigations."""
|
||||
mapped_ids = {m.threat.id for m in self.mappings}
|
||||
return [t for t in self.threats if t.id not in mapped_ids]
|
||||
|
||||
def get_control_coverage(self) -> Dict[str, float]:
|
||||
"""Get coverage percentage for each threat."""
|
||||
return {
|
||||
m.threat.id: m.calculate_coverage()
|
||||
for m in self.mappings
|
||||
}
|
||||
|
||||
def get_gaps(self) -> List[Dict]:
|
||||
"""Identify mitigation gaps."""
|
||||
gaps = []
|
||||
for mapping in self.mappings:
|
||||
coverage = mapping.calculate_coverage()
|
||||
if coverage < 50:
|
||||
gaps.append({
|
||||
"threat": mapping.threat.id,
|
||||
"threat_name": mapping.threat.name,
|
||||
"coverage": coverage,
|
||||
"issue": "Insufficient control coverage",
|
||||
"recommendation": "Add more controls or improve existing ones"
|
||||
})
|
||||
if not mapping.has_defense_in_depth():
|
||||
gaps.append({
|
||||
"threat": mapping.threat.id,
|
||||
"threat_name": mapping.threat.name,
|
||||
"coverage": coverage,
|
||||
"issue": "No defense in depth",
|
||||
"recommendation": "Add controls at different layers"
|
||||
})
|
||||
if not mapping.has_control_diversity():
|
||||
gaps.append({
|
||||
"threat": mapping.threat.id,
|
||||
"threat_name": mapping.threat.name,
|
||||
"coverage": coverage,
|
||||
"issue": "No control diversity",
|
||||
"recommendation": "Add detective/corrective controls"
|
||||
})
|
||||
return gaps
|
||||
```
|
||||
|
||||
### Template 2: Control Library
|
||||
|
||||
```python
|
||||
class ControlLibrary:
|
||||
"""Library of standard security controls."""
|
||||
|
||||
STANDARD_CONTROLS = {
|
||||
# Authentication Controls
|
||||
"AUTH-001": SecurityControl(
|
||||
id="AUTH-001",
|
||||
name="Multi-Factor Authentication",
|
||||
description="Require MFA for all user authentication",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["SPOOFING"],
|
||||
technologies=["TOTP", "WebAuthn", "SMS OTP"],
|
||||
compliance_refs=["PCI-DSS 8.3", "NIST 800-63B"]
|
||||
),
|
||||
"AUTH-002": SecurityControl(
|
||||
id="AUTH-002",
|
||||
name="Account Lockout Policy",
|
||||
description="Lock accounts after failed authentication attempts",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.MEDIUM,
|
||||
implementation_cost="Low",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["SPOOFING"],
|
||||
technologies=["Custom implementation"],
|
||||
compliance_refs=["PCI-DSS 8.1.6"]
|
||||
),
|
||||
|
||||
# Input Validation Controls
|
||||
"VAL-001": SecurityControl(
|
||||
id="VAL-001",
|
||||
name="Input Validation Framework",
|
||||
description="Validate and sanitize all user input",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Medium",
|
||||
mitigates_threats=["TAMPERING", "INJECTION"],
|
||||
technologies=["Joi", "Yup", "Pydantic"],
|
||||
compliance_refs=["OWASP ASVS V5"]
|
||||
),
|
||||
"VAL-002": SecurityControl(
|
||||
id="VAL-002",
|
||||
name="Web Application Firewall",
|
||||
description="Deploy WAF to filter malicious requests",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.NETWORK,
|
||||
effectiveness=Effectiveness.MEDIUM,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Medium",
|
||||
mitigates_threats=["TAMPERING", "INJECTION", "DOS"],
|
||||
technologies=["AWS WAF", "Cloudflare", "ModSecurity"],
|
||||
compliance_refs=["PCI-DSS 6.6"]
|
||||
),
|
||||
|
||||
# Encryption Controls
|
||||
"ENC-001": SecurityControl(
|
||||
id="ENC-001",
|
||||
name="Data Encryption at Rest",
|
||||
description="Encrypt sensitive data in storage",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.DATA,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["INFORMATION_DISCLOSURE"],
|
||||
technologies=["AES-256", "KMS", "HSM"],
|
||||
compliance_refs=["PCI-DSS 3.4", "GDPR Art. 32"]
|
||||
),
|
||||
"ENC-002": SecurityControl(
|
||||
id="ENC-002",
|
||||
name="TLS Encryption",
|
||||
description="Encrypt data in transit using TLS 1.3",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.NETWORK,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="Low",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["INFORMATION_DISCLOSURE", "TAMPERING"],
|
||||
technologies=["TLS 1.3", "Certificate management"],
|
||||
compliance_refs=["PCI-DSS 4.1", "HIPAA"]
|
||||
),
|
||||
|
||||
# Logging Controls
|
||||
"LOG-001": SecurityControl(
|
||||
id="LOG-001",
|
||||
name="Security Event Logging",
|
||||
description="Log all security-relevant events",
|
||||
control_type=ControlType.DETECTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.MEDIUM,
|
||||
implementation_cost="Low",
|
||||
maintenance_cost="Medium",
|
||||
mitigates_threats=["REPUDIATION"],
|
||||
technologies=["ELK Stack", "Splunk", "CloudWatch"],
|
||||
compliance_refs=["PCI-DSS 10.2", "SOC2"]
|
||||
),
|
||||
"LOG-002": SecurityControl(
|
||||
id="LOG-002",
|
||||
name="Log Integrity Protection",
|
||||
description="Protect logs from tampering",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.DATA,
|
||||
effectiveness=Effectiveness.MEDIUM,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["REPUDIATION", "TAMPERING"],
|
||||
technologies=["Immutable storage", "Log signing"],
|
||||
compliance_refs=["PCI-DSS 10.5"]
|
||||
),
|
||||
|
||||
# Access Control
|
||||
"ACC-001": SecurityControl(
|
||||
id="ACC-001",
|
||||
name="Role-Based Access Control",
|
||||
description="Implement RBAC for authorization",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="Medium",
|
||||
maintenance_cost="Medium",
|
||||
mitigates_threats=["ELEVATION_OF_PRIVILEGE", "INFORMATION_DISCLOSURE"],
|
||||
technologies=["RBAC", "ABAC", "Policy engines"],
|
||||
compliance_refs=["PCI-DSS 7.1", "SOC2"]
|
||||
),
|
||||
|
||||
# Availability Controls
|
||||
"AVL-001": SecurityControl(
|
||||
id="AVL-001",
|
||||
name="Rate Limiting",
|
||||
description="Limit request rates to prevent abuse",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.APPLICATION,
|
||||
effectiveness=Effectiveness.MEDIUM,
|
||||
implementation_cost="Low",
|
||||
maintenance_cost="Low",
|
||||
mitigates_threats=["DENIAL_OF_SERVICE"],
|
||||
technologies=["API Gateway", "Redis", "Token bucket"],
|
||||
compliance_refs=["OWASP API Security"]
|
||||
),
|
||||
"AVL-002": SecurityControl(
|
||||
id="AVL-002",
|
||||
name="DDoS Protection",
|
||||
description="Deploy DDoS mitigation services",
|
||||
control_type=ControlType.PREVENTIVE,
|
||||
layer=ControlLayer.NETWORK,
|
||||
effectiveness=Effectiveness.HIGH,
|
||||
implementation_cost="High",
|
||||
maintenance_cost="Medium",
|
||||
mitigates_threats=["DENIAL_OF_SERVICE"],
|
||||
technologies=["Cloudflare", "AWS Shield", "Akamai"],
|
||||
compliance_refs=["NIST CSF"]
|
||||
),
|
||||
}
|
||||
|
||||
def get_controls_for_threat(self, threat_category: str) -> List[SecurityControl]:
|
||||
"""Get all controls that mitigate a threat category."""
|
||||
return [
|
||||
c for c in self.STANDARD_CONTROLS.values()
|
||||
if threat_category in c.mitigates_threats
|
||||
]
|
||||
|
||||
def get_controls_by_layer(self, layer: ControlLayer) -> List[SecurityControl]:
|
||||
"""Get controls for a specific layer."""
|
||||
return [c for c in self.STANDARD_CONTROLS.values() if c.layer == layer]
|
||||
|
||||
def get_control(self, control_id: str) -> Optional[SecurityControl]:
|
||||
"""Get a specific control by ID."""
|
||||
return self.STANDARD_CONTROLS.get(control_id)
|
||||
|
||||
def recommend_controls(
|
||||
self,
|
||||
threat: Threat,
|
||||
existing_controls: List[str]
|
||||
) -> List[SecurityControl]:
|
||||
"""Recommend additional controls for a threat."""
|
||||
available = self.get_controls_for_threat(threat.category)
|
||||
return [c for c in available if c.id not in existing_controls]
|
||||
```
|
||||
|
||||
### Template 3: Mitigation Analysis
|
||||
|
||||
```python
|
||||
class MitigationAnalyzer:
|
||||
"""Analyze and optimize mitigation strategies."""
|
||||
|
||||
def __init__(self, plan: MitigationPlan, library: ControlLibrary):
|
||||
self.plan = plan
|
||||
self.library = library
|
||||
|
||||
def calculate_overall_risk_reduction(self) -> float:
|
||||
"""Calculate overall risk reduction percentage."""
|
||||
if not self.plan.mappings:
|
||||
return 0.0
|
||||
|
||||
weighted_coverage = 0
|
||||
total_weight = 0
|
||||
|
||||
for mapping in self.plan.mappings:
|
||||
# Weight by threat risk score
|
||||
weight = mapping.threat.risk_score
|
||||
coverage = mapping.calculate_coverage()
|
||||
weighted_coverage += weight * coverage
|
||||
total_weight += weight
|
||||
|
||||
return weighted_coverage / total_weight if total_weight > 0 else 0
|
||||
|
||||
def get_critical_gaps(self) -> List[Dict]:
|
||||
"""Find critical gaps that need immediate attention."""
|
||||
gaps = self.plan.get_gaps()
|
||||
critical_threats = {t.id for t in self.plan.threats if t.impact == "Critical"}
|
||||
|
||||
return [g for g in gaps if g["threat"] in critical_threats]
|
||||
|
||||
def optimize_budget(
|
||||
self,
|
||||
budget: float,
|
||||
cost_map: Dict[str, float]
|
||||
) -> List[SecurityControl]:
|
||||
"""Select controls that maximize risk reduction within budget."""
|
||||
# Simple greedy approach - can be replaced with optimization algorithm
|
||||
recommended = []
|
||||
remaining_budget = budget
|
||||
unmapped = self.plan.get_unmapped_threats()
|
||||
|
||||
# Sort controls by effectiveness/cost ratio
|
||||
all_controls = list(self.library.STANDARD_CONTROLS.values())
|
||||
controls_with_value = []
|
||||
|
||||
for control in all_controls:
|
||||
if control.status == ImplementationStatus.NOT_IMPLEMENTED:
|
||||
cost = cost_map.get(control.id, float('inf'))
|
||||
if cost <= remaining_budget:
|
||||
# Calculate value as threats covered * effectiveness / cost
|
||||
threats_covered = len([
|
||||
t for t in unmapped
|
||||
if t.category in control.mitigates_threats
|
||||
])
|
||||
if threats_covered > 0:
|
||||
value = (threats_covered * control.effectiveness.value) / cost
|
||||
controls_with_value.append((control, value, cost))
|
||||
|
||||
# Sort by value (higher is better)
|
||||
controls_with_value.sort(key=lambda x: x[1], reverse=True)
|
||||
|
||||
for control, value, cost in controls_with_value:
|
||||
if cost <= remaining_budget:
|
||||
recommended.append(control)
|
||||
remaining_budget -= cost
|
||||
|
||||
return recommended
|
||||
|
||||
def generate_roadmap(self) -> List[Dict]:
|
||||
"""Generate implementation roadmap by priority."""
|
||||
roadmap = []
|
||||
gaps = self.plan.get_gaps()
|
||||
|
||||
# Phase 1: Critical threats with low coverage
|
||||
phase1 = []
|
||||
for gap in gaps:
|
||||
mapping = next(
|
||||
(m for m in self.plan.mappings if m.threat.id == gap["threat"]),
|
||||
None
|
||||
)
|
||||
if mapping and mapping.threat.impact == "Critical":
|
||||
controls = self.library.get_controls_for_threat(mapping.threat.category)
|
||||
phase1.extend([
|
||||
{
|
||||
"threat": gap["threat"],
|
||||
"control": c.id,
|
||||
"control_name": c.name,
|
||||
"phase": 1,
|
||||
"priority": "Critical"
|
||||
}
|
||||
for c in controls
|
||||
if c.status == ImplementationStatus.NOT_IMPLEMENTED
|
||||
])
|
||||
|
||||
roadmap.extend(phase1[:5]) # Top 5 for phase 1
|
||||
|
||||
# Phase 2: High impact threats
|
||||
phase2 = []
|
||||
for gap in gaps:
|
||||
mapping = next(
|
||||
(m for m in self.plan.mappings if m.threat.id == gap["threat"]),
|
||||
None
|
||||
)
|
||||
if mapping and mapping.threat.impact == "High":
|
||||
controls = self.library.get_controls_for_threat(mapping.threat.category)
|
||||
phase2.extend([
|
||||
{
|
||||
"threat": gap["threat"],
|
||||
"control": c.id,
|
||||
"control_name": c.name,
|
||||
"phase": 2,
|
||||
"priority": "High"
|
||||
}
|
||||
for c in controls
|
||||
if c.status == ImplementationStatus.NOT_IMPLEMENTED
|
||||
])
|
||||
|
||||
roadmap.extend(phase2[:5]) # Top 5 for phase 2
|
||||
|
||||
return roadmap
|
||||
|
||||
def defense_in_depth_analysis(self) -> Dict[str, List[str]]:
|
||||
"""Analyze defense in depth coverage."""
|
||||
layer_coverage = {layer.value: [] for layer in ControlLayer}
|
||||
|
||||
for mapping in self.plan.mappings:
|
||||
for control in mapping.controls:
|
||||
if control.status in [ImplementationStatus.IMPLEMENTED, ImplementationStatus.VERIFIED]:
|
||||
layer_coverage[control.layer.value].append(control.id)
|
||||
|
||||
return layer_coverage
|
||||
|
||||
def generate_report(self) -> str:
|
||||
"""Generate comprehensive mitigation report."""
|
||||
risk_reduction = self.calculate_overall_risk_reduction()
|
||||
gaps = self.plan.get_gaps()
|
||||
critical_gaps = self.get_critical_gaps()
|
||||
layer_coverage = self.defense_in_depth_analysis()
|
||||
|
||||
report = f"""
|
||||
# Threat Mitigation Report
|
||||
|
||||
## Executive Summary
|
||||
- **Overall Risk Reduction:** {risk_reduction:.1f}%
|
||||
- **Total Threats:** {len(self.plan.threats)}
|
||||
- **Total Controls:** {len(self.plan.controls)}
|
||||
- **Identified Gaps:** {len(gaps)}
|
||||
- **Critical Gaps:** {len(critical_gaps)}
|
||||
|
||||
## Defense in Depth Coverage
|
||||
{self._format_layer_coverage(layer_coverage)}
|
||||
|
||||
## Critical Gaps Requiring Immediate Action
|
||||
{self._format_gaps(critical_gaps)}
|
||||
|
||||
## Recommendations
|
||||
{self._format_recommendations()}
|
||||
|
||||
## Implementation Roadmap
|
||||
{self._format_roadmap()}
|
||||
"""
|
||||
return report
|
||||
|
||||
def _format_layer_coverage(self, coverage: Dict[str, List[str]]) -> str:
|
||||
lines = []
|
||||
for layer, controls in coverage.items():
|
||||
status = "✓" if controls else "✗"
|
||||
lines.append(f"- {layer}: {status} ({len(controls)} controls)")
|
||||
return "\n".join(lines)
|
||||
|
||||
def _format_gaps(self, gaps: List[Dict]) -> str:
|
||||
if not gaps:
|
||||
return "No critical gaps identified."
|
||||
lines = []
|
||||
for gap in gaps:
|
||||
lines.append(f"- **{gap['threat_name']}**: {gap['issue']}")
|
||||
lines.append(f" - Coverage: {gap['coverage']:.1f}%")
|
||||
lines.append(f" - Recommendation: {gap['recommendation']}")
|
||||
return "\n".join(lines)
|
||||
|
||||
def _format_recommendations(self) -> str:
|
||||
recommendations = []
|
||||
layer_coverage = self.defense_in_depth_analysis()
|
||||
|
||||
for layer, controls in layer_coverage.items():
|
||||
if not controls:
|
||||
recommendations.append(f"- Add {layer} layer controls")
|
||||
|
||||
gaps = self.plan.get_gaps()
|
||||
if any(g["issue"] == "No control diversity" for g in gaps):
|
||||
recommendations.append("- Add more detective and corrective controls")
|
||||
|
||||
return "\n".join(recommendations) if recommendations else "Current coverage is adequate."
|
||||
|
||||
def _format_roadmap(self) -> str:
|
||||
roadmap = self.generate_roadmap()
|
||||
if not roadmap:
|
||||
return "No additional controls recommended at this time."
|
||||
|
||||
lines = []
|
||||
current_phase = 0
|
||||
for item in roadmap:
|
||||
if item["phase"] != current_phase:
|
||||
current_phase = item["phase"]
|
||||
lines.append(f"\n### Phase {current_phase}")
|
||||
lines.append(f"- [{item['priority']}] {item['control_name']} (for {item['threat']})")
|
||||
|
||||
return "\n".join(lines)
|
||||
```
|
||||
|
||||
### Template 4: Control Effectiveness Testing
|
||||
|
||||
```python
|
||||
from dataclasses import dataclass
|
||||
from typing import List, Callable, Any
|
||||
import asyncio
|
||||
|
||||
@dataclass
|
||||
class ControlTest:
|
||||
control_id: str
|
||||
test_name: str
|
||||
test_function: Callable[[], bool]
|
||||
expected_result: bool
|
||||
description: str
|
||||
|
||||
|
||||
class ControlTester:
|
||||
"""Test control effectiveness."""
|
||||
|
||||
def __init__(self):
|
||||
self.tests: List[ControlTest] = []
|
||||
self.results: List[Dict] = []
|
||||
|
||||
def add_test(self, test: ControlTest) -> None:
|
||||
self.tests.append(test)
|
||||
|
||||
async def run_tests(self) -> List[Dict]:
|
||||
"""Run all control tests."""
|
||||
self.results = []
|
||||
|
||||
for test in self.tests:
|
||||
try:
|
||||
result = test.test_function()
|
||||
passed = result == test.expected_result
|
||||
self.results.append({
|
||||
"control_id": test.control_id,
|
||||
"test_name": test.test_name,
|
||||
"passed": passed,
|
||||
"actual_result": result,
|
||||
"expected_result": test.expected_result,
|
||||
"description": test.description,
|
||||
"error": None
|
||||
})
|
||||
except Exception as e:
|
||||
self.results.append({
|
||||
"control_id": test.control_id,
|
||||
"test_name": test.test_name,
|
||||
"passed": False,
|
||||
"actual_result": None,
|
||||
"expected_result": test.expected_result,
|
||||
"description": test.description,
|
||||
"error": str(e)
|
||||
})
|
||||
|
||||
return self.results
|
||||
|
||||
def get_effectiveness_score(self, control_id: str) -> float:
|
||||
"""Calculate effectiveness score for a control."""
|
||||
control_results = [r for r in self.results if r["control_id"] == control_id]
|
||||
if not control_results:
|
||||
return 0.0
|
||||
|
||||
passed = sum(1 for r in control_results if r["passed"])
|
||||
return (passed / len(control_results)) * 100
|
||||
|
||||
def generate_test_report(self) -> str:
|
||||
"""Generate test results report."""
|
||||
if not self.results:
|
||||
return "No tests have been run."
|
||||
|
||||
total = len(self.results)
|
||||
passed = sum(1 for r in self.results if r["passed"])
|
||||
|
||||
report = f"""
|
||||
# Control Effectiveness Test Report
|
||||
|
||||
## Summary
|
||||
- **Total Tests:** {total}
|
||||
- **Passed:** {passed}
|
||||
- **Failed:** {total - passed}
|
||||
- **Pass Rate:** {(passed/total)*100:.1f}%
|
||||
|
||||
## Results by Control
|
||||
"""
|
||||
# Group by control
|
||||
controls = {}
|
||||
for result in self.results:
|
||||
cid = result["control_id"]
|
||||
if cid not in controls:
|
||||
controls[cid] = []
|
||||
controls[cid].append(result)
|
||||
|
||||
for control_id, results in controls.items():
|
||||
score = self.get_effectiveness_score(control_id)
|
||||
report += f"\n### {control_id} (Effectiveness: {score:.1f}%)\n"
|
||||
for r in results:
|
||||
status = "✓" if r["passed"] else "✗"
|
||||
report += f"- {status} {r['test_name']}\n"
|
||||
if r["error"]:
|
||||
report += f" - Error: {r['error']}\n"
|
||||
|
||||
return report
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Do's
|
||||
- **Map all threats** - No threat should be unmapped
|
||||
- **Layer controls** - Defense in depth is essential
|
||||
- **Mix control types** - Preventive, detective, corrective
|
||||
- **Track effectiveness** - Measure and improve
|
||||
- **Review regularly** - Controls degrade over time
|
||||
|
||||
### Don'ts
|
||||
- **Don't rely on single controls** - Single points of failure
|
||||
- **Don't ignore cost** - ROI matters
|
||||
- **Don't skip testing** - Untested controls may fail
|
||||
- **Don't set and forget** - Continuous improvement
|
||||
- **Don't ignore people/process** - Technology alone isn't enough
|
||||
|
||||
## Resources
|
||||
|
||||
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)
|
||||
- [CIS Controls](https://www.cisecurity.org/controls)
|
||||
- [MITRE D3FEND](https://d3fend.mitre.org/)
|
||||
Reference in New Issue
Block a user