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.
@@ -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.0"
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
- const cells = row.querySelectorAll('th, td');
1482
- const rowData = Array.from(cells).map(cell =>
1483
- '"' + cell.textContent.replace(/"/g, '""') + '"'
1484
- ).join(',');
1485
- csvContent += rowData + '\\n';
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
- return priority.lower()
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: Our weighted compliance 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 (Our Approach)</h4>
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. Reflects actual security posture.
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aws-cis-controls-assessment
3
- Version: 1.1.0
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>
@@ -1,4 +1,4 @@
1
- aws_cis_assessment/__init__.py,sha256=9OlnlIo1cWbCTuav3NJ9LOgo_ixBbsyKL75BIw2kjoM,480
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=vnTP831t4I1G763ZmWqtvoKXzecJOVxnH8q_DRD--qs,118917
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.0.dist-info/licenses/LICENSE,sha256=T_p0qKH4RoI3ejr3tktf3rx2Zart_9KeUmJd5iiqXW8,1079
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.0.dist-info/METADATA,sha256=OlnrvuCgBP2cPn7l8YQjw2TCf4d715qpQ8C8gyX8GcY,21383
84
- aws_cis_controls_assessment-1.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
85
- aws_cis_controls_assessment-1.1.0.dist-info/entry_points.txt,sha256=-AxPn5Y7yau0pQh33F5_uyWfvcnm2Kg1_nMQuLrZ7SY,68
86
- aws_cis_controls_assessment-1.1.0.dist-info/top_level.txt,sha256=4OHmV6RAEWkz-Se50kfmuGCd-mUSotDZz3iLGF9CmkI,44
87
- aws_cis_controls_assessment-1.1.0.dist-info/RECORD,,
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,,