iam-policy-validator 1.0.3__tar.gz → 1.1.0__tar.gz
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.
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/.github/workflows/release.yml +4 -3
- iam_policy_validator-1.1.0/.python-version +1 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/CONTRIBUTING.md +41 -31
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/DOCS.md +388 -189
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/Makefile +7 -1
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/PKG-INFO +210 -436
- iam_policy_validator-1.1.0/README.md +716 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/action.yaml +3 -3
- iam_policy_validator-1.0.3/iam-validator.yaml → iam_policy_validator-1.1.0/default-config.yaml +98 -12
- iam_policy_validator-1.1.0/docs/configuration.md +220 -0
- iam_policy_validator-1.1.0/docs/custom-checks.md +558 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/configs/action-condition-enforcement-advanced.yaml +7 -7
- iam_policy_validator-1.1.0/examples/configs/config-privilege-escalation.yaml +36 -0
- iam_policy_validator-1.1.0/examples/configs/custom-business-rules.yaml +84 -0
- iam_policy_validator-1.1.0/examples/configs/custom-wildcard-config.yaml +44 -0
- iam_policy_validator-1.1.0/examples/configs/none_of_example.yaml +54 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/configs/unified-condition-enforcement.yaml +5 -6
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/insecure_policy.json +7 -1
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/__version__.py +1 -1
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/action_condition_enforcement.py +112 -28
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/security_best_practices.py +103 -12
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/commands/validate.py +7 -5
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/cli.py +26 -9
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/config_loader.py +39 -3
- iam_policy_validator-1.1.0/iam_validator/core/defaults.py +304 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/__init__.py +2 -0
- iam_policy_validator-1.1.0/iam_validator/core/formatters/console.py +59 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/csv.py +7 -2
- iam_policy_validator-1.1.0/iam_validator/core/formatters/enhanced.py +428 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/html.py +127 -37
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/markdown.py +10 -2
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/models.py +30 -6
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/report.py +104 -25
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/pyproject.toml +1 -1
- iam_policy_validator-1.1.0/scripts/sync_defaults_from_yaml.py +204 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_config_loader.py +19 -10
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_models.py +8 -2
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/uv.lock +1 -1
- iam_policy_validator-1.0.3/.python-version +0 -1
- iam_policy_validator-1.0.3/README.md +0 -942
- iam_policy_validator-1.0.3/examples/configs/config-privilege-escalation.yaml +0 -36
- iam_policy_validator-1.0.3/examples/configs/custom-business-rules.yaml +0 -83
- iam_policy_validator-1.0.3/examples/configs/custom-wildcard-config.yaml +0 -44
- iam_policy_validator-1.0.3/examples/configs/none_of_example.yaml +0 -54
- iam_policy_validator-1.0.3/iam_validator/core/formatters/console.py +0 -22
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/.github/dependabot.yml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/.github/workflows/ci.yml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/.gitignore +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/LICENSE +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/docs/README.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/docs/development/PUBLISHING.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/README.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/access-analyzer/example1.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/access-analyzer/example2.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/README.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/advanced_multi_condition_validator.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/cross_account_external_id_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/domain_restriction_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/encryption_required_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/mfa_required_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/region_restriction_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/tag_enforcement_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/custom_checks/time_based_access_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/README.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/access-analyzer-only.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/action-examples.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/basic-validation.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/custom-policy-checks.yml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/multi-region-validation.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/resource-policy-validation.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/sequential-validation.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/github-actions/two-step-validation.yaml +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/README-privilege-escalation.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/api_gateway_management.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/athena_query_access.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/backup_vault_access.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/cloudformation_deployer.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/cloudwatch_monitoring.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/cognito_user_pool.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/dynamodb_table_access.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/ecs_task_execution.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/eventbridge_rules.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/glue_etl_jobs.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/invalid_policy.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/kms_encryption_keys.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/lambda_developer.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/maximum_size_policy.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/policy_missing_required_tags.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/policy_tag_enforcement_example.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/policy_with_wildcard_resources.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/privilege_escalation_scattered.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/rds_database_admin.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/sample_policy.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/secrets_manager_access.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/sns_sqs_messaging.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/step_functions_workflow.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/test_none_of_valid.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/test_none_of_violations.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/examples/policies/test-cases/wildcard_examples.json +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/__main__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/action_validation.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/condition_key_validation.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/policy_size.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/resource_validation.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/checks/sid_uniqueness.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/commands/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/commands/analyze.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/commands/base.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/commands/post_to_pr.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/access_analyzer.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/access_analyzer_report.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/aws_fetcher.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/aws_global_conditions.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/check_registry.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/base.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/json.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/formatters/sarif.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/policy_checks.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/policy_loader.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/core/pr_commenter.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/integrations/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/integrations/github_integration.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/iam_validator/integrations/ms_teams.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/README.md +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/__init__.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_action_condition_enforcement.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_action_validation_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_aws_fetcher_wildcards.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_aws_global_conditions.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_check_registry.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_comment_truncation.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_condition_key_validation_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_custom_policy_checks.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_multipart_comments.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_policy_loader.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_policy_size_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_resource_validation_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_security_best_practices.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_sid_uniqueness_check.py +0 -0
- {iam_policy_validator-1.0.3 → iam_policy_validator-1.1.0}/tests/test_wildcard_allowlist.py +0 -0
|
@@ -158,12 +158,13 @@ jobs:
|
|
|
158
158
|
MAJOR=$(echo $VERSION | cut -d. -f1)
|
|
159
159
|
MINOR=$(echo $VERSION | cut -d. -f1-2)
|
|
160
160
|
|
|
161
|
-
# Update vX tag (e.g., v1)
|
|
161
|
+
# Update vX tag (e.g., v1) - annotated (unsigned by bot)
|
|
162
162
|
git tag -fa "v$MAJOR" -m "Update v$MAJOR to $VERSION"
|
|
163
163
|
git push origin "v$MAJOR" --force
|
|
164
164
|
|
|
165
|
-
# Update vX.Y tag (e.g., v1.2)
|
|
165
|
+
# Update vX.Y tag (e.g., v1.2) - annotated (unsigned by bot)
|
|
166
166
|
git tag -fa "v$MINOR" -m "Updated v$MINOR to $VERSION"
|
|
167
167
|
git push origin "v$MINOR" --force
|
|
168
168
|
|
|
169
|
-
echo "Updated tags: v$MAJOR and v$MINOR to point to $VERSION"
|
|
169
|
+
echo "✅ Updated tags: v$MAJOR and v$MINOR to point to $VERSION"
|
|
170
|
+
echo "ℹ️ Note: Automated tags are annotated but not signed by the bot."
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -132,7 +132,7 @@ iam-policy-auditor/
|
|
|
132
132
|
├── .github/workflows/ # CI/CD workflows
|
|
133
133
|
├── pyproject.toml # Project metadata and dependencies
|
|
134
134
|
├── Makefile # Development commands
|
|
135
|
-
└──
|
|
135
|
+
└── default-config.yaml # Example configuration file
|
|
136
136
|
```
|
|
137
137
|
|
|
138
138
|
## Development Workflow
|
|
@@ -400,49 +400,59 @@ For detailed publishing instructions, see [docs/development/PUBLISHING.md](docs/
|
|
|
400
400
|
|
|
401
401
|
### Creating a New Check
|
|
402
402
|
|
|
403
|
-
|
|
403
|
+
See the comprehensive [Custom Checks Guide](docs/custom-checks.md) for detailed instructions on creating custom validation checks.
|
|
404
|
+
|
|
405
|
+
**Quick Example:**
|
|
406
|
+
|
|
407
|
+
1. **Create Check File**
|
|
404
408
|
```python
|
|
405
|
-
#
|
|
409
|
+
# my_checks/mfa_check.py
|
|
406
410
|
from typing import List
|
|
407
|
-
from iam_validator.core.models import
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
411
|
+
from iam_validator.core.models import PolicyValidationIssue, PolicyStatement
|
|
412
|
+
|
|
413
|
+
def execute(statement: PolicyStatement, policy_document: dict) -> List[PolicyValidationIssue]:
|
|
414
|
+
"""Ensure sensitive actions require MFA."""
|
|
415
|
+
issues = []
|
|
416
|
+
|
|
417
|
+
sensitive_actions = ["iam:CreateUser", "iam:DeleteUser"]
|
|
418
|
+
actions = statement.action if isinstance(statement.action, list) else [statement.action]
|
|
419
|
+
|
|
420
|
+
for action in actions:
|
|
421
|
+
if action in sensitive_actions:
|
|
422
|
+
# Check for MFA condition
|
|
423
|
+
has_mfa = statement.condition and "aws:MultiFactorAuthPresent" in str(statement.condition)
|
|
424
|
+
|
|
425
|
+
if not has_mfa:
|
|
426
|
+
issues.append(
|
|
427
|
+
PolicyValidationIssue(
|
|
428
|
+
check_name="mfa_required",
|
|
429
|
+
severity="high",
|
|
430
|
+
message=f"Action '{action}' requires MFA",
|
|
431
|
+
statement_index=statement.index,
|
|
432
|
+
action=action,
|
|
433
|
+
suggestion='Add: {"Bool": {"aws:MultiFactorAuthPresent": "true"}}'
|
|
434
|
+
)
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
return issues
|
|
429
438
|
```
|
|
430
439
|
|
|
431
|
-
2. **
|
|
432
|
-
|
|
433
|
-
-
|
|
440
|
+
2. **Use the Check**
|
|
441
|
+
```bash
|
|
442
|
+
iam-validator validate --path ./policies/ --custom-checks-dir ./my_checks
|
|
443
|
+
```
|
|
434
444
|
|
|
435
445
|
3. **Add Tests**
|
|
436
446
|
```python
|
|
437
447
|
# tests/test_my_check.py
|
|
438
|
-
def
|
|
448
|
+
def test_mfa_check():
|
|
439
449
|
# Test your check
|
|
440
450
|
pass
|
|
441
451
|
```
|
|
442
452
|
|
|
443
453
|
4. **Document the Check**
|
|
444
|
-
- Add to `docs/
|
|
445
|
-
- Add example to `examples/`
|
|
454
|
+
- Add to `docs/custom-checks.md`
|
|
455
|
+
- Add example to `examples/custom_checks/`
|
|
446
456
|
|
|
447
457
|
### Adding a New Formatter
|
|
448
458
|
|