Bounded access-policy change audit with explainable counterexamples
Dependencies
moon run cmd/main -- audit examples/saas/before.policy examples/saas/after.policy examples/saas/universe.txt
moon run cmd/main -- audit examples/ai-tools/before.policy examples/ai-tools/after.policy examples/ai-tools/universe.txt
moon run cmd/main -- audit examples/finance/before.policy examples/finance/after.policy examples/finance/universe.txt json
moon run cmd/main -- audit examples/finance/before.policy examples/finance/after.policy examples/finance/universe.txt attribution
moon run cmd/main -- verify examples/finance/before.policy examples/finance/universe.txt examples/finance/expected-before.txt
moon run cmd/main -- impact examples/saas/after.policy examples/saas/universe.txt
moon run cmd/main -- audit examples/saas/before.policy examples/saas/after.policy examples/saas/universe.txt groups
moon run cmd/main -- audit examples/saas/before.policy examples/saas/after.policy examples/saas/universe.txt witnesses
moon run cmd/main -- scope examples/saas/universe.txt read,export
moon run cmd/main -- audit examples/finance/before.policy examples/finance/after.policy examples/finance/universe.txt structuralpolicy NAME
inherit CHILD_ROLE PARENT_ROLE
rule ID permit|deny ROLES ACTIONS RESOURCE_KINDS RESOURCE_IDS any|same|other CONDITIONSprincipal ID TENANT ROLE1,ROLE2 KEY=VALUE,...
resource ID KIND TENANT KEY=VALUE,...
request PRINCIPAL_ID ACTION RESOURCE_ID KEY=VALUE,...
matrix ACTION1,ACTION2moon check --target js
moon test --target js
moon build --target js
moon info
moon fmtpub(all) struct AccessPolicy {
name : String
role_inheritance : Array[RoleInheritance]
rules : Array[AccessRule]
} derive(Eq, Debug)pub(all) struct AccessRule {
id : String
effect : RuleEffect
roles : Array[String]
actions : Array[String]
resource_kinds : Array[String]
resource_ids : Array[String]
tenant_relation : TenantRelation
conditions : Array[AttributeCondition]
} derive(Eq, Debug)pub(all) struct ActionBudget {
action : String
max_new_grants : Int
max_revocations : Int
} derive(Debug)pub(all) struct AttributeCondition {
source : AttributeSource
key : String
operator : AttributeOperator
value : String
} derive(Eq, Debug)pub(all) struct AttributedChange {
request : AccessRequest
kind : ChangeKind
cause : ChangeCause
changed_rule_ids : Array[String]
role_edges_changed : Bool
} derive(Debug)pub(all) struct AuditReport {
before_name : String
after_name : String
requests_considered : Int
changes : Array[DecisionChange]
diagnostics : Array[Diagnostic]
complete : Bool
} derive(Eq, Debug)pub(all) struct ChangeGroup {
principal_tenant : String
resource_tenant : String
action : String
new_grants : Int
revocations : Int
unchanged : Int
inconclusive : Int
} derive(Debug)pub(all) struct DecisionChange {
request : AccessRequest
before : Decision
after : Decision
kind : ChangeKind
} derive(Eq, Debug)pub(all) struct DecisionExpectation {
principal_id : String
action : String
resource_id : String
expected : DecisionKind
} derive(Debug)pub(all) struct Diagnostic {
code : String
severity : DiagnosticSeverity
message : String
} derive(Eq, Debug)pub(all) struct ExpectationResult {
expectation : DecisionExpectation
actual : DecisionKind
matched_requests : Int
passed : Bool
} derive(Debug)pub(all) struct MatrixExpansion {
universe : RequestUniverse
generated_requests : Int
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct ParsedExpectations {
expectations : Array[DecisionExpectation]
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct ParsedUniverse {
universe : RequestUniverse
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct RequestUniverse {
principals : Array[Principal]
resources : Array[AccessResource]
requests : Array[AccessRequest]
} derive(Eq, Debug)pub(all) struct RuleCoverage {
rule_id : String
matched_requests : Int
decisive_requests : Int
} derive(Debug)pub(all) struct RuleImpact {
rule_id : String
grants_when_removed : Int
revocations_when_removed : Int
example_grant : AccessRequest?
example_revocation : AccessRequest?
} derive(Debug)pub(all) struct RuleImpactReport {
policy_name : String
impacts : Array[RuleImpact]
diagnostics : Array[Diagnostic]
complete : Bool
} derive(Debug)pub(all) struct RuleTrace {
rule_id : String
effect : RuleEffect
matched : Bool
reason : String
} derive(Eq, Debug)pub(all) struct ScopeCoverage {
possible_requests : Int
represented_requests : Int
missing_requests : Int
missing_examples : Array[AccessRequest]
complete : Bool
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct StructuralDiff {
rules : Array[RuleDelta]
added_role_edges : Array[RoleInheritance]
removed_role_edges : Array[RoleInheritance]
} derive(Debug)pub(all) struct VerificationReport {
policy_name : String
passed : Int
failed : Int
inconclusive : Int
results : Array[ExpectationResult]
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct WitnessGroup {
kind : ChangeKind
action : String
resource_kind : String
cross_tenant : Bool
before_rules : Array[String]
after_rules : Array[String]
occurrences : Int
example : AccessRequest
} derive(Debug)pub(all) struct WitnessSelection {
groups : Array[WitnessGroup]
total_changed_requests : Int
omitted_groups : Int
complete : Bool
} derive(Debug)fn analyze_scope(universe : RequestUniverse, actions : Array[String], max_combinations : Int) -> ScopeCoveragefn attribute_changes(before : AccessPolicy, after : AccessPolicy, universe : RequestUniverse) -> Array[AttributedChange]fn compare_policies(before : AccessPolicy, after : AccessPolicy, universe : RequestUniverse) -> AuditReportfn condition_matches(condition : AttributeCondition, principal : Principal, resource : AccessResource, request : AccessRequest) -> Boolfn evaluate_request(policy : AccessPolicy, universe : RequestUniverse, request : AccessRequest) -> Decisionfn evaluate_validated(policy : AccessPolicy, universe : RequestUniverse, request : AccessRequest) -> Decisionfn expand_request_matrix(universe : RequestUniverse, actions : Array[String], max_requests : Int) -> MatrixExpansionfn glob_matches(pattern : String, value : String) -> Boolfn matching_rule_ids(policy : AccessPolicy, principal : Principal, resource : AccessResource, request : AccessRequest) -> Array[String]fn rule_match_trace(rule : AccessRule, roles : Array[String], principal : Principal, resource : AccessResource, request : AccessRequest) -> RuleTracefn select_witnesses(report : AuditReport, universe : RequestUniverse, max_groups : Int) -> WitnessSelectionfn verify_expectations(policy : AccessPolicy, universe : RequestUniverse, expectations : Array[DecisionExpectation]) -> VerificationReportInstall
Download zipBounded access-policy change audit with explainable counterexamples
Dependencies