aws-cis-controls-assessment 1.1.0__py3-none-any.whl → 1.1.1__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.
- aws_cis_assessment/__init__.py +1 -1
- aws_cis_assessment/reporters/html_reporter.py +85 -95
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/METADATA +1 -1
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/RECORD +8 -8
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/WHEEL +0 -0
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/entry_points.txt +0 -0
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/licenses/LICENSE +0 -0
- {aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/top_level.txt +0 -0
aws_cis_assessment/__init__.py
CHANGED
|
@@ -6,6 +6,6 @@ CIS Controls Implementation Groups (IG1, IG2, IG3). Implements 163 comprehensive
|
|
|
6
6
|
across all implementation groups for complete security compliance assessment.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
__version__ = "1.1.
|
|
9
|
+
__version__ = "1.1.1"
|
|
10
10
|
__author__ = "AWS CIS Assessment Team"
|
|
11
11
|
__description__ = "Production-ready AWS CIS Controls Compliance Assessment Framework"
|
|
@@ -771,6 +771,30 @@ class HTMLReporter(ReportGenerator):
|
|
|
771
771
|
background-color: #2c3e50;
|
|
772
772
|
}
|
|
773
773
|
|
|
774
|
+
/* Resource ID column width constraint */
|
|
775
|
+
.resource-table td:first-child {
|
|
776
|
+
max-width: 200px;
|
|
777
|
+
overflow: hidden;
|
|
778
|
+
text-overflow: ellipsis;
|
|
779
|
+
white-space: nowrap;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
.resource-table td:first-child:hover {
|
|
783
|
+
overflow: visible;
|
|
784
|
+
white-space: normal;
|
|
785
|
+
word-wrap: break-word;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
/* Visual frames around each resource row */
|
|
789
|
+
.resource-row {
|
|
790
|
+
border: 1px solid #e0e0e0;
|
|
791
|
+
border-radius: 4px;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
.resource-row:hover {
|
|
795
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
796
|
+
}
|
|
797
|
+
|
|
774
798
|
.resource-row.compliant {
|
|
775
799
|
background-color: #f8fff8;
|
|
776
800
|
}
|
|
@@ -1262,56 +1286,6 @@ class HTMLReporter(ReportGenerator):
|
|
|
1262
1286
|
return;
|
|
1263
1287
|
}}
|
|
1264
1288
|
|
|
1265
|
-
// Implementation Groups Compliance Chart
|
|
1266
|
-
const igChartCtx = document.getElementById('igComplianceChart');
|
|
1267
|
-
if (igChartCtx) {{
|
|
1268
|
-
new Chart(igChartCtx, {{
|
|
1269
|
-
type: 'doughnut',
|
|
1270
|
-
data: chartData.igCompliance,
|
|
1271
|
-
options: {{
|
|
1272
|
-
responsive: true,
|
|
1273
|
-
maintainAspectRatio: false,
|
|
1274
|
-
plugins: {{
|
|
1275
|
-
legend: {{
|
|
1276
|
-
position: 'bottom'
|
|
1277
|
-
}},
|
|
1278
|
-
title: {{
|
|
1279
|
-
display: true,
|
|
1280
|
-
text: 'Implementation Groups Compliance'
|
|
1281
|
-
}}
|
|
1282
|
-
}}
|
|
1283
|
-
}}
|
|
1284
|
-
}});
|
|
1285
|
-
}}
|
|
1286
|
-
|
|
1287
|
-
// Overall Compliance Trend Chart
|
|
1288
|
-
const trendChartCtx = document.getElementById('complianceTrendChart');
|
|
1289
|
-
if (trendChartCtx) {{
|
|
1290
|
-
new Chart(trendChartCtx, {{
|
|
1291
|
-
type: 'bar',
|
|
1292
|
-
data: chartData.complianceTrend,
|
|
1293
|
-
options: {{
|
|
1294
|
-
responsive: true,
|
|
1295
|
-
maintainAspectRatio: false,
|
|
1296
|
-
scales: {{
|
|
1297
|
-
y: {{
|
|
1298
|
-
beginAtZero: true,
|
|
1299
|
-
max: 100
|
|
1300
|
-
}}
|
|
1301
|
-
}},
|
|
1302
|
-
plugins: {{
|
|
1303
|
-
legend: {{
|
|
1304
|
-
display: false
|
|
1305
|
-
}},
|
|
1306
|
-
title: {{
|
|
1307
|
-
display: true,
|
|
1308
|
-
text: 'Compliance by Implementation Group'
|
|
1309
|
-
}}
|
|
1310
|
-
}}
|
|
1311
|
-
}}
|
|
1312
|
-
}});
|
|
1313
|
-
}}
|
|
1314
|
-
|
|
1315
1289
|
// Risk Distribution Chart
|
|
1316
1290
|
const riskChartCtx = document.getElementById('riskDistributionChart');
|
|
1317
1291
|
if (riskChartCtx) {{
|
|
@@ -1474,17 +1448,34 @@ class HTMLReporter(ReportGenerator):
|
|
|
1474
1448
|
function exportToCSV() {{
|
|
1475
1449
|
const tables = document.querySelectorAll('.findings-table');
|
|
1476
1450
|
let csvContent = '';
|
|
1451
|
+
let headersAdded = false;
|
|
1477
1452
|
|
|
1478
1453
|
tables.forEach(function(table) {{
|
|
1479
1454
|
const rows = table.querySelectorAll('tr');
|
|
1480
|
-
rows.forEach(function(row) {{
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1455
|
+
rows.forEach(function(row, index) {{
|
|
1456
|
+
// Add headers only once (from first table)
|
|
1457
|
+
if (index === 0) {{
|
|
1458
|
+
if (!headersAdded) {{
|
|
1459
|
+
const cells = row.querySelectorAll('th');
|
|
1460
|
+
if (cells.length > 0) {{
|
|
1461
|
+
const rowData = Array.from(cells).map(cell =>
|
|
1462
|
+
'"' + cell.textContent.replace(/"/g, '""') + '"'
|
|
1463
|
+
).join(',');
|
|
1464
|
+
csvContent += rowData + '\\n';
|
|
1465
|
+
headersAdded = true;
|
|
1466
|
+
}}
|
|
1467
|
+
}}
|
|
1468
|
+
}} else {{
|
|
1469
|
+
// Add data rows (skip header rows from subsequent tables)
|
|
1470
|
+
const cells = row.querySelectorAll('td');
|
|
1471
|
+
if (cells.length > 0) {{
|
|
1472
|
+
const rowData = Array.from(cells).map(cell =>
|
|
1473
|
+
'"' + cell.textContent.replace(/"/g, '""') + '"'
|
|
1474
|
+
).join(',');
|
|
1475
|
+
csvContent += rowData + '\\n';
|
|
1476
|
+
}}
|
|
1477
|
+
}}
|
|
1486
1478
|
}});
|
|
1487
|
-
csvContent += '\\n';
|
|
1488
1479
|
}});
|
|
1489
1480
|
|
|
1490
1481
|
const blob = new Blob([csvContent], {{ type: 'text/csv' }});
|
|
@@ -1657,6 +1648,9 @@ class HTMLReporter(ReportGenerator):
|
|
|
1657
1648
|
def _generate_executive_dashboard(self, html_data: Dict[str, Any]) -> str:
|
|
1658
1649
|
"""Generate executive dashboard section.
|
|
1659
1650
|
|
|
1651
|
+
Modified in v1.1.1 to remove pie chart (igComplianceChart) and bar chart
|
|
1652
|
+
(complianceTrendChart), keeping only risk distribution chart.
|
|
1653
|
+
|
|
1660
1654
|
Args:
|
|
1661
1655
|
html_data: Enhanced HTML report data
|
|
1662
1656
|
|
|
@@ -1731,12 +1725,6 @@ class HTMLReporter(ReportGenerator):
|
|
|
1731
1725
|
if self.include_charts:
|
|
1732
1726
|
charts_section = f"""
|
|
1733
1727
|
<div class="charts-section">
|
|
1734
|
-
<div class="chart-container">
|
|
1735
|
-
<canvas id="igComplianceChart"></canvas>
|
|
1736
|
-
</div>
|
|
1737
|
-
<div class="chart-container">
|
|
1738
|
-
<canvas id="complianceTrendChart"></canvas>
|
|
1739
|
-
</div>
|
|
1740
1728
|
<div class="chart-container">
|
|
1741
1729
|
<canvas id="riskDistributionChart"></canvas>
|
|
1742
1730
|
</div>
|
|
@@ -2196,8 +2184,33 @@ class HTMLReporter(ReportGenerator):
|
|
|
2196
2184
|
return "low"
|
|
2197
2185
|
|
|
2198
2186
|
def _get_priority_badge(self, priority: str) -> str:
|
|
2199
|
-
"""Get priority badge class.
|
|
2200
|
-
|
|
2187
|
+
"""Get priority badge class ensuring single value.
|
|
2188
|
+
|
|
2189
|
+
Modified in v1.1.1 to normalize priority values and handle duplicates.
|
|
2190
|
+
Fixes issues like "High High" → "high" and "High Medium" → "high".
|
|
2191
|
+
|
|
2192
|
+
Args:
|
|
2193
|
+
priority: Priority string (may contain multiple values like "High High" or "High Medium")
|
|
2194
|
+
|
|
2195
|
+
Returns:
|
|
2196
|
+
Single priority class: 'high', 'medium', or 'low'
|
|
2197
|
+
"""
|
|
2198
|
+
# Extract first priority if multiple exist
|
|
2199
|
+
priority_lower = priority.lower().strip()
|
|
2200
|
+
|
|
2201
|
+
# Handle multiple priorities (take first one)
|
|
2202
|
+
if ' ' in priority_lower:
|
|
2203
|
+
priority_lower = priority_lower.split()[0]
|
|
2204
|
+
|
|
2205
|
+
# Normalize to standard values
|
|
2206
|
+
if 'high' in priority_lower:
|
|
2207
|
+
return 'high'
|
|
2208
|
+
elif 'medium' in priority_lower or 'med' in priority_lower:
|
|
2209
|
+
return 'medium'
|
|
2210
|
+
elif 'low' in priority_lower:
|
|
2211
|
+
return 'low'
|
|
2212
|
+
else:
|
|
2213
|
+
return 'medium' # Default fallback
|
|
2201
2214
|
|
|
2202
2215
|
def _get_effort_badge(self, effort: str) -> str:
|
|
2203
2216
|
"""Get effort badge class."""
|
|
@@ -2238,40 +2251,27 @@ class HTMLReporter(ReportGenerator):
|
|
|
2238
2251
|
score_diff: float) -> str:
|
|
2239
2252
|
"""Generate scoring methodology comparison section.
|
|
2240
2253
|
|
|
2254
|
+
Modified in v1.1.1 to remove "our approach" phrase, "Reflects actual security
|
|
2255
|
+
posture" text, and score difference warning for cleaner presentation.
|
|
2256
|
+
|
|
2241
2257
|
Args:
|
|
2242
|
-
weighted_score:
|
|
2258
|
+
weighted_score: Weighted compliance score
|
|
2243
2259
|
aws_config_score: AWS Config Conformance Pack style score
|
|
2244
|
-
score_diff: Difference between the two scores
|
|
2260
|
+
score_diff: Difference between the two scores (not displayed)
|
|
2245
2261
|
|
|
2246
2262
|
Returns:
|
|
2247
2263
|
HTML section comparing the two scoring approaches
|
|
2248
2264
|
"""
|
|
2249
|
-
# Determine interpretation based on difference
|
|
2250
|
-
if abs(score_diff) < 1.0:
|
|
2251
|
-
interpretation = "Both scoring approaches show similar results, indicating balanced compliance across all control priorities."
|
|
2252
|
-
icon = "ℹ️"
|
|
2253
|
-
diff_class = "neutral"
|
|
2254
|
-
elif score_diff < 0:
|
|
2255
|
-
# Weighted score is lower
|
|
2256
|
-
interpretation = f"The weighted score is {abs(score_diff):.1f}% lower, indicating critical security controls need attention despite good overall resource compliance."
|
|
2257
|
-
icon = "⚠️"
|
|
2258
|
-
diff_class = "warning"
|
|
2259
|
-
else:
|
|
2260
|
-
# Weighted score is higher
|
|
2261
|
-
interpretation = f"The weighted score is {score_diff:.1f}% higher, indicating strong performance in critical security controls despite some gaps in less critical areas."
|
|
2262
|
-
icon = "✓"
|
|
2263
|
-
diff_class = "positive"
|
|
2264
|
-
|
|
2265
2265
|
return f"""
|
|
2266
2266
|
<div class="score-comparison-section">
|
|
2267
2267
|
<h3>Scoring Methodology Comparison</h3>
|
|
2268
2268
|
<div class="comparison-grid">
|
|
2269
2269
|
<div class="comparison-card">
|
|
2270
|
-
<h4>Weighted Score
|
|
2270
|
+
<h4>Weighted Score</h4>
|
|
2271
2271
|
<div class="comparison-value">{weighted_score:.1f}%</div>
|
|
2272
2272
|
<p class="comparison-description">
|
|
2273
2273
|
Uses risk-based weighting where critical controls (encryption, access control)
|
|
2274
|
-
have higher impact on the overall score.
|
|
2274
|
+
have higher impact on the overall score.
|
|
2275
2275
|
</p>
|
|
2276
2276
|
<ul class="comparison-features">
|
|
2277
2277
|
<li>✓ Prioritizes critical security controls</li>
|
|
@@ -2294,16 +2294,6 @@ class HTMLReporter(ReportGenerator):
|
|
|
2294
2294
|
</ul>
|
|
2295
2295
|
</div>
|
|
2296
2296
|
</div>
|
|
2297
|
-
|
|
2298
|
-
<div class="score-difference {diff_class}">
|
|
2299
|
-
<span class="diff-icon">{icon}</span>
|
|
2300
|
-
<div class="diff-content">
|
|
2301
|
-
<strong>Score Difference: {score_diff:+.1f}%</strong>
|
|
2302
|
-
<p>{interpretation}</p>
|
|
2303
|
-
</div>
|
|
2304
|
-
</div>
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
2297
|
</div>
|
|
2308
2298
|
"""
|
|
2309
2299
|
|
{aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aws-cis-controls-assessment
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: Production-ready AWS CIS Controls compliance assessment framework with 145 comprehensive rules
|
|
5
5
|
Author-email: AWS CIS Assessment Team <security@example.com>
|
|
6
6
|
Maintainer-email: AWS CIS Assessment Team <security@example.com>
|
{aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/RECORD
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
aws_cis_assessment/__init__.py,sha256=
|
|
1
|
+
aws_cis_assessment/__init__.py,sha256=ICafcznKTUU2j4VAbZ6-yjWXSQZGQRYzpzY7NIZ_23U,480
|
|
2
2
|
aws_cis_assessment/cli/__init__.py,sha256=DYaGVAIoy5ucs9ubKQxX6Z3ZD46AGz9AaIaDQXzrzeY,100
|
|
3
3
|
aws_cis_assessment/cli/examples.py,sha256=F9K2Fe297kUfwoq6Ine9Aj_IXNU-KwO9hd7SAPWeZHI,12884
|
|
4
4
|
aws_cis_assessment/cli/main.py,sha256=i5QoqHXsPG_Kw0W7jM3Zj2YaAaCJnxxnfz82QBBHq-U,49441
|
|
@@ -63,9 +63,9 @@ aws_cis_assessment/core/scoring_engine.py,sha256=ylx2urk_DxGzU_LZB0ip-qtUzOh4yu0
|
|
|
63
63
|
aws_cis_assessment/reporters/__init__.py,sha256=GXdlY08kKy1Y3mMBv8Y0JuUB69u--e5DIu2jNJpc6QI,357
|
|
64
64
|
aws_cis_assessment/reporters/base_reporter.py,sha256=joy_O4IL4Hs_qwAuPtl81GIPxLAbUAMFKiF8r5si2aw,18082
|
|
65
65
|
aws_cis_assessment/reporters/csv_reporter.py,sha256=r83xzfP1t5AO9MfKawgN4eTeOU6eGZwJQgvNDLEd7NI,31419
|
|
66
|
-
aws_cis_assessment/reporters/html_reporter.py,sha256=
|
|
66
|
+
aws_cis_assessment/reporters/html_reporter.py,sha256=H5LkcaXbzArNNO-CLJT5oXMSNccxU58L-ba_Q769Yhs,118310
|
|
67
67
|
aws_cis_assessment/reporters/json_reporter.py,sha256=MObCzTc9nlGTEXeWc7P8tTMeKCpEaJNfcSYc79cHXhc,22250
|
|
68
|
-
aws_cis_controls_assessment-1.1.
|
|
68
|
+
aws_cis_controls_assessment-1.1.1.dist-info/licenses/LICENSE,sha256=T_p0qKH4RoI3ejr3tktf3rx2Zart_9KeUmJd5iiqXW8,1079
|
|
69
69
|
deprecation-package/aws_cis_assessment_deprecated/__init__.py,sha256=WOaufqanKNhvWQ3frj8e627tS_kZnyk2R2hwqPFqydw,1892
|
|
70
70
|
docs/README.md,sha256=MXnfbPRmxir-7ihG2lNmLI9TJG0Pp0QWqoDZtXiH_Mk,4912
|
|
71
71
|
docs/adding-aws-backup-controls.md,sha256=l_H0H8W71n-6NbeplNujC_li2NiaQcYPr0hQMhEPbrc,21081
|
|
@@ -80,8 +80,8 @@ docs/scoring-comparison-aws-config.md,sha256=8BBe1tQsaAT0BAE3OdGIRFjuT1VJcOlM1qB
|
|
|
80
80
|
docs/scoring-methodology.md,sha256=C86FisBxKt6pyr-Kp6rAVPz45yPZpgsGibjgq8obIsg,9404
|
|
81
81
|
docs/troubleshooting.md,sha256=mGmWgrc3A1dn-Uk_XxWFh04OQxjmqkeax8vQX7takg0,18220
|
|
82
82
|
docs/user-guide.md,sha256=lBDgU40tIPstOdNx4YqVkPTIDntn4o2y2tr2CPQt7b8,11942
|
|
83
|
-
aws_cis_controls_assessment-1.1.
|
|
84
|
-
aws_cis_controls_assessment-1.1.
|
|
85
|
-
aws_cis_controls_assessment-1.1.
|
|
86
|
-
aws_cis_controls_assessment-1.1.
|
|
87
|
-
aws_cis_controls_assessment-1.1.
|
|
83
|
+
aws_cis_controls_assessment-1.1.1.dist-info/METADATA,sha256=gXpUI7yboznt4qn6KmVKtKSZVVO9In29KhHqrokOqZo,21383
|
|
84
|
+
aws_cis_controls_assessment-1.1.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
85
|
+
aws_cis_controls_assessment-1.1.1.dist-info/entry_points.txt,sha256=-AxPn5Y7yau0pQh33F5_uyWfvcnm2Kg1_nMQuLrZ7SY,68
|
|
86
|
+
aws_cis_controls_assessment-1.1.1.dist-info/top_level.txt,sha256=4OHmV6RAEWkz-Se50kfmuGCd-mUSotDZz3iLGF9CmkI,44
|
|
87
|
+
aws_cis_controls_assessment-1.1.1.dist-info/RECORD,,
|
{aws_cis_controls_assessment-1.1.0.dist-info → aws_cis_controls_assessment-1.1.1.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|