iam-policy-validator 1.7.0__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.

Potentially problematic release.


This version of iam-policy-validator might be problematic. Click here for more details.

Files changed (83) hide show
  1. iam_policy_validator-1.7.0.dist-info/METADATA +1057 -0
  2. iam_policy_validator-1.7.0.dist-info/RECORD +83 -0
  3. iam_policy_validator-1.7.0.dist-info/WHEEL +4 -0
  4. iam_policy_validator-1.7.0.dist-info/entry_points.txt +2 -0
  5. iam_policy_validator-1.7.0.dist-info/licenses/LICENSE +21 -0
  6. iam_validator/__init__.py +27 -0
  7. iam_validator/__main__.py +11 -0
  8. iam_validator/__version__.py +7 -0
  9. iam_validator/checks/__init__.py +43 -0
  10. iam_validator/checks/action_condition_enforcement.py +884 -0
  11. iam_validator/checks/action_resource_matching.py +441 -0
  12. iam_validator/checks/action_validation.py +72 -0
  13. iam_validator/checks/condition_key_validation.py +92 -0
  14. iam_validator/checks/condition_type_mismatch.py +259 -0
  15. iam_validator/checks/full_wildcard.py +71 -0
  16. iam_validator/checks/mfa_condition_check.py +112 -0
  17. iam_validator/checks/policy_size.py +147 -0
  18. iam_validator/checks/policy_type_validation.py +305 -0
  19. iam_validator/checks/principal_validation.py +776 -0
  20. iam_validator/checks/resource_validation.py +138 -0
  21. iam_validator/checks/sensitive_action.py +254 -0
  22. iam_validator/checks/service_wildcard.py +107 -0
  23. iam_validator/checks/set_operator_validation.py +157 -0
  24. iam_validator/checks/sid_uniqueness.py +170 -0
  25. iam_validator/checks/utils/__init__.py +1 -0
  26. iam_validator/checks/utils/policy_level_checks.py +143 -0
  27. iam_validator/checks/utils/sensitive_action_matcher.py +294 -0
  28. iam_validator/checks/utils/wildcard_expansion.py +87 -0
  29. iam_validator/checks/wildcard_action.py +67 -0
  30. iam_validator/checks/wildcard_resource.py +135 -0
  31. iam_validator/commands/__init__.py +25 -0
  32. iam_validator/commands/analyze.py +531 -0
  33. iam_validator/commands/base.py +48 -0
  34. iam_validator/commands/cache.py +392 -0
  35. iam_validator/commands/download_services.py +255 -0
  36. iam_validator/commands/post_to_pr.py +86 -0
  37. iam_validator/commands/validate.py +600 -0
  38. iam_validator/core/__init__.py +14 -0
  39. iam_validator/core/access_analyzer.py +671 -0
  40. iam_validator/core/access_analyzer_report.py +640 -0
  41. iam_validator/core/aws_fetcher.py +940 -0
  42. iam_validator/core/check_registry.py +607 -0
  43. iam_validator/core/cli.py +134 -0
  44. iam_validator/core/condition_validators.py +626 -0
  45. iam_validator/core/config/__init__.py +81 -0
  46. iam_validator/core/config/aws_api.py +35 -0
  47. iam_validator/core/config/aws_global_conditions.py +160 -0
  48. iam_validator/core/config/category_suggestions.py +104 -0
  49. iam_validator/core/config/condition_requirements.py +155 -0
  50. iam_validator/core/config/config_loader.py +472 -0
  51. iam_validator/core/config/defaults.py +523 -0
  52. iam_validator/core/config/principal_requirements.py +421 -0
  53. iam_validator/core/config/sensitive_actions.py +672 -0
  54. iam_validator/core/config/service_principals.py +95 -0
  55. iam_validator/core/config/wildcards.py +124 -0
  56. iam_validator/core/constants.py +74 -0
  57. iam_validator/core/formatters/__init__.py +27 -0
  58. iam_validator/core/formatters/base.py +147 -0
  59. iam_validator/core/formatters/console.py +59 -0
  60. iam_validator/core/formatters/csv.py +170 -0
  61. iam_validator/core/formatters/enhanced.py +440 -0
  62. iam_validator/core/formatters/html.py +672 -0
  63. iam_validator/core/formatters/json.py +33 -0
  64. iam_validator/core/formatters/markdown.py +63 -0
  65. iam_validator/core/formatters/sarif.py +251 -0
  66. iam_validator/core/models.py +327 -0
  67. iam_validator/core/policy_checks.py +656 -0
  68. iam_validator/core/policy_loader.py +396 -0
  69. iam_validator/core/pr_commenter.py +424 -0
  70. iam_validator/core/report.py +872 -0
  71. iam_validator/integrations/__init__.py +28 -0
  72. iam_validator/integrations/github_integration.py +815 -0
  73. iam_validator/integrations/ms_teams.py +442 -0
  74. iam_validator/sdk/__init__.py +187 -0
  75. iam_validator/sdk/arn_matching.py +382 -0
  76. iam_validator/sdk/context.py +222 -0
  77. iam_validator/sdk/exceptions.py +48 -0
  78. iam_validator/sdk/helpers.py +177 -0
  79. iam_validator/sdk/policy_utils.py +425 -0
  80. iam_validator/sdk/shortcuts.py +283 -0
  81. iam_validator/utils/__init__.py +31 -0
  82. iam_validator/utils/cache.py +105 -0
  83. iam_validator/utils/regex.py +206 -0
@@ -0,0 +1,1057 @@
1
+ Metadata-Version: 2.4
2
+ Name: iam-policy-validator
3
+ Version: 1.7.0
4
+ Summary: Validate AWS IAM policies for correctness and security using AWS Service Reference API
5
+ Project-URL: Homepage, https://github.com/boogy/iam-policy-validator
6
+ Project-URL: Documentation, https://github.com/boogy/iam-policy-validator/tree/main/docs
7
+ Project-URL: Repository, https://github.com/boogy/iam-policy-validator
8
+ Project-URL: Issues, https://github.com/boogy/iam-policy-validator/issues
9
+ Project-URL: Changelog, https://github.com/boogy/iam-policy-validator/blob/main/docs/CHANGELOG.md
10
+ Author-email: boogy <0xboogy@gmail.com>
11
+ License: MIT
12
+ License-File: LICENSE
13
+ Keywords: aws,github-action,iam,policy,security,validation
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: System Administrators
17
+ Classifier: License :: OSI Approved :: MIT License
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Security
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: Topic :: System :: Systems Administration
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: boto3>=1.28.0
27
+ Requires-Dist: botocore>=1.40.55
28
+ Requires-Dist: httpx[http2]>=0.27.0
29
+ Requires-Dist: pydantic>=2.0.0
30
+ Requires-Dist: pyyaml>=6.0
31
+ Requires-Dist: rich>=13.0.0
32
+ Provides-Extra: dev
33
+ Requires-Dist: mypy>=1.0.0; extra == 'dev'
34
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
35
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == 'dev'
36
+ Requires-Dist: pytest-cov>=7.0.0; extra == 'dev'
37
+ Requires-Dist: pytest>=7.0.0; extra == 'dev'
38
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
39
+ Requires-Dist: types-boto3; extra == 'dev'
40
+ Requires-Dist: types-pyyaml; extra == 'dev'
41
+ Description-Content-Type: text/markdown
42
+
43
+ # IAM Policy Validator
44
+
45
+ > **Catch IAM policy errors before they reach production** - A comprehensive security and validation tool for AWS IAM policies that combines AWS's official Access Analyzer with powerful custom security checks.
46
+
47
+ [![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-Ready-blue)](https://github.com/marketplace/actions/iam-policy-validator)
48
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
49
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
50
+
51
+ ## 🚀 Why IAM Policy Validator?
52
+
53
+ **IAM policy errors are costly and dangerous.** A single misconfigured policy can:
54
+ - ❌ Grant unintended admin access (privilege escalation)
55
+ - ❌ Expose sensitive data to the public
56
+ - ❌ Break production deployments with invalid syntax
57
+ - ❌ Create security vulnerabilities that persist for months
58
+
59
+ **This tool prevents these issues** by:
60
+ - ✅ **Validating early** - Catch errors in PRs before merge
61
+ - ✅ **Comprehensive checks** - AWS Access Analyzer + 18 built-in security checks
62
+ - ✅ **Smart filtering** - Auto-detects IAM policies from mixed JSON/YAML files
63
+ - ✅ **Developer-friendly** - Clear error messages with fix suggestions
64
+ - ✅ **Zero setup** - Works as a GitHub Action out of the box
65
+
66
+ ## ✨ Key Features
67
+
68
+ ### 🔍 Multi-Layer Validation
69
+ - **AWS IAM Access Analyzer** - Official AWS validation (syntax, permissions, security)
70
+ - **18 Built-in Security Checks** - Comprehensive validation across AWS requirements and security best practices
71
+ - **Policy Comparison** - Detect new permissions vs baseline (prevent scope creep)
72
+ - **Public Access Detection** - Check 29+ AWS resource types for public exposure
73
+ - **Privilege Escalation Detection** - Identify dangerous action combinations
74
+
75
+ ### 🎯 Smart & Efficient
76
+ - **Automatic IAM Policy Detection** - Scans mixed repos, filters non-IAM files automatically
77
+ - **Wildcard Expansion** - Expands `s3:Get*` patterns to validate specific actions
78
+ - **Offline Validation** - Download AWS service definitions for air-gapped environments
79
+ - **JSON + YAML Support** - Native support for both formats
80
+ - **Streaming Mode** - Memory-efficient processing for large policy sets
81
+
82
+ ### ⚡ Performance Optimized
83
+ - **Service Pre-fetching** - Common AWS services cached at startup (faster validation)
84
+ - **LRU Memory Cache** - Recently accessed services cached with TTL
85
+ - **Request Coalescing** - Duplicate API requests automatically deduplicated
86
+ - **Parallel Execution** - Multiple checks run concurrently
87
+ - **HTTP/2 Support** - Multiplexed connections for better API performance
88
+
89
+ ### 📊 Output Formats
90
+ - **Console** (default) - Clean terminal output with colors and tables
91
+ - **Enhanced** - Modern visual output with progress bars and tree structure
92
+ - **JSON** - Structured format for programmatic processing
93
+ - **Markdown** - GitHub-flavored markdown for PR comments
94
+ - **SARIF** - GitHub code scanning integration format
95
+ - **CSV** - Spreadsheet-compatible for analysis
96
+ - **HTML** - Interactive reports with filtering and search
97
+
98
+ ### 🔌 Extensibility
99
+ - **Plugin System** - Easy-to-add custom validation checks
100
+ - **Configuration-Driven** - YAML-based configuration for all aspects
101
+ - **CI/CD Ready** - GitHub Actions, GitLab CI, Jenkins, CircleCI
102
+
103
+ ## 📈 Real-World Impact
104
+
105
+ ### Common IAM Policy Issues This Tool Catches
106
+
107
+ **Before IAM Policy Validator:**
108
+ ```json
109
+ {
110
+ "Statement": [{
111
+ "Effect": "Allow",
112
+ "Action": "s3:*", // ❌ Too permissive
113
+ "Resource": "*" // ❌ All buckets!
114
+ }]
115
+ }
116
+ ```
117
+ **Issue:** Grants full S3 access to ALL buckets (data breach risk)
118
+
119
+ **After IAM Policy Validator:**
120
+ ```
121
+ ❌ MEDIUM: Statement applies to all resources (*)
122
+ ❌ HIGH: Wildcard action 's3:*' with resource '*' is overly permissive
123
+ 💡 Suggestion: Specify exact actions and bucket ARNs
124
+ ```
125
+
126
+ ### Privilege Escalation Detection
127
+
128
+ **Dangerous combination across multiple statements:**
129
+ ```json
130
+ {
131
+ "Statement": [
132
+ {"Action": "iam:CreateUser"}, // Seems innocent
133
+ {"Action": "iam:AttachUserPolicy"} // Also seems innocent
134
+ ]
135
+ }
136
+ ```
137
+
138
+ **What the validator catches:**
139
+ ```
140
+ 🚨 CRITICAL: Privilege escalation risk detected!
141
+ Actions ['iam:CreateUser', 'iam:AttachUserPolicy'] allow:
142
+ 1. Create new IAM user
143
+ 2. Attach AdministratorAccess policy to that user
144
+ 3. Gain full AWS account access
145
+
146
+ 💡 Add conditions or separate these permissions
147
+ ```
148
+
149
+ ### Public Access Prevention
150
+
151
+ **Before merge:**
152
+ ```json
153
+ {
154
+ "Principal": "*", // ❌ Anyone on the internet!
155
+ "Action": "s3:GetObject",
156
+ "Resource": "arn:aws:s3:::my-private-data/*"
157
+ }
158
+ ```
159
+
160
+ **Blocked by validator:**
161
+ ```
162
+ 🛑 CRITICAL: Resource policy allows public access
163
+ 29 resource types checked: AWS::S3::Bucket
164
+ Principal "*" grants internet-wide access to private data
165
+
166
+ 💡 Use specific AWS principals or add IP restrictions
167
+ ```
168
+
169
+ ## Quick Start
170
+
171
+ ### As a GitHub Action (Recommended) ⭐
172
+
173
+ The IAM Policy Validator is available as **both** a standalone GitHub Action and a Python module. Choose the approach that best fits your needs:
174
+
175
+ #### **Option A: Standalone GitHub Action** (Recommended - Zero Setup)
176
+
177
+ Use the published action directly - it handles all setup automatically:
178
+
179
+ Create `.github/workflows/iam-policy-validator.yml`:
180
+
181
+ ```yaml
182
+ name: IAM Policy Validation
183
+
184
+ on:
185
+ pull_request:
186
+ paths:
187
+ - 'policies/**/*.json'
188
+
189
+ jobs:
190
+ validate:
191
+ runs-on: ubuntu-latest
192
+ permissions:
193
+ contents: read
194
+ pull-requests: write
195
+
196
+ steps:
197
+ - name: Checkout code
198
+ uses: actions/checkout@v5
199
+
200
+ - name: Validate IAM Policies
201
+ uses: boogy/iam-policy-validator@v1
202
+ with:
203
+ path: policies/
204
+ post-comment: true
205
+ create-review: true
206
+ fail-on-warnings: true
207
+ ```
208
+
209
+ **Benefits:**
210
+ - ✅ Zero setup - action handles Python, uv, and dependencies
211
+ - ✅ Automatic dependency caching
212
+ - ✅ Simple, declarative configuration
213
+ - ✅ Perfect for CI/CD workflows
214
+
215
+ **Note:** The action uses the automatic `github.token` by default. If you need to use a custom token (e.g., for cross-repo comments or fine-grained permissions), add:
216
+ ```yaml
217
+ with:
218
+ github-token: ${{ secrets.MY_CUSTOM_TOKEN }}
219
+ ```
220
+
221
+ #### With AWS Access Analyzer (Standalone Action)
222
+
223
+ Use AWS's official policy validation service:
224
+
225
+ ```yaml
226
+ name: IAM Policy Validation with Access Analyzer
227
+
228
+ on:
229
+ pull_request:
230
+ paths:
231
+ - 'policies/**/*.json'
232
+
233
+ jobs:
234
+ validate:
235
+ runs-on: ubuntu-latest
236
+ permissions:
237
+ contents: read
238
+ pull-requests: write
239
+ id-token: write # Required for AWS OIDC
240
+
241
+ steps:
242
+ - name: Checkout code
243
+ uses: actions/checkout@v5
244
+
245
+ - name: Configure AWS Credentials
246
+ uses: aws-actions/configure-aws-credentials@v4
247
+ with:
248
+ role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
249
+ aws-region: us-east-1
250
+
251
+ - name: Validate with Access Analyzer
252
+ uses: boogy/iam-policy-validator@v1
253
+ with:
254
+ path: policies/
255
+ use-access-analyzer: true
256
+ run-all-checks: true
257
+ post-comment: true
258
+ create-review: true
259
+ fail-on-warnings: true
260
+ ```
261
+
262
+ #### **Option B: As Python Module/CLI Tool**
263
+
264
+ For advanced use cases or when you need more control:
265
+
266
+ ```yaml
267
+ name: IAM Policy Validation (CLI)
268
+
269
+ on:
270
+ pull_request:
271
+ paths:
272
+ - 'policies/**/*.json'
273
+
274
+ jobs:
275
+ validate:
276
+ runs-on: ubuntu-latest
277
+ permissions:
278
+ contents: read
279
+ pull-requests: write
280
+
281
+ steps:
282
+ - name: Checkout code
283
+ uses: actions/checkout@v5
284
+
285
+ - name: Set up Python
286
+ uses: actions/setup-python@v5
287
+ with:
288
+ python-version: '3.12'
289
+
290
+ - name: Install uv
291
+ uses: astral-sh/setup-uv@v3
292
+
293
+ - name: Install dependencies
294
+ run: uv sync
295
+
296
+ - name: Validate IAM Policies
297
+ env:
298
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
299
+ GITHUB_REPOSITORY: ${{ github.repository }}
300
+ GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
301
+ run: |
302
+ uv run iam-validator validate \
303
+ --path ./policies/ \
304
+ --github-comment \
305
+ --github-review \
306
+ --fail-on-warnings \
307
+ --log-level info
308
+ ```
309
+
310
+ **Use this when you need:**
311
+ - Advanced CLI options (e.g., `--log-level`, `--custom-checks-dir`, `--stream`)
312
+ - Full control over the Python environment
313
+ - Integration with existing Python workflows
314
+ - Multiple validation commands in sequence
315
+
316
+ #### Custom Policy Checks (Standalone Action)
317
+
318
+ Enforce specific security requirements:
319
+
320
+ ```yaml
321
+ name: IAM Policy Security Validation
322
+
323
+ on:
324
+ pull_request:
325
+ paths:
326
+ - 'policies/**/*.json'
327
+
328
+ jobs:
329
+ validate-security:
330
+ runs-on: ubuntu-latest
331
+ permissions:
332
+ contents: read
333
+ pull-requests: write
334
+ id-token: write
335
+
336
+ steps:
337
+ - name: Checkout code
338
+ uses: actions/checkout@v5
339
+
340
+ - name: Configure AWS Credentials
341
+ uses: aws-actions/configure-aws-credentials@v4
342
+ with:
343
+ role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
344
+ aws-region: us-east-1
345
+
346
+ # Prevent dangerous actions
347
+ - name: Check for Dangerous Actions
348
+ uses: boogy/iam-policy-validator@v1
349
+ with:
350
+ path: policies/
351
+ use-access-analyzer: true
352
+ check-access-not-granted: "s3:DeleteBucket iam:CreateAccessKey iam:AttachUserPolicy"
353
+ post-comment: true
354
+ fail-on-warnings: true
355
+
356
+ # Check S3 bucket policies for public access
357
+ - name: Check S3 Public Access
358
+ uses: boogy/iam-policy-validator@v1
359
+ with:
360
+ path: s3-policies/
361
+ use-access-analyzer: true
362
+ policy-type: RESOURCE_POLICY
363
+ check-no-public-access: true
364
+ public-access-resource-type: "AWS::S3::Bucket"
365
+ post-comment: true
366
+ fail-on-warnings: true
367
+
368
+ # Compare against baseline to prevent new permissions
369
+ - name: Checkout baseline from main
370
+ uses: actions/checkout@v5
371
+ with:
372
+ ref: main
373
+ path: baseline
374
+
375
+ - name: Check for New Access
376
+ uses: boogy/iam-policy-validator@v1
377
+ with:
378
+ path: policies/role-policy.json
379
+ use-access-analyzer: true
380
+ check-no-new-access: baseline/policies/role-policy.json
381
+ post-comment: true
382
+ fail-on-warnings: true
383
+ ```
384
+
385
+ ---
386
+
387
+ ### Choosing the Right Approach
388
+
389
+ | Feature | Standalone Action | Python Module/CLI |
390
+ | --------------------- | ------------------------ | ------------------------------------------------------------------------ |
391
+ | Setup Required | None - fully automated | Manual (Python, uv, dependencies) |
392
+ | Configuration | YAML inputs | CLI arguments |
393
+ | Advanced Options | Limited to action inputs | Full CLI access (`--log-level`, `--custom-checks-dir`, `--stream`, etc.) |
394
+ | Custom Checks | Via config file only | Via config file or `--custom-checks-dir` |
395
+ | Best For | CI/CD, simple workflows | Development, advanced workflows, testing |
396
+ | Dependency Management | Automatic | Manual |
397
+
398
+ **Recommendation:** Use the **Standalone Action** for production CI/CD workflows, and the **Python Module/CLI** for development, testing, or when you need advanced features.
399
+
400
+ #### Multiple Paths (Standalone Action)
401
+
402
+ Validate policies across multiple directories:
403
+
404
+ ```yaml
405
+ - name: Validate Multiple Paths
406
+ uses: boogy/iam-policy-validator@v1
407
+ with:
408
+ path: |
409
+ iam/
410
+ s3-policies/
411
+ lambda-policies/special-policy.json
412
+ post-comment: true
413
+ fail-on-warnings: true
414
+ ```
415
+
416
+ #### Custom Configuration
417
+
418
+ Use a custom configuration file to customize validation rules:
419
+
420
+ ```yaml
421
+ name: IAM Policy Validation with Custom Config
422
+
423
+ on:
424
+ pull_request:
425
+ paths:
426
+ - 'policies/**/*.json'
427
+ - '.iam-validator.yaml'
428
+
429
+ jobs:
430
+ validate:
431
+ runs-on: ubuntu-latest
432
+ permissions:
433
+ contents: read
434
+ pull-requests: write
435
+
436
+ steps:
437
+ - name: Checkout code
438
+ uses: actions/checkout@v5
439
+
440
+ - name: Validate with Custom Config
441
+ uses: boogy/iam-policy-validator@v1
442
+ with:
443
+ path: policies/
444
+ config-file: .iam-validator.yaml
445
+ post-comment: true
446
+ create-review: true
447
+ fail-on-warnings: true
448
+ ```
449
+
450
+ **Example `.iam-validator.yaml`:**
451
+ ```yaml
452
+ settings:
453
+ fail_fast: false
454
+ enable_builtin_checks: true
455
+
456
+ # Custom check configurations
457
+ wildcard_action:
458
+ enabled: true
459
+ severity: high
460
+
461
+ action_condition_enforcement:
462
+ enabled: true
463
+ severity: critical
464
+ action_condition_requirements:
465
+ - actions:
466
+ - "iam:PassRole"
467
+ severity: critical
468
+ required_conditions:
469
+ - condition_key: "iam:PassedToService"
470
+ ```
471
+
472
+ See [examples/configs/full-reference-config.yaml](examples/configs/full-reference-config.yaml) for a complete configuration reference with all available options.
473
+
474
+ ### GitHub Action Inputs
475
+
476
+ #### Core Options
477
+ | Input | Description | Required | Default |
478
+ | ------------------ | ----------------------------------------------------------- | -------- | ------- |
479
+ | `path` | Path(s) to IAM policy file or directory (newline-separated) | Yes | - |
480
+ | `config-file` | Path to custom configuration file (.yaml) | No | `""` |
481
+ | `fail-on-warnings` | Fail validation if warnings are found | No | `false` |
482
+ | `recursive` | Recursively search directories for policy files | No | `true` |
483
+
484
+ #### GitHub Integration
485
+ | Input | Description | Required | Default |
486
+ | ---------------- | --------------------------------------------------------- | -------- | -------------- |
487
+ | `github-token` | GitHub token for posting comments and reviews | No | `github.token` |
488
+ | `post-comment` | Post validation summary as PR conversation comment | No | `true` |
489
+ | `create-review` | Create line-specific review comments on PR files | No | `true` |
490
+ | `github-summary` | Write summary to GitHub Actions job summary (Actions tab) | No | `false` |
491
+
492
+ #### Output Options
493
+ | Input | Description | Required | Default |
494
+ | ------------- | -------------------------------------------------------------------------------- | -------- | --------- |
495
+ | `format` | Output format: `console`, `enhanced`, `json`, `markdown`, `sarif`, `csv`, `html` | No | `console` |
496
+ | `output-file` | Path to save output file (for non-console formats) | No | `""` |
497
+
498
+ #### AWS Access Analyzer
499
+ | Input | Description | Required | Default |
500
+ | ------------------------ | ------------------------------------------------------------------------------------------------------ | -------- | ----------------- |
501
+ | `use-access-analyzer` | Use AWS IAM Access Analyzer for validation | No | `false` |
502
+ | `access-analyzer-region` | AWS region for Access Analyzer | No | `us-east-1` |
503
+ | `policy-type` | Policy type: `IDENTITY_POLICY`, `RESOURCE_POLICY`, `SERVICE_CONTROL_POLICY`, `RESOURCE_CONTROL_POLICY` | No | `IDENTITY_POLICY` |
504
+ | `run-all-checks` | Run custom checks after Access Analyzer (sequential mode) | No | `false` |
505
+
506
+ #### Custom Policy Checks (Access Analyzer)
507
+ | Input | Description | Required | Default |
508
+ | ----------------------------- | --------------------------------------------------------------------------- | -------- | ----------------- |
509
+ | `check-access-not-granted` | Actions that should NOT be granted (space-separated, max 100) | No | `""` |
510
+ | `check-access-resources` | Resources to check with check-access-not-granted (space-separated, max 100) | No | `""` |
511
+ | `check-no-new-access` | Path to baseline policy to compare against (detect new permissions) | No | `""` |
512
+ | `check-no-public-access` | Check that resource policies do not allow public access | No | `false` |
513
+ | `public-access-resource-type` | Resource type(s) for public access check (29+ types supported, or `all`) | No | `AWS::S3::Bucket` |
514
+
515
+ #### Advanced Options
516
+ | Input | Description | Required | Default |
517
+ | ------------------- | -------------------------------------------------------------- | -------- | --------- |
518
+ | `custom-checks-dir` | Path to directory containing custom validation checks | No | `""` |
519
+ | `log-level` | Logging level: `debug`, `info`, `warning`, `error`, `critical` | No | `warning` |
520
+
521
+ **💡 Pro Tips:**
522
+ - Use `custom-checks-dir` to add organization-specific validation rules
523
+ - Set `log-level: debug` when troubleshooting workflow issues
524
+ - Configure `aws-services-dir` in your config file for offline validation
525
+ - The action automatically filters IAM policies from mixed JSON/YAML files
526
+
527
+ See [examples/github-actions/](examples/github-actions/) for 9 ready-to-use workflow examples.
528
+
529
+ ### As a CLI Tool
530
+
531
+ Install and use locally for development:
532
+
533
+ ```bash
534
+ # Install from PyPI
535
+ pip install iam-policy-validator
536
+
537
+ # Or install with pipx (recommended for CLI tools)
538
+ pipx install iam-policy-validator
539
+
540
+ # Validate a single policy
541
+ iam-validator validate --path policy.json
542
+
543
+ # Validate all policies in a directory
544
+ iam-validator validate --path ./policies/
545
+
546
+ # Validate multiple paths
547
+ iam-validator validate --path policy1.json --path ./policies/ --path ./more-policies/
548
+
549
+ # Validate resource policies (S3 bucket policies, SNS topics, etc.)
550
+ iam-validator validate --path ./bucket-policies/ --policy-type RESOURCE_POLICY
551
+
552
+ # Validate AWS Organizations Resource Control Policies (RCPs)
553
+ iam-validator validate --path ./rcps/ --policy-type RESOURCE_CONTROL_POLICY
554
+
555
+ # Generate JSON output
556
+ iam-validator validate --path ./policies/ --format json --output report.json
557
+
558
+ # Validate with AWS IAM Access Analyzer
559
+ iam-validator analyze --path policy.json
560
+
561
+ # Analyze with specific region and profile
562
+ iam-validator analyze --path policy.json --region us-west-2 --profile my-profile
563
+
564
+ # Sequential validation: Access Analyzer → Custom Checks
565
+ iam-validator analyze \
566
+ --path policy.json \
567
+ --github-comment \
568
+ --run-all-checks \
569
+ --github-review
570
+ ```
571
+
572
+ ### Policy Type Validation
573
+
574
+ The validator supports four AWS policy types, each with specific validation rules:
575
+
576
+ #### 🔷 IDENTITY_POLICY (Default)
577
+ Standard IAM policies attached to users, groups, or roles.
578
+
579
+ **Requirements:**
580
+ - Should NOT have `Principal` element (implicit - the attached entity)
581
+ - Must have `Action` and `Resource` elements
582
+
583
+ **Example:**
584
+ ```bash
585
+ iam-validator validate --path ./user-policies/ --policy-type IDENTITY_POLICY
586
+ ```
587
+
588
+ #### 🔶 RESOURCE_POLICY
589
+ Policies attached to AWS resources (S3 buckets, SNS topics, KMS keys, etc.).
590
+
591
+ **Requirements:**
592
+ - MUST have `Principal` element (who can access)
593
+ - Must have `Action`, `Effect`, and `Resource` elements
594
+ - Can use configurable security checks for principal validation
595
+
596
+ **Example:**
597
+ ```bash
598
+ iam-validator validate --path ./bucket-policies/ --policy-type RESOURCE_POLICY
599
+ ```
600
+
601
+ **Advanced Principal Validation:**
602
+ ```yaml
603
+ # config.yaml
604
+ principal_validation:
605
+ enabled: true
606
+ severity: high
607
+ # Block public access
608
+ blocked_principals: ["*"]
609
+ # Or require specific conditions for public access
610
+ require_conditions_for:
611
+ "*":
612
+ - "aws:SourceArn"
613
+ - "aws:SourceAccount"
614
+ ```
615
+
616
+ #### 🔷 SERVICE_CONTROL_POLICY
617
+ AWS Organizations SCPs that set permission guardrails.
618
+
619
+ **Requirements:**
620
+ - Must NOT have `Principal` element (applies to all principals in OU)
621
+ - Typically uses `Deny` effect for guardrails
622
+ - Must have `Action` and `Resource` elements
623
+
624
+ **Example:**
625
+ ```bash
626
+ iam-validator validate --path ./scps/ --policy-type SERVICE_CONTROL_POLICY
627
+ ```
628
+
629
+ #### 🆕 RESOURCE_CONTROL_POLICY
630
+ AWS Organizations RCPs for resource-level access control (released 2024).
631
+
632
+ **Strict Requirements:**
633
+ - `Effect` MUST be `Deny` (only AWS-managed `RCPFullAWSAccess` can use `Allow`)
634
+ - `Principal` MUST be exactly `"*"` (use `Condition` to restrict)
635
+ - `Action` cannot use `"*"` alone (must be service-specific like `"s3:*"`)
636
+ - Only **5 supported services**: `s3`, `sts`, `sqs`, `secretsmanager`, `kms`
637
+ - `NotAction` and `NotPrincipal` are NOT supported
638
+ - Must have `Resource` or `NotResource` element
639
+
640
+ **Example:**
641
+ ```bash
642
+ iam-validator validate --path ./rcps/ --policy-type RESOURCE_CONTROL_POLICY
643
+ ```
644
+
645
+ **Valid RCP:**
646
+ ```json
647
+ {
648
+ "Version": "2012-10-17",
649
+ "Statement": [{
650
+ "Sid": "EnforceEncryptionInTransit",
651
+ "Effect": "Deny",
652
+ "Principal": "*",
653
+ "Action": ["s3:*", "sqs:*"],
654
+ "Resource": "*",
655
+ "Condition": {
656
+ "BoolIfExists": {
657
+ "aws:SecureTransport": "false"
658
+ }
659
+ }
660
+ }]
661
+ }
662
+ ```
663
+
664
+ **What the validator catches:**
665
+ ```
666
+ ✓ Effect is "Deny" (required for RCPs)
667
+ ✓ Principal is "*" (required - restrictions via Condition)
668
+ ✓ Actions from supported services (s3, sqs)
669
+ ✓ Uses Condition to scope the deny
670
+ ```
671
+
672
+ ### Custom Policy Checks
673
+
674
+ AWS IAM Access Analyzer provides specialized checks to validate policies against specific security requirements:
675
+
676
+ #### 1. CheckAccessNotGranted - Prevent Dangerous Actions
677
+
678
+ Verify that policies do NOT grant specific actions (max 100 actions, 100 resources per check):
679
+
680
+ ```bash
681
+ # Check that policies don't grant dangerous S3 actions
682
+ iam-validator analyze \
683
+ --path ./policies/ \
684
+ --check-access-not-granted s3:DeleteBucket s3:DeleteObject
685
+
686
+ # Scope to specific resources
687
+ iam-validator analyze \
688
+ --path ./policies/ \
689
+ --check-access-not-granted s3:PutObject \
690
+ --check-access-resources "arn:aws:s3:::production-bucket/*"
691
+
692
+ # Prevent privilege escalation
693
+ iam-validator analyze \
694
+ --path ./policies/ \
695
+ --check-access-not-granted \
696
+ iam:CreateAccessKey \
697
+ iam:AttachUserPolicy \
698
+ iam:PutUserPolicy
699
+ ```
700
+
701
+ **Supported:** IDENTITY_POLICY, RESOURCE_POLICY
702
+
703
+ #### 2. CheckNoNewAccess - Validate Policy Updates
704
+
705
+ Ensure policy changes don't grant new permissions:
706
+
707
+ ```bash
708
+ # Compare updated policy against baseline
709
+ iam-validator analyze \
710
+ --path ./new-policy.json \
711
+ --check-no-new-access ./old-policy.json
712
+
713
+ # In CI/CD - compare against main branch
714
+ git show main:policies/policy.json > baseline-policy.json
715
+ iam-validator analyze \
716
+ --path policies/policy.json \
717
+ --check-no-new-access baseline-policy.json
718
+ ```
719
+
720
+ **Supported:** IDENTITY_POLICY, RESOURCE_POLICY
721
+
722
+ #### 3. CheckNoPublicAccess - Prevent Public Exposure
723
+
724
+ Validate that resource policies don't allow public access (29+ resource types):
725
+
726
+ ```bash
727
+ # Check S3 bucket policies
728
+ iam-validator analyze \
729
+ --path ./bucket-policy.json \
730
+ --policy-type RESOURCE_POLICY \
731
+ --check-no-public-access \
732
+ --public-access-resource-type "AWS::S3::Bucket"
733
+
734
+ # Check multiple resource types
735
+ iam-validator analyze \
736
+ --path ./resource-policies/ \
737
+ --policy-type RESOURCE_POLICY \
738
+ --check-no-public-access \
739
+ --public-access-resource-type "AWS::S3::Bucket" "AWS::Lambda::Function" "AWS::SNS::Topic"
740
+
741
+ # Check ALL 29 resource types
742
+ iam-validator analyze \
743
+ --path ./resource-policies/ \
744
+ --policy-type RESOURCE_POLICY \
745
+ --check-no-public-access \
746
+ --public-access-resource-type all
747
+ ```
748
+
749
+ **Supported Resource Types** (29 total, or use `all`):
750
+ - **Storage**: S3 Bucket, S3 Access Point, S3 Express, S3 Glacier, S3 Outposts, S3 Tables, EFS
751
+ - **Database**: DynamoDB Table/Stream, OpenSearch Domain
752
+ - **Messaging**: Kinesis Stream, SNS Topic, SQS Queue
753
+ - **Security**: KMS Key, Secrets Manager Secret, IAM Assume Role Policy
754
+ - **Compute**: Lambda Function
755
+ - **API**: API Gateway REST API
756
+ - **DevOps**: CodeArtifact Domain, Backup Vault, CloudTrail
757
+
758
+ See [docs/custom-checks.md](docs/custom-checks.md) for complete documentation.
759
+
760
+ ### As a Python Package
761
+
762
+ Use as a library in your Python applications:
763
+
764
+ ```python
765
+ import asyncio
766
+ from iam_validator.core.policy_loader import PolicyLoader
767
+ from iam_validator.core.policy_checks import validate_policies
768
+ from iam_validator.core.report import ReportGenerator
769
+
770
+ async def main():
771
+ # Load policies
772
+ loader = PolicyLoader()
773
+ policies = loader.load_from_path("./policies")
774
+
775
+ # Validate
776
+ results = await validate_policies(policies)
777
+
778
+ # Generate report
779
+ generator = ReportGenerator()
780
+ report = generator.generate_report(results)
781
+ generator.print_console_report(report)
782
+
783
+ asyncio.run(main())
784
+ ```
785
+
786
+ **📚 For comprehensive Python library documentation, see:**
787
+ - **[Python Library Usage Guide](docs/python-library-usage.md)** - Complete guide with examples
788
+ - **[Library Examples](examples/library-usage/)** - Runnable code examples
789
+
790
+ ## Validation Checks
791
+
792
+ IAM Policy Validator performs **18 built-in checks** to ensure your policies are secure and valid.
793
+
794
+ **📖 For detailed check documentation with configuration examples and pass/fail scenarios:**
795
+ - **[Check Reference Guide](docs/check-reference.md)** - Complete reference for all 18 checks
796
+ - **[Condition Requirements](docs/condition-requirements.md)** - Action condition enforcement
797
+ - **[Privilege Escalation Detection](docs/privilege-escalation.md)** - Detecting escalation paths
798
+
799
+ ### Quick Overview
800
+
801
+ **AWS IAM Validation (12 checks)** - Ensure policies work correctly in AWS:
802
+ - Statement ID uniqueness and format
803
+ - Policy size limits
804
+ - Action and condition key validation
805
+ - Condition operator and value type checking
806
+ - Set operator validation
807
+ - MFA anti-pattern detection
808
+ - Resource ARN format validation
809
+ - Principal validation (resource policies)
810
+ - Policy type validation
811
+ - Action-resource constraint and matching
812
+
813
+ **Security Best Practices (6 checks)** - Identify security risks:
814
+ - Wildcard actions (`Action: "*"`)
815
+ - Wildcard resources (`Resource: "*"`)
816
+ - Full wildcard (CRITICAL: both wildcards together)
817
+ - Service-level wildcards (`iam:*`, `s3:*`, etc.)
818
+ - Sensitive actions without conditions (490 actions across 4 risk categories)
819
+ - Action condition enforcement (MFA, IP restrictions, tags, etc.)
820
+
821
+ ### Quick Examples
822
+
823
+ **Action Validation:**
824
+ ```json
825
+ // ✅ PASS: Valid S3 action
826
+ {
827
+ "Effect": "Allow",
828
+ "Action": "s3:GetObject",
829
+ "Resource": "arn:aws:s3:::my-bucket/*"
830
+ }
831
+
832
+ // ❌ FAIL: Invalid action name
833
+ {
834
+ "Effect": "Allow",
835
+ "Action": "s3:InvalidAction", // ERROR: Action doesn't exist
836
+ "Resource": "*"
837
+ }
838
+ ```
839
+
840
+ **Full Wildcard (Critical):**
841
+ ```json
842
+ // ✅ PASS: Specific actions and resources
843
+ {
844
+ "Effect": "Allow",
845
+ "Action": ["s3:GetObject", "s3:PutObject"],
846
+ "Resource": "arn:aws:s3:::my-bucket/*"
847
+ }
848
+
849
+ // ❌ FAIL: Administrative access
850
+ {
851
+ "Effect": "Allow",
852
+ "Action": "*", // CRITICAL: All actions
853
+ "Resource": "*" // CRITICAL: All resources
854
+ }
855
+ ```
856
+
857
+ **Action Condition Enforcement:**
858
+ ```json
859
+ // ✅ PASS: iam:PassRole with required condition
860
+ {
861
+ "Effect": "Allow",
862
+ "Action": "iam:PassRole",
863
+ "Resource": "*",
864
+ "Condition": {
865
+ "StringEquals": {
866
+ "iam:PassedToService": ["lambda.amazonaws.com"]
867
+ }
868
+ }
869
+ }
870
+
871
+ // ❌ FAIL: iam:PassRole without condition
872
+ {
873
+ "Effect": "Allow",
874
+ "Action": "iam:PassRole", // HIGH: Missing iam:PassedToService condition
875
+ "Resource": "*"
876
+ }
877
+ ```
878
+
879
+ **📚 For complete documentation of all 18 checks with detailed examples, see [Check Reference Guide](docs/check-reference.md)**
880
+
881
+ _Note: The old [CHECKS.md](docs/CHECKS.md) has been deprecated in favor of the new check-reference.md with better organization and examples._
882
+
883
+ ## GitHub Integration Features
884
+
885
+ ### Flexible Comment Options
886
+
887
+ The validator provides **three independent ways** to display validation results in GitHub:
888
+
889
+ #### 1. **PR Summary Comment** (`--github-comment`)
890
+ Posts a high-level summary to the PR conversation with:
891
+ - Overall metrics (total policies, issues, severities)
892
+ - Grouped findings by file
893
+ - Detailed issue descriptions with suggestions
894
+
895
+ #### 2. **Line-Specific Review Comments** (`--github-review`)
896
+ Creates inline review comments on the "Files changed" tab:
897
+ - Comments appear directly on problematic lines
898
+ - Includes rich context (examples, suggestions)
899
+ - Automatically cleaned up on subsequent runs
900
+ - Review status (REQUEST_CHANGES or COMMENT) based on `fail_on_severity` config
901
+
902
+ #### 3. **GitHub Actions Job Summary** (`--github-summary`)
903
+ Writes a high-level overview to the Actions tab:
904
+ - Visible in workflow run summary
905
+ - Shows key metrics and severity breakdown
906
+ - Clean dashboard view without overwhelming details
907
+
908
+ **Mix and Match:** Use any combination of these options:
909
+ ```bash
910
+ # All three for maximum visibility
911
+ --github-comment --github-review --github-summary
912
+
913
+ # Only line-specific review comments (clean, minimal)
914
+ --github-review
915
+
916
+ # Only PR summary comment
917
+ --github-comment
918
+
919
+ # Only Actions job summary
920
+ --github-summary
921
+ ```
922
+
923
+ ### Smart PR Comment Management
924
+
925
+ The validator intelligently manages PR comments to keep your PRs clean:
926
+
927
+ **Comment Lifecycle:**
928
+ 1. **Old Comments Cleanup**: Automatically removes outdated bot comments from previous runs
929
+ 2. **Summary Comment**: Updates existing summary (no duplicates)
930
+ 3. **Review Comments**: Posts line-specific issues
931
+ 4. **Streaming Mode**: Progressive comments appear as files are validated
932
+
933
+ **Behavior:**
934
+ - ✅ **No Duplicates**: Summary comments are updated, not duplicated
935
+ - ✅ **Clean PR**: Old review comments automatically deleted before new validation
936
+ - ✅ **Identifiable**: All bot comments use HTML identifiers (invisible to users)
937
+ - ✅ **Progressive**: In streaming mode, comments appear file-by-file
938
+ - ✅ **Smart Review Status**: Uses `fail_on_severity` config to determine REQUEST_CHANGES vs COMMENT
939
+
940
+ **Example:**
941
+ ```
942
+ Run 1: Finds 5 issues → Posts 5 review comments + 1 summary
943
+ Run 2: Finds 3 issues → Deletes old 5 comments → Posts 3 new comments + updates summary
944
+ Result: PR always shows current state, no stale comments
945
+ ```
946
+
947
+ ## Example Output
948
+
949
+ ### Console Output
950
+
951
+ ```
952
+ ╭─────────────────── Validation Summary ───────────────────╮
953
+ │ Total Policies: 3 │
954
+ │ Valid: 2 Invalid: 1 │
955
+ │ Total Issues: 5 │
956
+ ╰──────────────────────────────────────────────────────────╯
957
+
958
+ ❌ policies/invalid_policy.json
959
+ ERROR invalid_action Statement 0: Action 's3:InvalidAction' not found
960
+ WARNING overly_permissive Statement 1: Statement allows all actions (*)
961
+ ERROR security_risk Statement 1: Statement allows all actions on all resources
962
+ ```
963
+
964
+ ### GitHub PR Comment
965
+
966
+ ```markdown
967
+ ## ❌ IAM Policy Validation Failed
968
+
969
+ ### Summary
970
+ | Metric | Count |
971
+ | ---------------- | ----- |
972
+ | Total Policies | 3 |
973
+ | Valid Policies | 2 ✅ |
974
+ | Invalid Policies | 1 ❌ |
975
+ | Total Issues | 5 |
976
+
977
+ ### Detailed Findings
978
+
979
+ #### `policies/invalid_policy.json`
980
+
981
+ **Errors:**
982
+ - **Statement 0**: Action 's3:InvalidAction' not found in service 's3'
983
+ - Action: `s3:InvalidAction`
984
+
985
+ **Warnings:**
986
+ - **Statement 1**: Statement allows all actions on all resources - CRITICAL SECURITY RISK
987
+ - 💡 Suggestion: This grants full administrative access. Restrict to specific actions and resources.
988
+ ```
989
+
990
+ ## 📚 Documentation
991
+
992
+ ### Core Documentation
993
+ - **[📖 Complete Usage Guide (DOCS.md)](DOCS.md)** - Installation, CLI reference, GitHub Actions, configuration
994
+ - **[✅ Validation Checks Reference](docs/check-reference.md)** - All 18 checks with pass/fail examples
995
+ - **[🐍 Python SDK Guide (SDK.md)](docs/SDK.md)** - Use as a Python library in your applications
996
+ - **[🤝 Contributing Guide (CONTRIBUTING.md)](CONTRIBUTING.md)** - How to contribute to the project
997
+
998
+ ### Examples & Resources
999
+ - **[Configuration Examples](examples/configs/)** - 9 configuration files for different use cases
1000
+ - **[GitHub Actions Workflows](examples/github-actions/)** - Ready-to-use workflow examples
1001
+ - **[Custom Checks](examples/custom_checks/)** - Example custom validation rules
1002
+ - **[Library Usage Examples](examples/library-usage/)** - Python SDK examples
1003
+ - **[Test IAM Policies](examples/iam-test-policies/)** - Example policies for testing
1004
+
1005
+ ### Advanced Topics
1006
+ - **[Roadmap](docs/ROADMAP.md)** - Planned features and improvements
1007
+ - **[AWS Services Backup Guide](docs/aws-services-backup.md)** - Offline validation setup
1008
+ - **[Publishing Guide](docs/development/PUBLISHING.md)** - Release process for maintainers
1009
+
1010
+ ### Quick Links
1011
+ - **[GitHub Issues](https://github.com/boogy/iam-policy-validator/issues)** - Report bugs or request features
1012
+ - **[GitHub Discussions](https://github.com/boogy/iam-policy-validator/discussions)** - Ask questions and share ideas
1013
+
1014
+ ## 🤝 Contributing
1015
+
1016
+ Contributions are welcome! We appreciate your help in making this project better.
1017
+
1018
+ ### How to Contribute
1019
+
1020
+ 1. **Read the [Contributing Guide](CONTRIBUTING.md)** - Comprehensive guide for contributors
1021
+ 2. **Check [existing issues](https://github.com/boogy/iam-policy-validator/issues)** - Find something to work on
1022
+ 3. **Fork the repository** - Create your own copy
1023
+ 4. **Make your changes** - Follow our code quality standards
1024
+ 5. **Submit a Pull Request** - We'll review and merge
1025
+
1026
+ ### Development Setup
1027
+
1028
+ ```bash
1029
+ # Clone your fork
1030
+ git clone https://github.com/YOUR-USERNAME/iam-policy-validator.git
1031
+ cd iam-policy-validator
1032
+
1033
+ # Install dependencies
1034
+ uv sync --extra dev
1035
+
1036
+ # Run tests
1037
+ uv run pytest
1038
+
1039
+ # Run linting
1040
+ uv run ruff check .
1041
+ ```
1042
+
1043
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed instructions.
1044
+
1045
+ ## 📄 License
1046
+
1047
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
1048
+
1049
+ ### Third-Party Code
1050
+
1051
+ Portions of the ARN pattern matching code in [`iam_validator/sdk/arn_matching.py`](iam_validator/sdk/arn_matching.py) are derived from [Parliament](https://github.com/duo-labs/parliament) (Copyright 2019 Duo Security, [BSD 3-Clause License](https://github.com/duo-labs/parliament/blob/master/LICENSE)). See file header for details.
1052
+
1053
+ ## 🆘 Support
1054
+
1055
+ - **Documentation**: Check the [docs/](docs/) directory
1056
+ - **Issues**: Report bugs or request features via [GitHub Issues](https://github.com/boogy/iam-policy-validator/issues)
1057
+ - **Questions**: Ask questions in [GitHub Discussions](https://github.com/boogy/iam-policy-validator/discussions)