runbooks 1.1.3__py3-none-any.whl → 1.1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/WEIGHT_CONFIG_README.md +1 -1
- runbooks/cfat/assessment/compliance.py +8 -8
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cfat/models.py +6 -2
- runbooks/cfat/tests/__init__.py +6 -1
- runbooks/cli/__init__.py +13 -0
- runbooks/cli/commands/cfat.py +274 -0
- runbooks/cli/commands/finops.py +1164 -0
- runbooks/cli/commands/inventory.py +379 -0
- runbooks/cli/commands/operate.py +239 -0
- runbooks/cli/commands/security.py +248 -0
- runbooks/cli/commands/validation.py +825 -0
- runbooks/cli/commands/vpc.py +310 -0
- runbooks/cli/registry.py +107 -0
- runbooks/cloudops/__init__.py +23 -30
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +549 -547
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +226 -227
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +179 -215
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +11 -0
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +341 -0
- runbooks/common/aws_utils.py +75 -80
- runbooks/common/business_logic.py +127 -105
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
- runbooks/common/cross_account_manager.py +198 -205
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +235 -0
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +478 -495
- runbooks/common/mcp_integration.py +63 -74
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +176 -194
- runbooks/common/patterns.py +204 -0
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +248 -39
- runbooks/common/rich_utils.py +643 -92
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +29 -33
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +488 -622
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +40 -37
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +230 -292
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +338 -175
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1513 -482
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +25 -29
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +77 -78
- runbooks/finops/scenarios.py +1278 -439
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/tests/test_finops_dashboard.py +3 -3
- runbooks/finops/tests/test_reference_images_validation.py +2 -2
- runbooks/finops/tests/test_single_account_features.py +17 -17
- runbooks/finops/tests/validate_test_suite.py +1 -1
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +263 -269
- runbooks/finops/vpc_cleanup_exporter.py +191 -146
- runbooks/finops/vpc_cleanup_optimizer.py +593 -575
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/hitl/enhanced_workflow_engine.py +1 -1
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/README.md +3 -3
- runbooks/inventory/Tests/common_test_data.py +30 -30
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +28 -11
- runbooks/inventory/collectors/aws_networking.py +111 -101
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/discovery.md +2 -2
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/find_ec2_security_groups.py +1 -1
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/mcp_inventory_validator.py +549 -465
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +56 -52
- runbooks/inventory/rich_inventory_display.py +33 -32
- runbooks/inventory/unified_validation_engine.py +278 -251
- runbooks/inventory/vpc_analyzer.py +733 -696
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +382 -378
- runbooks/inventory/vpc_flow_analyzer.py +3 -3
- runbooks/main.py +152 -9147
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/metrics/dora_metrics_engine.py +2 -2
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/mcp_integration.py +1 -1
- runbooks/operate/networking_cost_heatmap.py +33 -10
- runbooks/operate/privatelink_operations.py +1 -1
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_endpoints.py +1 -1
- runbooks/operate/vpc_operations.py +648 -618
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +71 -67
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +91 -65
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +49 -44
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/integration_test_enterprise_security.py +5 -3
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/run_script.py +1 -1
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/mcp_reliability_engine.py +6 -6
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +51 -48
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +754 -708
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +447 -451
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +190 -162
- runbooks/vpc/mcp_no_eni_validator.py +681 -640
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1302 -1129
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.5.dist-info/METADATA +328 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -956
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.3.dist-info/METADATA +0 -799
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
runbooks/security/run_script.py
CHANGED
@@ -48,7 +48,7 @@ class SecurityBaselineTester:
|
|
48
48
|
|
49
49
|
def _create_session(self):
|
50
50
|
# Use enterprise profile management for security operations (management profile for cross-account)
|
51
|
-
return create_management_session(
|
51
|
+
return create_management_session(profile_name=self.profile)
|
52
52
|
|
53
53
|
def _load_config(self):
|
54
54
|
## Get the absolute directory where *this script* is located
|
@@ -35,24 +35,17 @@ from runbooks.common.rich_utils import (
|
|
35
35
|
from .compliance_automation_engine import ComplianceAutomationEngine, ComplianceFramework
|
36
36
|
from .security_baseline_tester import SecurityBaselineTester
|
37
37
|
from .config_template_generator import SecurityConfigTemplateGenerator
|
38
|
+
from .two_way_validation_framework import execute_2way_validation
|
38
39
|
|
39
40
|
|
40
41
|
@click.group()
|
41
|
-
@click.option(
|
42
|
-
|
43
|
-
default=None,
|
44
|
-
help="AWS profile to use (overrides environment variables)"
|
45
|
-
)
|
46
|
-
@click.option(
|
47
|
-
"--output-dir",
|
48
|
-
default="./artifacts/security",
|
49
|
-
help="Output directory for security reports"
|
50
|
-
)
|
42
|
+
@click.option("--profile", default=None, help="AWS profile to use (overrides environment variables)")
|
43
|
+
@click.option("--output-dir", default="./artifacts/security", help="Output directory for security reports")
|
51
44
|
@click.pass_context
|
52
45
|
def security(ctx, profile: Optional[str], output_dir: str):
|
53
46
|
"""
|
54
47
|
Enterprise Security Operations with Dynamic Configuration.
|
55
|
-
|
48
|
+
|
56
49
|
Supports configuration via:
|
57
50
|
- Environment variables
|
58
51
|
- Configuration files
|
@@ -62,7 +55,7 @@ def security(ctx, profile: Optional[str], output_dir: str):
|
|
62
55
|
ctx.ensure_object(dict)
|
63
56
|
ctx.obj["profile"] = profile
|
64
57
|
ctx.obj["output_dir"] = output_dir
|
65
|
-
|
58
|
+
|
66
59
|
# Validate profile if specified
|
67
60
|
if profile:
|
68
61
|
resolved_profile = get_profile_for_operation("management", profile)
|
@@ -75,46 +68,29 @@ def security(ctx, profile: Optional[str], output_dir: str):
|
|
75
68
|
@click.option(
|
76
69
|
"--frameworks",
|
77
70
|
multiple=True,
|
78
|
-
type=click.Choice(
|
79
|
-
"aws-well-architected",
|
80
|
-
|
81
|
-
"pci-dss",
|
82
|
-
"hipaa",
|
83
|
-
"iso27001",
|
84
|
-
"nist-cybersecurity",
|
85
|
-
"cis-benchmarks"
|
86
|
-
]),
|
71
|
+
type=click.Choice(
|
72
|
+
["aws-well-architected", "soc2-type-ii", "pci-dss", "hipaa", "iso27001", "nist-cybersecurity", "cis-benchmarks"]
|
73
|
+
),
|
87
74
|
default=["aws-well-architected"],
|
88
|
-
help="Compliance frameworks to assess"
|
89
|
-
)
|
90
|
-
@click.option(
|
91
|
-
"--accounts",
|
92
|
-
help="Comma-separated account IDs (overrides discovery)"
|
93
|
-
)
|
94
|
-
@click.option(
|
95
|
-
"--all",
|
96
|
-
"all_accounts",
|
97
|
-
is_flag=True,
|
98
|
-
help="Assess all discovered accounts via Organizations API"
|
99
|
-
)
|
100
|
-
@click.option(
|
101
|
-
"--scope",
|
102
|
-
type=click.Choice(["full", "quick", "critical"]),
|
103
|
-
default="full",
|
104
|
-
help="Assessment scope"
|
75
|
+
help="Compliance frameworks to assess",
|
105
76
|
)
|
77
|
+
@click.option("--accounts", help="Comma-separated account IDs (overrides discovery)")
|
78
|
+
@click.option("--all", "all_accounts", is_flag=True, help="Assess all discovered accounts via Organizations API")
|
79
|
+
@click.option("--scope", type=click.Choice(["full", "quick", "critical"]), default="full", help="Assessment scope")
|
106
80
|
@click.option(
|
107
81
|
"--export-formats",
|
108
82
|
multiple=True,
|
109
83
|
type=click.Choice(["json", "csv", "html", "pdf"]),
|
110
84
|
default=["json", "csv"],
|
111
|
-
help="Export formats for compliance reports"
|
85
|
+
help="Export formats for compliance reports",
|
112
86
|
)
|
113
87
|
@click.pass_context
|
114
|
-
def assess(
|
88
|
+
def assess(
|
89
|
+
ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bool, scope: str, export_formats: List[str]
|
90
|
+
):
|
115
91
|
"""
|
116
92
|
Execute comprehensive compliance assessment with dynamic configuration.
|
117
|
-
|
93
|
+
|
118
94
|
Environment Variables Supported:
|
119
95
|
- COMPLIANCE_TARGET_ACCOUNTS: Comma-separated account IDs
|
120
96
|
- COMPLIANCE_ACCOUNTS_CONFIG: Path to accounts configuration file
|
@@ -123,7 +99,7 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
|
|
123
99
|
"""
|
124
100
|
profile = ctx.obj["profile"]
|
125
101
|
output_dir = ctx.obj["output_dir"]
|
126
|
-
|
102
|
+
|
127
103
|
try:
|
128
104
|
# Convert framework names to enum values
|
129
105
|
framework_mapping = {
|
@@ -135,9 +111,9 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
|
|
135
111
|
"nist-cybersecurity": ComplianceFramework.NIST_CYBERSECURITY,
|
136
112
|
"cis-benchmarks": ComplianceFramework.CIS_BENCHMARKS,
|
137
113
|
}
|
138
|
-
|
114
|
+
|
139
115
|
selected_frameworks = [framework_mapping[f] for f in frameworks]
|
140
|
-
|
116
|
+
|
141
117
|
# Parse target accounts
|
142
118
|
target_accounts = None
|
143
119
|
if accounts:
|
@@ -148,7 +124,7 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
|
|
148
124
|
# target_accounts will be None, triggering discovery
|
149
125
|
else:
|
150
126
|
print_info("Using default account discovery")
|
151
|
-
|
127
|
+
|
152
128
|
# Initialize compliance engine
|
153
129
|
console.print(
|
154
130
|
create_panel(
|
@@ -161,55 +137,47 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
|
|
161
137
|
border_style="cyan",
|
162
138
|
)
|
163
139
|
)
|
164
|
-
|
165
|
-
compliance_engine = ComplianceAutomationEngine(
|
166
|
-
|
167
|
-
output_dir=output_dir
|
168
|
-
)
|
169
|
-
|
140
|
+
|
141
|
+
compliance_engine = ComplianceAutomationEngine(profile=profile, output_dir=output_dir)
|
142
|
+
|
170
143
|
# Execute assessment
|
171
|
-
reports = asyncio.run(
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
)
|
176
|
-
|
144
|
+
reports = asyncio.run(
|
145
|
+
compliance_engine.assess_compliance(
|
146
|
+
frameworks=selected_frameworks, target_accounts=target_accounts, scope=scope
|
147
|
+
)
|
148
|
+
)
|
149
|
+
|
177
150
|
# Display summary
|
178
151
|
print_success(f"Assessment completed! Generated {len(reports)} compliance reports")
|
179
152
|
print_info(f"Reports saved to: {output_dir}")
|
180
|
-
|
153
|
+
|
181
154
|
# Display configuration sources used
|
182
155
|
_display_configuration_sources()
|
183
|
-
|
156
|
+
|
184
157
|
except Exception as e:
|
185
158
|
print_error(f"Compliance assessment failed: {str(e)}")
|
186
159
|
raise click.Abort()
|
187
160
|
|
188
161
|
|
189
162
|
@security.command()
|
163
|
+
@click.option("--language", type=click.Choice(["en", "ja", "ko", "vi"]), default="en", help="Report language")
|
190
164
|
@click.option(
|
191
|
-
"--
|
192
|
-
type=click.Choice(["en", "ja", "ko", "vi"]),
|
193
|
-
default="en",
|
194
|
-
help="Report language"
|
195
|
-
)
|
196
|
-
@click.option(
|
197
|
-
"--export-formats",
|
165
|
+
"--export-formats",
|
198
166
|
multiple=True,
|
199
167
|
type=click.Choice(["json", "csv", "html", "pdf"]),
|
200
168
|
default=["json", "csv"],
|
201
|
-
help="Export formats for security reports"
|
169
|
+
help="Export formats for security reports",
|
202
170
|
)
|
203
171
|
@click.pass_context
|
204
172
|
def baseline(ctx, language: str, export_formats: List[str]):
|
205
173
|
"""
|
206
174
|
Execute security baseline assessment with dynamic configuration.
|
207
|
-
|
175
|
+
|
208
176
|
Uses enterprise profile management and configuration-driven approach.
|
209
177
|
"""
|
210
178
|
profile = ctx.obj["profile"]
|
211
179
|
output_dir = ctx.obj["output_dir"]
|
212
|
-
|
180
|
+
|
213
181
|
try:
|
214
182
|
console.print(
|
215
183
|
create_panel(
|
@@ -221,21 +189,18 @@ def baseline(ctx, language: str, export_formats: List[str]):
|
|
221
189
|
border_style="green",
|
222
190
|
)
|
223
191
|
)
|
224
|
-
|
192
|
+
|
225
193
|
# Initialize security baseline tester
|
226
194
|
baseline_tester = SecurityBaselineTester(
|
227
|
-
profile=profile,
|
228
|
-
lang_code=language,
|
229
|
-
output_dir=output_dir,
|
230
|
-
export_formats=list(export_formats)
|
195
|
+
profile=profile, lang_code=language, output_dir=output_dir, export_formats=list(export_formats)
|
231
196
|
)
|
232
|
-
|
197
|
+
|
233
198
|
# Execute baseline assessment
|
234
199
|
baseline_tester.run()
|
235
|
-
|
200
|
+
|
236
201
|
print_success("Security baseline assessment completed successfully!")
|
237
202
|
print_info(f"Results saved to: {output_dir}")
|
238
|
-
|
203
|
+
|
239
204
|
except Exception as e:
|
240
205
|
print_error(f"Security baseline assessment failed: {str(e)}")
|
241
206
|
raise click.Abort()
|
@@ -247,16 +212,11 @@ def config_info(ctx):
|
|
247
212
|
"""
|
248
213
|
Display current security configuration and environment setup.
|
249
214
|
"""
|
250
|
-
console.print(
|
251
|
-
|
252
|
-
"[bold cyan]Security Configuration Information[/bold cyan]",
|
253
|
-
border_style="cyan"
|
254
|
-
)
|
255
|
-
)
|
256
|
-
|
215
|
+
console.print(Panel.fit("[bold cyan]Security Configuration Information[/bold cyan]", border_style="cyan"))
|
216
|
+
|
257
217
|
# Display environment variables
|
258
218
|
print_info("Environment Configuration:")
|
259
|
-
|
219
|
+
|
260
220
|
env_vars = {
|
261
221
|
"Profile Configuration": {
|
262
222
|
"MANAGEMENT_PROFILE": os.getenv("MANAGEMENT_PROFILE", "Not set"),
|
@@ -272,22 +232,22 @@ def config_info(ctx):
|
|
272
232
|
"Remediation Configuration": {
|
273
233
|
"REMEDIATION_TARGET_ACCOUNTS": os.getenv("REMEDIATION_TARGET_ACCOUNTS", "Not set"),
|
274
234
|
"REMEDIATION_ACCOUNT_CONFIG": os.getenv("REMEDIATION_ACCOUNT_CONFIG", "Not set"),
|
275
|
-
}
|
235
|
+
},
|
276
236
|
}
|
277
|
-
|
237
|
+
|
278
238
|
for category, variables in env_vars.items():
|
279
239
|
console.print(f"\n[bold]{category}:[/bold]")
|
280
240
|
for var_name, var_value in variables.items():
|
281
241
|
status = "✅" if var_value != "Not set" else "❌"
|
282
242
|
console.print(f" {status} {var_name}: {var_value}")
|
283
|
-
|
243
|
+
|
284
244
|
# Display example configuration files
|
285
245
|
console.print("\n[bold]Example Configuration Files:[/bold]")
|
286
246
|
config_examples = [
|
287
247
|
"src/runbooks/security/config/compliance_weights_example.json",
|
288
|
-
"src/runbooks/remediation/config/accounts_example.json"
|
248
|
+
"src/runbooks/remediation/config/accounts_example.json",
|
289
249
|
]
|
290
|
-
|
250
|
+
|
291
251
|
for config_file in config_examples:
|
292
252
|
if os.path.exists(config_file):
|
293
253
|
console.print(f" ✅ {config_file}")
|
@@ -298,80 +258,151 @@ def config_info(ctx):
|
|
298
258
|
def _display_configuration_sources():
|
299
259
|
"""Display information about configuration sources used."""
|
300
260
|
console.print("\n[bold]Configuration Sources:[/bold]")
|
301
|
-
|
261
|
+
|
302
262
|
# Check environment variables
|
303
263
|
if os.getenv("COMPLIANCE_TARGET_ACCOUNTS"):
|
304
264
|
console.print(" ✅ Using COMPLIANCE_TARGET_ACCOUNTS environment variable")
|
305
|
-
|
265
|
+
|
306
266
|
if os.getenv("COMPLIANCE_ACCOUNTS_CONFIG"):
|
307
267
|
config_path = os.getenv("COMPLIANCE_ACCOUNTS_CONFIG")
|
308
268
|
if os.path.exists(config_path):
|
309
269
|
console.print(f" ✅ Using accounts config file: {config_path}")
|
310
270
|
else:
|
311
271
|
console.print(f" ⚠️ Accounts config file not found: {config_path}")
|
312
|
-
|
272
|
+
|
313
273
|
if os.getenv("COMPLIANCE_WEIGHTS_CONFIG"):
|
314
274
|
config_path = os.getenv("COMPLIANCE_WEIGHTS_CONFIG")
|
315
275
|
if os.path.exists(config_path):
|
316
276
|
console.print(f" ✅ Using compliance weights config: {config_path}")
|
317
277
|
else:
|
318
278
|
console.print(f" ⚠️ Compliance weights config not found: {config_path}")
|
319
|
-
|
279
|
+
|
320
280
|
# Check for dynamic control weights
|
321
281
|
weight_vars = [var for var in os.environ.keys() if var.startswith("COMPLIANCE_WEIGHT_")]
|
322
282
|
if weight_vars:
|
323
283
|
console.print(f" ✅ Using {len(weight_vars)} dynamic control weights")
|
324
|
-
|
284
|
+
|
325
285
|
# Check for dynamic thresholds
|
326
286
|
threshold_vars = [var for var in os.environ.keys() if var.startswith("COMPLIANCE_THRESHOLD_")]
|
327
287
|
if threshold_vars:
|
328
288
|
console.print(f" ✅ Using {len(threshold_vars)} dynamic framework thresholds")
|
329
|
-
|
330
|
-
if not any(
|
331
|
-
os.getenv("COMPLIANCE_TARGET_ACCOUNTS"),
|
332
|
-
|
333
|
-
weight_vars,
|
334
|
-
threshold_vars
|
335
|
-
]):
|
289
|
+
|
290
|
+
if not any(
|
291
|
+
[os.getenv("COMPLIANCE_TARGET_ACCOUNTS"), os.getenv("COMPLIANCE_ACCOUNTS_CONFIG"), weight_vars, threshold_vars]
|
292
|
+
):
|
336
293
|
console.print(" ℹ️ Using default configuration (Organizations API discovery)")
|
337
294
|
|
338
295
|
|
296
|
+
@security.command("2way-validate")
|
297
|
+
@click.option("--profile", default="ams-admin-ReadOnlyAccess-909135376185", help="AWS profile for validation testing")
|
298
|
+
@click.option(
|
299
|
+
"--certification-required", is_flag=True, help="Require production certification (≥97% combined accuracy)"
|
300
|
+
)
|
301
|
+
@click.pass_context
|
302
|
+
def two_way_validate(ctx, profile: str, certification_required: bool):
|
303
|
+
"""
|
304
|
+
Execute comprehensive 2-Way Validation Framework for production readiness.
|
305
|
+
|
306
|
+
Combines Playwright MCP (UI/browser testing) with AWS MCP (real API validation)
|
307
|
+
to achieve ≥97% combined accuracy for enterprise production deployment.
|
308
|
+
|
309
|
+
**SECURITY VALIDATION SCOPE**:
|
310
|
+
- Playwright MCP: >98% browser testing success rate
|
311
|
+
- AWS MCP: >97.5% real AWS API validation accuracy
|
312
|
+
- Combined Accuracy: ≥97% overall validation requirement
|
313
|
+
- Enterprise Compliance: Audit trail and production certification
|
314
|
+
"""
|
315
|
+
try:
|
316
|
+
console.print(
|
317
|
+
create_panel(
|
318
|
+
f"[bold cyan]🚨 Enterprise 2-Way Validation Framework[/bold cyan]\n\n"
|
319
|
+
f"[dim]Profile: {profile}[/dim]\n"
|
320
|
+
f"[dim]Certification Required: {'Yes' if certification_required else 'No'}[/dim]\n"
|
321
|
+
f"[dim]Target Accuracy: ≥97% Combined[/dim]",
|
322
|
+
title="🛡️ Security Validation Execution",
|
323
|
+
border_style="cyan",
|
324
|
+
)
|
325
|
+
)
|
326
|
+
|
327
|
+
print_info("🚀 Initiating comprehensive 2-way validation framework...")
|
328
|
+
|
329
|
+
# Execute 2-way validation
|
330
|
+
results = asyncio.run(execute_2way_validation(profile))
|
331
|
+
|
332
|
+
# Display results
|
333
|
+
certification_status = results["overall_status"]
|
334
|
+
combined_accuracy = results["combined_accuracy"]["combined_accuracy"]
|
335
|
+
|
336
|
+
if certification_status == "CERTIFIED":
|
337
|
+
print_success(f"🏆 2-Way Validation: PRODUCTION CERTIFIED")
|
338
|
+
print_success(f"📊 Combined Accuracy: {combined_accuracy * 100:.1f}%")
|
339
|
+
else:
|
340
|
+
print_warning(f"⚠️ 2-Way Validation: REQUIRES REVIEW")
|
341
|
+
print_warning(f"📊 Combined Accuracy: {combined_accuracy * 100:.1f}%")
|
342
|
+
|
343
|
+
# Display detailed metrics
|
344
|
+
playwright_success = results["playwright_validation"]["success_rate"]
|
345
|
+
aws_mcp_accuracy = results["aws_mcp_validation"]["accuracy_rate"]
|
346
|
+
compliance_score = results["enterprise_compliance"]["compliance_score"]
|
347
|
+
|
348
|
+
console.print(f"\n[bold cyan]Validation Metrics:[/bold cyan]")
|
349
|
+
console.print(f"🎭 Playwright Success Rate: {playwright_success * 100:.1f}%")
|
350
|
+
console.print(f"☁️ AWS MCP Accuracy Rate: {aws_mcp_accuracy * 100:.1f}%")
|
351
|
+
console.print(f"🏢 Enterprise Compliance Score: {compliance_score * 100:.1f}%")
|
352
|
+
|
353
|
+
# Handle certification requirements
|
354
|
+
if certification_required and certification_status != "CERTIFIED":
|
355
|
+
print_error("❌ Production certification required but not achieved")
|
356
|
+
|
357
|
+
if results["recommendations"]:
|
358
|
+
console.print(f"\n[bold yellow]Recommendations:[/bold yellow]")
|
359
|
+
for recommendation in results["recommendations"]:
|
360
|
+
console.print(f"• {recommendation}")
|
361
|
+
|
362
|
+
raise click.Abort()
|
363
|
+
|
364
|
+
print_success("✅ 2-Way Validation Framework execution completed")
|
365
|
+
print_info(f"📁 Evidence package saved to: ./artifacts/2way_validation_evidence/")
|
366
|
+
|
367
|
+
except Exception as e:
|
368
|
+
print_error(f"2-Way validation failed: {str(e)}")
|
369
|
+
raise click.Abort()
|
370
|
+
|
371
|
+
|
339
372
|
@security.command("generate-config")
|
340
373
|
@click.option(
|
341
|
-
"--output-dir",
|
342
|
-
default="./artifacts/security/config",
|
343
|
-
help="Output directory for configuration templates"
|
374
|
+
"--output-dir", default="./artifacts/security/config", help="Output directory for configuration templates"
|
344
375
|
)
|
345
376
|
@click.pass_context
|
346
377
|
def generate_config_templates(ctx, output_dir: str):
|
347
378
|
"""
|
348
379
|
Generate universal configuration templates for security operations.
|
349
|
-
|
380
|
+
|
350
381
|
Creates templates for:
|
351
382
|
- Compliance weights and thresholds
|
352
383
|
- Account discovery configuration
|
353
384
|
- Environment variable examples
|
354
385
|
- Complete setup documentation
|
355
|
-
|
386
|
+
|
356
387
|
All templates support universal AWS compatibility with no hardcoded values.
|
357
388
|
"""
|
358
389
|
print_info(f"Generating universal security configuration templates in {output_dir}...")
|
359
|
-
|
390
|
+
|
360
391
|
try:
|
361
392
|
generator = SecurityConfigTemplateGenerator(output_dir)
|
362
393
|
generator.generate_all_templates()
|
363
|
-
|
394
|
+
|
364
395
|
print_success("Configuration templates generated successfully!")
|
365
396
|
console.print("\n[bold yellow]Next steps:[/bold yellow]")
|
366
397
|
console.print("1. Review and customize the generated configuration files")
|
367
398
|
console.print("2. Set environment variables or copy configuration files to your preferred location")
|
368
399
|
console.print("3. Run: runbooks security assess --help")
|
369
|
-
console.print("4. Run: runbooks
|
370
|
-
|
400
|
+
console.print("4. Run: runbooks security 2way-validate --help")
|
401
|
+
|
371
402
|
except Exception as e:
|
372
403
|
print_error(f"Failed to generate configuration templates: {e}")
|
373
404
|
raise click.Abort()
|
374
405
|
|
375
406
|
|
376
407
|
if __name__ == "__main__":
|
377
|
-
security()
|
408
|
+
security()
|