aws-cis-controls-assessment 1.0.7__py3-none-any.whl → 1.0.9__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/controls/ig1/control_advanced_security.py +2 -2
- aws_cis_assessment/core/assessment_engine.py +4 -0
- aws_cis_assessment/core/models.py +1 -0
- aws_cis_assessment/core/scoring_engine.py +30 -0
- aws_cis_assessment/reporters/base_reporter.py +2 -0
- aws_cis_assessment/reporters/html_reporter.py +826 -45
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/METADATA +6 -1
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/RECORD +20 -16
- docs/README.md +1 -0
- docs/dual-scoring-implementation.md +303 -0
- docs/html-report-improvements.md +422 -0
- docs/installation.md +78 -27
- docs/scoring-comparison-aws-config.md +379 -0
- docs/scoring-methodology.md +350 -0
- docs/user-guide.md +7 -1
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/WHEEL +0 -0
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/entry_points.txt +0 -0
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/licenses/LICENSE +0 -0
- {aws_cis_controls_assessment-1.0.7.dist-info → aws_cis_controls_assessment-1.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# HTML Report Improvements Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The HTML reporter has been enhanced with improved readability features and reduced redundancy. This document describes the new features, display formats, and customization options.
|
|
6
|
+
|
|
7
|
+
## New Features
|
|
8
|
+
|
|
9
|
+
### 1. Control Display Names
|
|
10
|
+
|
|
11
|
+
Controls now show both the control ID and the AWS Config rule name together, making it easier to understand what each control checks.
|
|
12
|
+
|
|
13
|
+
**Display Format:**
|
|
14
|
+
- Without title: `{control_id}: {config_rule_name}`
|
|
15
|
+
- With title: `{control_id}: {title} ({config_rule_name})`
|
|
16
|
+
|
|
17
|
+
**Examples:**
|
|
18
|
+
```
|
|
19
|
+
1.5: root-account-hardware-mfa-enabled
|
|
20
|
+
2.1: IAM Password Policy (iam-password-policy)
|
|
21
|
+
3.3: cloudtrail-enabled
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Truncation:**
|
|
25
|
+
- Display names longer than 50 characters are truncated with ellipsis
|
|
26
|
+
- Full name appears in a tooltip on hover
|
|
27
|
+
- CSS class `.control-display-name.truncated` is applied
|
|
28
|
+
|
|
29
|
+
### 2. Unique Controls Per Implementation Group
|
|
30
|
+
|
|
31
|
+
Each Implementation Group section now shows only the controls unique to that level, eliminating duplication.
|
|
32
|
+
|
|
33
|
+
**Behavior:**
|
|
34
|
+
- **IG1**: Shows all foundational controls
|
|
35
|
+
- **IG2**: Shows only controls unique to IG2 (not in IG1)
|
|
36
|
+
- **IG3**: Shows only controls unique to IG3 (not in IG1 or IG2)
|
|
37
|
+
|
|
38
|
+
**Visual Indicators:**
|
|
39
|
+
- An explanation box clarifies that IGs are cumulative
|
|
40
|
+
- Each section header shows the count of unique controls
|
|
41
|
+
- Scope descriptions explain what each IG includes
|
|
42
|
+
|
|
43
|
+
**Example:**
|
|
44
|
+
```
|
|
45
|
+
IG1 - Essential Cyber Hygiene
|
|
46
|
+
Showing 58 foundational controls essential for all organizations.
|
|
47
|
+
|
|
48
|
+
IG2 - Enhanced Security (includes IG1)
|
|
49
|
+
Showing 74 additional controls beyond IG1 for enhanced security.
|
|
50
|
+
|
|
51
|
+
IG3 - Advanced Security (includes IG1 + IG2)
|
|
52
|
+
Showing 24 advanced controls beyond IG1 and IG2 for comprehensive security.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. IG Membership Badges
|
|
56
|
+
|
|
57
|
+
Controls display badges indicating which Implementation Groups include them.
|
|
58
|
+
|
|
59
|
+
**Badge Colors:**
|
|
60
|
+
- **IG1**: Blue (#3498db)
|
|
61
|
+
- **IG2**: Green (#27ae60)
|
|
62
|
+
- **IG3**: Purple (#9b59b6)
|
|
63
|
+
|
|
64
|
+
**Display Locations:**
|
|
65
|
+
- Implementation Groups section: Shows originating IG badge
|
|
66
|
+
- Detailed Findings section: Shows all IGs that include the control
|
|
67
|
+
|
|
68
|
+
**Example:**
|
|
69
|
+
```
|
|
70
|
+
Control: 1.5: root-account-hardware-mfa-enabled
|
|
71
|
+
Badges: [IG1] [IG2] [IG3] (appears in all three IGs)
|
|
72
|
+
|
|
73
|
+
Control: 5.2: encryption-at-rest-enabled
|
|
74
|
+
Badges: [IG2] [IG3] (appears only in IG2 and IG3)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 4. Consolidated Detailed Findings
|
|
78
|
+
|
|
79
|
+
The Detailed Findings section now groups findings by control ID only, eliminating duplication across IGs.
|
|
80
|
+
|
|
81
|
+
**Changes:**
|
|
82
|
+
- Removed "IG1 Detailed Findings", "IG2 Detailed Findings", "IG3 Detailed Findings" subsections
|
|
83
|
+
- Each control appears once with all its findings
|
|
84
|
+
- IG membership badges show which IGs include each control
|
|
85
|
+
- Findings are sorted alphanumerically by control ID
|
|
86
|
+
|
|
87
|
+
**Benefits:**
|
|
88
|
+
- Easier to remediate issues (each resource listed once)
|
|
89
|
+
- Clearer understanding of which IGs are affected
|
|
90
|
+
- Reduced report length and improved readability
|
|
91
|
+
|
|
92
|
+
## CSS Classes for Custom Styling
|
|
93
|
+
|
|
94
|
+
### IG Badge Classes
|
|
95
|
+
|
|
96
|
+
```css
|
|
97
|
+
/* IG1 badge - Blue */
|
|
98
|
+
.ig-badge-1 {
|
|
99
|
+
background-color: #3498db;
|
|
100
|
+
color: white;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* IG2 badge - Green */
|
|
104
|
+
.ig-badge-2 {
|
|
105
|
+
background-color: #27ae60;
|
|
106
|
+
color: white;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* IG3 badge - Purple */
|
|
110
|
+
.ig-badge-3 {
|
|
111
|
+
background-color: #9b59b6;
|
|
112
|
+
color: white;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Default badge for unknown IGs */
|
|
116
|
+
.ig-badge-default {
|
|
117
|
+
background-color: #95a5a6;
|
|
118
|
+
color: white;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Control Display Name Classes
|
|
123
|
+
|
|
124
|
+
```css
|
|
125
|
+
/* Control display name container */
|
|
126
|
+
.control-display-name {
|
|
127
|
+
font-weight: 600;
|
|
128
|
+
color: #2c3e50;
|
|
129
|
+
margin-bottom: 5px;
|
|
130
|
+
font-size: 0.95em;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* Truncated display names with tooltip */
|
|
134
|
+
.control-display-name.truncated {
|
|
135
|
+
overflow: hidden;
|
|
136
|
+
text-overflow: ellipsis;
|
|
137
|
+
white-space: nowrap;
|
|
138
|
+
cursor: help;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### IG Membership Badge Container
|
|
143
|
+
|
|
144
|
+
```css
|
|
145
|
+
/* Container for IG membership badges */
|
|
146
|
+
.ig-membership-badges {
|
|
147
|
+
display: flex;
|
|
148
|
+
gap: 5px;
|
|
149
|
+
margin-top: 5px;
|
|
150
|
+
margin-bottom: 10px;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* Individual IG membership badge */
|
|
154
|
+
.ig-membership-badge {
|
|
155
|
+
font-size: 0.7em;
|
|
156
|
+
padding: 2px 6px;
|
|
157
|
+
border-radius: 10px;
|
|
158
|
+
font-weight: bold;
|
|
159
|
+
text-transform: uppercase;
|
|
160
|
+
letter-spacing: 0.5px;
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### IG Explanation and Scope
|
|
165
|
+
|
|
166
|
+
```css
|
|
167
|
+
/* Informational box explaining IG cumulative nature */
|
|
168
|
+
.ig-explanation {
|
|
169
|
+
background-color: #e8f4fd;
|
|
170
|
+
border-left: 4px solid #3498db;
|
|
171
|
+
padding: 15px;
|
|
172
|
+
margin-bottom: 30px;
|
|
173
|
+
border-radius: 5px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Scope description for each IG section */
|
|
177
|
+
.ig-scope {
|
|
178
|
+
color: #666;
|
|
179
|
+
font-size: 0.9em;
|
|
180
|
+
margin-top: 5px;
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Customization Examples
|
|
185
|
+
|
|
186
|
+
### Change IG Badge Colors
|
|
187
|
+
|
|
188
|
+
To customize the IG badge colors, override the CSS classes:
|
|
189
|
+
|
|
190
|
+
```css
|
|
191
|
+
/* Custom color scheme */
|
|
192
|
+
.ig-badge-1 {
|
|
193
|
+
background-color: #e74c3c; /* Red for IG1 */
|
|
194
|
+
color: white;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.ig-badge-2 {
|
|
198
|
+
background-color: #f39c12; /* Orange for IG2 */
|
|
199
|
+
color: white;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.ig-badge-3 {
|
|
203
|
+
background-color: #9b59b6; /* Keep purple for IG3 */
|
|
204
|
+
color: white;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Adjust Truncation Threshold
|
|
209
|
+
|
|
210
|
+
The default truncation threshold is 50 characters. To change this, modify the `_enrich_control_metadata()` method:
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# In html_reporter.py
|
|
214
|
+
enriched['needs_truncation'] = len(enriched['display_name']) > 80 # Change to 80 characters
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Hide IG Badges
|
|
218
|
+
|
|
219
|
+
To hide IG badges in the report, add this CSS:
|
|
220
|
+
|
|
221
|
+
```css
|
|
222
|
+
.ig-membership-badges {
|
|
223
|
+
display: none;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Customize Control Card Layout
|
|
228
|
+
|
|
229
|
+
To adjust the control card layout:
|
|
230
|
+
|
|
231
|
+
```css
|
|
232
|
+
.control-card {
|
|
233
|
+
border: 2px solid #3498db; /* Thicker border */
|
|
234
|
+
border-radius: 12px; /* More rounded corners */
|
|
235
|
+
padding: 25px; /* More padding */
|
|
236
|
+
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); /* Gradient background */
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Backward Compatibility
|
|
241
|
+
|
|
242
|
+
The improvements maintain full backward compatibility:
|
|
243
|
+
|
|
244
|
+
1. **Existing Data Structures**: Works with existing `AssessmentResult` data without modification
|
|
245
|
+
2. **Graceful Fallback**: If `config_rule_name` is missing, displays control ID only
|
|
246
|
+
3. **Preserved Sections**: All existing sections and functionality remain intact
|
|
247
|
+
4. **CSS Compatibility**: Existing CSS classes are preserved for custom styling
|
|
248
|
+
5. **JavaScript Functions**: All interactive features continue to work
|
|
249
|
+
|
|
250
|
+
## Migration Notes
|
|
251
|
+
|
|
252
|
+
No migration is required. The improvements work automatically with existing assessment data:
|
|
253
|
+
|
|
254
|
+
- Old reports: Show control IDs only (if config_rule_name was not available)
|
|
255
|
+
- New reports: Show formatted display names with rule names
|
|
256
|
+
- Mixed data: Gracefully handles both old and new data formats
|
|
257
|
+
|
|
258
|
+
## API Reference
|
|
259
|
+
|
|
260
|
+
### Key Methods
|
|
261
|
+
|
|
262
|
+
#### `_format_control_display_name(control_id, config_rule_name, title=None)`
|
|
263
|
+
Formats control display name combining ID, rule name, and optional title.
|
|
264
|
+
|
|
265
|
+
**Parameters:**
|
|
266
|
+
- `control_id` (str): Control identifier (e.g., "1.5")
|
|
267
|
+
- `config_rule_name` (str): AWS Config rule name
|
|
268
|
+
- `title` (str, optional): Human-readable title
|
|
269
|
+
|
|
270
|
+
**Returns:** Formatted display name string
|
|
271
|
+
|
|
272
|
+
#### `_get_ig_badge_class(ig_name)`
|
|
273
|
+
Returns CSS class for IG badge styling.
|
|
274
|
+
|
|
275
|
+
**Parameters:**
|
|
276
|
+
- `ig_name` (str): Implementation Group name (IG1, IG2, or IG3)
|
|
277
|
+
|
|
278
|
+
**Returns:** CSS class name string
|
|
279
|
+
|
|
280
|
+
#### `_enrich_control_metadata(control_data, control_id, ig_name, all_igs)`
|
|
281
|
+
Enriches control data with display metadata.
|
|
282
|
+
|
|
283
|
+
**Parameters:**
|
|
284
|
+
- `control_data` (dict): Existing control data
|
|
285
|
+
- `control_id` (str): Control identifier
|
|
286
|
+
- `ig_name` (str): Implementation Group name
|
|
287
|
+
- `all_igs` (dict): All implementation groups data
|
|
288
|
+
|
|
289
|
+
**Returns:** Enhanced control data dictionary
|
|
290
|
+
|
|
291
|
+
#### `_consolidate_findings_by_control(implementation_groups)`
|
|
292
|
+
Consolidates findings from all IGs, grouped by control ID only.
|
|
293
|
+
|
|
294
|
+
**Parameters:**
|
|
295
|
+
- `implementation_groups` (dict): Implementation groups data
|
|
296
|
+
|
|
297
|
+
**Returns:** Dictionary mapping control_id to consolidated findings
|
|
298
|
+
|
|
299
|
+
#### `_get_control_ig_membership(control_id, implementation_groups)`
|
|
300
|
+
Determines which IGs include a specific control.
|
|
301
|
+
|
|
302
|
+
**Parameters:**
|
|
303
|
+
- `control_id` (str): Control identifier
|
|
304
|
+
- `implementation_groups` (dict): All IG data
|
|
305
|
+
|
|
306
|
+
**Returns:** List of IG names
|
|
307
|
+
|
|
308
|
+
## Examples
|
|
309
|
+
|
|
310
|
+
### Example 1: Control Card Display
|
|
311
|
+
|
|
312
|
+
**Before:**
|
|
313
|
+
```
|
|
314
|
+
┌─────────────────────────┐
|
|
315
|
+
│ 1.5 │
|
|
316
|
+
│ ━━━━━━━━━━━━━━━━━━━━━ │
|
|
317
|
+
│ 0% compliant │
|
|
318
|
+
└─────────────────────────┘
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**After:**
|
|
322
|
+
```
|
|
323
|
+
┌─────────────────────────────────────────────┐
|
|
324
|
+
│ 1.5: root-account-hardware-mfa-enabled │
|
|
325
|
+
│ [IG1] │
|
|
326
|
+
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
|
|
327
|
+
│ 0% compliant │
|
|
328
|
+
└─────────────────────────────────────────────┘
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Example 2: Detailed Findings Section
|
|
332
|
+
|
|
333
|
+
**Before:**
|
|
334
|
+
```
|
|
335
|
+
Detailed Findings
|
|
336
|
+
|
|
337
|
+
IG1 Detailed Findings
|
|
338
|
+
Control 1.5
|
|
339
|
+
- Resource: 175331854181
|
|
340
|
+
- Status: NON_COMPLIANT
|
|
341
|
+
|
|
342
|
+
IG2 Detailed Findings
|
|
343
|
+
Control 1.5
|
|
344
|
+
- Resource: 175331854181
|
|
345
|
+
- Status: NON_COMPLIANT
|
|
346
|
+
|
|
347
|
+
IG3 Detailed Findings
|
|
348
|
+
Control 1.5
|
|
349
|
+
- Resource: 175331854181
|
|
350
|
+
- Status: NON_COMPLIANT
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**After:**
|
|
354
|
+
```
|
|
355
|
+
Detailed Findings
|
|
356
|
+
|
|
357
|
+
1.5: root-account-hardware-mfa-enabled
|
|
358
|
+
Implementation Groups: [IG1] [IG2] [IG3]
|
|
359
|
+
- Resource: 175331854181
|
|
360
|
+
- Status: NON_COMPLIANT
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### Example 3: Implementation Groups Section
|
|
364
|
+
|
|
365
|
+
**Before:**
|
|
366
|
+
```
|
|
367
|
+
IG1 - Essential Cyber Hygiene (58 controls)
|
|
368
|
+
[Shows all 58 controls]
|
|
369
|
+
|
|
370
|
+
IG2 - Enhanced Security (132 controls)
|
|
371
|
+
[Shows all 132 controls, including 58 from IG1]
|
|
372
|
+
|
|
373
|
+
IG3 - Advanced Security (156 controls)
|
|
374
|
+
[Shows all 156 controls, including 132 from IG1+IG2]
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**After:**
|
|
378
|
+
```
|
|
379
|
+
Implementation Groups
|
|
380
|
+
Note: IGs are cumulative. IG2 includes IG1, IG3 includes IG1+IG2.
|
|
381
|
+
|
|
382
|
+
IG1 - Essential Cyber Hygiene
|
|
383
|
+
Showing 58 foundational controls essential for all organizations.
|
|
384
|
+
[Shows 58 IG1 controls]
|
|
385
|
+
|
|
386
|
+
IG2 - Enhanced Security (includes IG1)
|
|
387
|
+
Showing 74 additional controls beyond IG1 for enhanced security.
|
|
388
|
+
[Shows only 74 controls unique to IG2]
|
|
389
|
+
|
|
390
|
+
IG3 - Advanced Security (includes IG1 + IG2)
|
|
391
|
+
Showing 24 advanced controls beyond IG1 and IG2 for comprehensive security.
|
|
392
|
+
[Shows only 24 controls unique to IG3]
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Troubleshooting
|
|
396
|
+
|
|
397
|
+
### Issue: Control names not showing
|
|
398
|
+
|
|
399
|
+
**Cause:** `config_rule_name` field is missing in assessment data
|
|
400
|
+
|
|
401
|
+
**Solution:** The reporter gracefully falls back to showing control ID only. To fix, ensure your assessment includes config_rule_name in control data.
|
|
402
|
+
|
|
403
|
+
### Issue: IG badges not appearing
|
|
404
|
+
|
|
405
|
+
**Cause:** CSS classes may be overridden by custom styles
|
|
406
|
+
|
|
407
|
+
**Solution:** Check for conflicting CSS rules and ensure `.ig-membership-badge` classes are not hidden.
|
|
408
|
+
|
|
409
|
+
### Issue: Truncation not working
|
|
410
|
+
|
|
411
|
+
**Cause:** CSS for `.control-display-name.truncated` may be missing
|
|
412
|
+
|
|
413
|
+
**Solution:** Ensure the CSS styles are included in the report. Check browser developer tools for CSS conflicts.
|
|
414
|
+
|
|
415
|
+
## Support
|
|
416
|
+
|
|
417
|
+
For issues or questions about the HTML report improvements:
|
|
418
|
+
|
|
419
|
+
1. Check this documentation for examples and customization options
|
|
420
|
+
2. Review the docstrings in `html_reporter.py` for detailed API information
|
|
421
|
+
3. Examine the CSS classes in the generated HTML for styling customization
|
|
422
|
+
4. Refer to the requirements and design documents in `.kiro/specs/html-report-improvements/`
|
docs/installation.md
CHANGED
|
@@ -104,7 +104,7 @@ aws-cis-assess assess --aws-profile my-sso-profile
|
|
|
104
104
|
|
|
105
105
|
## Required IAM Permissions
|
|
106
106
|
|
|
107
|
-
The tool requires read-only permissions for various AWS services. Here's a comprehensive IAM policy:
|
|
107
|
+
The tool requires read-only permissions for various AWS services. Here's a comprehensive IAM policy that covers all 136 assessments:
|
|
108
108
|
|
|
109
109
|
```json
|
|
110
110
|
{
|
|
@@ -113,50 +113,87 @@ The tool requires read-only permissions for various AWS services. Here's a compr
|
|
|
113
113
|
{
|
|
114
114
|
"Effect": "Allow",
|
|
115
115
|
"Action": [
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
116
|
+
"acm:Describe*",
|
|
117
|
+
"acm:Get*",
|
|
118
|
+
"acm:List*",
|
|
119
|
+
"apigateway:GET",
|
|
120
|
+
"application-autoscaling:Describe*",
|
|
121
|
+
"autoscaling:Describe*",
|
|
122
|
+
"backup:Describe*",
|
|
123
|
+
"backup:Get*",
|
|
124
|
+
"backup:List*",
|
|
123
125
|
"cloudtrail:Describe*",
|
|
124
126
|
"cloudtrail:GetTrailStatus",
|
|
125
127
|
"cloudtrail:LookupEvents",
|
|
126
128
|
"cloudwatch:Describe*",
|
|
127
129
|
"cloudwatch:Get*",
|
|
128
130
|
"cloudwatch:List*",
|
|
129
|
-
"
|
|
130
|
-
"
|
|
131
|
-
"guardduty:List*",
|
|
131
|
+
"codebuild:BatchGetProjects",
|
|
132
|
+
"codebuild:ListProjects",
|
|
132
133
|
"config:Describe*",
|
|
133
134
|
"config:Get*",
|
|
134
135
|
"config:List*",
|
|
136
|
+
"dms:Describe*",
|
|
137
|
+
"dms:List*",
|
|
138
|
+
"dynamodb:Describe*",
|
|
139
|
+
"dynamodb:List*",
|
|
140
|
+
"ec2:Describe*",
|
|
141
|
+
"ecr:Describe*",
|
|
142
|
+
"ecr:Get*",
|
|
143
|
+
"ecr:List*",
|
|
144
|
+
"ecs:Describe*",
|
|
145
|
+
"ecs:List*",
|
|
146
|
+
"elasticfilesystem:Describe*",
|
|
147
|
+
"elasticache:Describe*",
|
|
148
|
+
"elasticache:List*",
|
|
149
|
+
"elasticbeanstalk:Describe*",
|
|
150
|
+
"elasticbeanstalk:List*",
|
|
151
|
+
"elasticloadbalancing:Describe*",
|
|
152
|
+
"elasticmapreduce:Describe*",
|
|
153
|
+
"elasticmapreduce:List*",
|
|
154
|
+
"elasticmapreduce:ViewEventsFromAllClustersInConsole",
|
|
155
|
+
"es:Describe*",
|
|
156
|
+
"es:ESHttpGet",
|
|
157
|
+
"es:List*",
|
|
158
|
+
"guardduty:Get*",
|
|
159
|
+
"guardduty:List*",
|
|
160
|
+
"iam:Get*",
|
|
161
|
+
"iam:List*",
|
|
162
|
+
"kinesis:Describe*",
|
|
163
|
+
"kinesis:List*",
|
|
135
164
|
"kms:Describe*",
|
|
136
165
|
"kms:Get*",
|
|
137
166
|
"kms:List*",
|
|
167
|
+
"lambda:Get*",
|
|
168
|
+
"lambda:List*",
|
|
169
|
+
"logs:Describe*",
|
|
170
|
+
"organizations:Describe*",
|
|
171
|
+
"organizations:List*",
|
|
172
|
+
"rds:Describe*",
|
|
173
|
+
"redshift:Describe*",
|
|
174
|
+
"s3:GetBucket*",
|
|
175
|
+
"s3:GetObject*",
|
|
176
|
+
"s3:ListBucket*",
|
|
177
|
+
"s3:GetAccountPublicAccessBlock",
|
|
178
|
+
"sagemaker:Describe*",
|
|
179
|
+
"sagemaker:List*",
|
|
138
180
|
"secretsmanager:Describe*",
|
|
139
181
|
"secretsmanager:List*",
|
|
182
|
+
"securityhub:Describe*",
|
|
183
|
+
"securityhub:Get*",
|
|
184
|
+
"securityhub:List*",
|
|
185
|
+
"sns:Get*",
|
|
186
|
+
"sns:List*",
|
|
187
|
+
"sqs:Get*",
|
|
188
|
+
"sqs:List*",
|
|
140
189
|
"ssm:Describe*",
|
|
141
190
|
"ssm:Get*",
|
|
142
191
|
"ssm:List*",
|
|
143
|
-
"
|
|
144
|
-
"organizations:List*",
|
|
145
|
-
"backup:Describe*",
|
|
146
|
-
"backup:Get*",
|
|
147
|
-
"backup:List*",
|
|
148
|
-
"dynamodb:Describe*",
|
|
149
|
-
"dynamodb:List*",
|
|
150
|
-
"elasticloadbalancing:Describe*",
|
|
151
|
-
"apigateway:GET",
|
|
152
|
-
"redshift:Describe*",
|
|
153
|
-
"ecr:Describe*",
|
|
154
|
-
"ecr:Get*",
|
|
155
|
-
"ecr:List*",
|
|
156
|
-
"wafv2:Get*",
|
|
157
|
-
"wafv2:List*",
|
|
192
|
+
"sts:GetCallerIdentity",
|
|
158
193
|
"waf:Get*",
|
|
159
|
-
"waf:List*"
|
|
194
|
+
"waf:List*",
|
|
195
|
+
"wafv2:Get*",
|
|
196
|
+
"wafv2:List*"
|
|
160
197
|
],
|
|
161
198
|
"Resource": "*"
|
|
162
199
|
}
|
|
@@ -164,6 +201,20 @@ The tool requires read-only permissions for various AWS services. Here's a compr
|
|
|
164
201
|
}
|
|
165
202
|
```
|
|
166
203
|
|
|
204
|
+
### Services Covered
|
|
205
|
+
|
|
206
|
+
This policy includes permissions for all AWS services assessed by the tool:
|
|
207
|
+
|
|
208
|
+
**Core Services:** EC2, IAM, S3, RDS, CloudTrail, CloudWatch, Logs
|
|
209
|
+
**Security Services:** GuardDuty, Security Hub, WAF, KMS, Secrets Manager, ACM
|
|
210
|
+
**Container Services:** ECS, ECR, EKS (via EC2), Lambda
|
|
211
|
+
**Data Services:** DynamoDB, Redshift, ElastiCache, OpenSearch, Elasticsearch, Kinesis, SQS, SNS
|
|
212
|
+
**Compute Services:** Auto Scaling, Elastic Beanstalk, EMR, SageMaker
|
|
213
|
+
**Network Services:** ELB, ALB/NLB, API Gateway, VPC
|
|
214
|
+
**Storage Services:** EFS, S3 Control, Backup
|
|
215
|
+
**DevOps Services:** CodeBuild, DMS
|
|
216
|
+
**Management Services:** SSM, Organizations, Config, STS
|
|
217
|
+
|
|
167
218
|
### Minimal Permissions for Testing
|
|
168
219
|
|
|
169
220
|
For initial testing, you can use the AWS managed `ReadOnlyAccess` policy:
|