Acl rule analysis
Skill vahagn-madatyan/netsec-skills-suite/skills/acl-rule-analysis
The Complete Network & Network Security Skills Suite
npx -y skills add vahagn-madatyan/netsec-skills-suite --skill acl-rule-analysisAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Vendor-agnostic ACL and firewall rule analysis with shadowed rule detection, overly permissive rule identification, unused rule discovery, redundant rule flagging, and rule ordering optimization. Covers ACLs (Cisco/JunOS/EOS) and firewall policies (PAN-OS/FortiGate/CheckPoint).
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
17.1 KB, as published. Nobody here has run it
ACL and Firewall Rule Analysis
Vendor-agnostic rule analysis for access control lists and firewall policies. Unlike vendor-specific firewall audit skills that evaluate platform features (App-ID, Security Profile Groups, zone protection), this skill focuses on universal rule patterns that apply across all platforms: shadowed rules, redundant rules, overly permissive rules, and unused rules.
Covers ACL-based platforms (Cisco IOS/IOS-XE/ASA, Juniper JunOS, Arista EOS) and policy-based firewalls (Palo Alto PAN-OS, Fortinet FortiGate, Check Point). The analysis algorithms are vendor-agnostic — only the rule retrieval commands differ by platform.
Commands use inline labels [Cisco], [JunOS], [EOS], [PAN-OS],
[FortiGate], [CheckPoint] where syntax diverges. Unlabeled statements
apply universally. See references/cli-reference.md for full command tables
and references/rule-patterns.md for detection algorithm details.
When to Use
- Post-migration rule cleanup after converting from one platform to another
- Periodic rulebase hygiene to remove accumulated technical debt
- Compliance preparation requiring rule-level justification and minimal privilege
- Incident investigation — determining whether a rule permitted malicious traffic
- Change validation after rulebase modifications to confirm no shadowed rules
- Capacity optimization — reducing rule count to improve lookup performance
- Merger/acquisition integration — consolidating overlapping rulebases
Prerequisites
- Read-only access to the target device via SSH, console, or API
- Rulebase with hit counters enabled (most platforms enable by default)
- For unused rule detection: hit count data accumulated over an extended period (30+ days minimum, 90 days recommended for seasonal traffic patterns)
- Knowledge of intended security policy — which traffic should be permitted and which should be denied between network segments
- Understanding of implicit deny behavior for the platform (varies — see Troubleshooting)
Procedure
Follow this analysis flow sequentially. Each step builds on prior findings. The procedure moves from data collection through pattern detection to consolidated recommendations.
Step 1: Collect Rulebase
Retrieve the full ACL or firewall policy from the target device.
[Cisco] IOS/IOS-XE:
show ip access-lists
show access-lists
[Cisco] ASA:
show access-list
show running-config access-list
[JunOS]
show configuration firewall family inet filter
show firewall filter
[EOS]
show ip access-lists
show access-lists counters
[PAN-OS]
show running security-policy
[FortiGate]
get firewall policy
[CheckPoint] SmartConsole CLI or Expert mode:
fw stat -l
Record each rule: sequence number/name, match criteria (source, destination, protocol, port/service), action (permit/deny/drop/reject), and hit count. Normalize the data into a common format for analysis.
Step 2: Identify Shadowed Rules
A rule is shadowed when a preceding rule matches all traffic that the shadowed rule would match. The shadowed rule never triggers because the earlier rule always matches first.
Detection algorithm:
- For each rule R at position N, examine all rules at positions 1 through N-1.
- If any preceding rule P has match criteria that is a superset of R's criteria and the same or broader action scope, then R is shadowed by P.
- A superset means P's source contains R's source, P's destination contains R's destination, and P's service/port contains R's service/port.
Critical case: A permit rule shadowing a deny rule means traffic intended to be blocked is actually permitted. This is a security gap — flag as Critical.
Benign case: A deny rule shadowing another deny rule is a redundancy issue, not a security gap — flag as Medium.
Verify suspected shadows by checking hit counts: a truly shadowed rule has zero hits despite the traffic pattern existing in the network.
Step 3: Detect Overly Permissive Rules
Identify rules with excessively broad match criteria that violate least privilege. Risky patterns by platform:
ACL platforms (Cisco, JunOS, EOS):
permit ip any any— allows all IPv4 traffic, bypasses all filteringpermit ip any <broad-subnet>where subnet is /8 or largerpermit tcp any any eq <high-risk-port>— unrestricted source to sensitive service (e.g., SSH, RDP, SQL)
Policy platforms (PAN-OS, FortiGate, CheckPoint):
- Source
any+ Destinationany+ Actionallow - Application/service set to
anyorall - Broad service groups containing dozens of ports
For each overly permissive rule found, check its hit count and traffic logs to determine actual usage patterns. Many "any/any" rules exist as legacy migration artifacts that can be narrowed to observed traffic.
Step 4: Find Unused Rules
Unused rules are those with zero hit count over an extended observation period.
[Cisco] Check hit counts inline with show access-lists output.
[JunOS] show firewall filter <name> counter — per-term counters.
[EOS] show access-lists counters — per-entry match counts.
[PAN-OS] show rule-hit-count vsys vsys1 security rules all
[FortiGate] diagnose firewall iprope list — per-policy packet/byte counts.
[CheckPoint] SmartConsole → Policy → hit count column, or cpstat fw -f policy
Caveats for unused rule detection:
- Hit counters reset on device reboot — verify uptime before concluding a rule is unused
- Seasonal traffic (quarterly reports, annual processes) may not appear in 30-day windows — extend observation to 90+ days when possible
- Backup/failover paths only activate during outages — low hit count does not mean the rule is unnecessary
- Unused deny rules are low-risk findings; unused permit rules waste rulebase space and may indicate abandoned access that should be revoked
Step 5: Identify Redundant Rules
Redundant rules have overlapping match criteria and the same action. They increase rulebase complexity without adding security value.
Detection approach:
- Group rules by action (permit/deny).
- Within each group, compare pairs for overlapping source, destination, and service criteria.
- If rule A's match criteria is a subset of rule B's and both have the same action, rule A is redundant (B already covers it).
- If two rules have identical match criteria and the same action, one is a direct duplicate.
Merge candidates: rules with adjacent or overlapping source/destination ranges and the same action can often be consolidated into a single rule with a summarized address range.
Step 6: Rule Ordering Optimization
Rule ordering affects both security and performance.
Performance optimization: Place highest-hit-count rules near the top. ACL platforms evaluate rules sequentially — a rule matching 80% of traffic at position 50 forces 49 unnecessary comparisons per packet.
Security optimization: Place most-specific deny rules before broader permit rules to ensure explicit blocks take precedence.
Conflict analysis: When a permit rule and a deny rule match the same traffic, the first-match rule determines the outcome. Identify all permit/deny conflicts and verify the intended rule wins by position.
Review current ordering:
- Sort rules by hit count (descending).
- Compare current position against hit-count-optimal position.
- Identify rules where reordering would improve performance without changing security posture.
- Flag any reordering that would change effective policy (a permit moving above a deny or vice versa) — these require explicit approval.
Step 7: Generate Consolidated Recommendations
Compile findings from Steps 2–6 into a prioritized remediation list.
Prioritization order:
- Critical: Shadowed deny rules (security gap) and any/any permits
- High: Overly permissive rules with active traffic, unused permit rules
- Medium: Redundant rules, suboptimal ordering, unused deny rules
- Low: Cosmetic issues (naming, comments, organization)
For each finding, document: the rule identifier, the finding category, the specific risk, and the recommended action (remove, narrow, reorder, merge).
Threshold Tables
Rule Risk Severity Classification
| Finding | Severity | Rationale |
|---|---|---|
| Permit rule shadowing a deny rule | Critical | Traffic intended to be blocked is permitted |
permit ip any any / any-any-allow | Critical | No filtering — all traffic passes |
| Broad subnet permit (source or dest ≥/8) | High | Overly wide scope; likely exceeds intent |
| Unused permit rule (0 hits, 30+ days) | High | Abandoned access — potential unauthorized path |
Permit with any source to sensitive service | High | Unrestricted access to high-risk ports |
| Redundant rules (same action, overlapping match) | Medium | Complexity without security value |
| Suboptimal rule ordering (high-hit rule low in list) | Medium | Performance impact on sequential evaluation |
| Shadowed deny by another deny | Medium | Redundancy, not a security gap |
| Unused deny rule (0 hits, 30+ days) | Low | Minimal risk; cleanup recommended |
| Missing rule comments/descriptions | Low | Maintainability concern |
Hit Count Staleness Thresholds
| Observation Period | Confidence | Action |
|---|---|---|
| < 7 days | Very Low | Insufficient data — do not remove rules based on hit count |
| 7–29 days | Low | Flag for review; extend observation period |
| 30–89 days | Moderate | Reasonable basis for unused rule identification |
| 90+ days | High | Strong evidence for rule removal or narrowing |
| 180+ days | Very High | Recommend removal with change control documentation |
Decision Trees
Remediation Priority
Found a flagged rule
├── Is the rule overly permissive (any/any)?
│ ├── Yes
│ │ ├── Is it actively used (hit count > 0)?
│ │ │ ├── Yes → Analyze traffic logs to narrow match criteria
│ │ │ │ ├── Can it be narrowed to specific IPs/services?
│ │ │ │ │ ├── Yes → Create replacement rules, test, then remove original
│ │ │ │ │ └── No → Document business justification, add compensating controls
│ │ │ │ └── Is there a Security Profile/IPS covering this rule?
│ │ │ │ ├── Yes → Lower priority, but still narrow when feasible
│ │ │ │ └── No → High priority — no inspection on broad permit
│ │ │ └── No (zero hits) → Schedule removal with change control
│ │ └── Severity: Critical
│ └── No
│ ├── Is the rule shadowed?
│ │ ├── Shadowed deny (by a permit) → Critical — security gap
│ │ ├── Shadowed permit (by another permit) → Medium — remove redundancy
│ │ └── Shadowed deny (by another deny) → Low — remove redundancy
│ ├── Is the rule unused?
│ │ ├── Unused permit → High — revoke abandoned access
│ │ └── Unused deny → Low — cleanup at convenience
│ └── Is the rule redundant?
│ └── Merge with covering rule → Medium
Rule Reordering Safety Check
Proposed rule reorder
├── Does the reorder change which rule matches any traffic flow?
│ ├── Yes → STOP — this is a policy change, not just optimization
│ │ ├── Would a deny move below a permit for the same traffic?
│ │ │ ├── Yes → REJECT — security degradation
│ │ │ └── No → Evaluate as an intentional policy change
│ │ └── Submit for change control review
│ └── No → Safe to reorder for performance
│ ├── Validate with test traffic or policy simulation
│ └── Implement during maintenance window
Report Template
# ACL / Firewall Rule Analysis Report
## Executive Summary
- **Device:** [hostname]
- **Platform:** [Cisco IOS / ASA / JunOS / EOS / PAN-OS / FortiGate / CheckPoint]
- **Rulebase Size:** [total rules]
- **Analysis Date:** [timestamp]
- **Performed By:** [operator/agent]
- **Observation Period for Hit Counts:** [start date] to [end date] ([N] days)
**Summary:** [N] findings across [rules examined] rules. [critical count]
Critical, [high count] High, [medium count] Medium, [low count] Low.
## Shadowed Rules
| Rule # | Rule Name | Shadowed By | Match Overlap | Severity | Action |
|--------|-----------|-------------|---------------|----------|--------|
| [seq] | [name] | Rule [seq] | [description] | [sev] | Remove / Reorder |
## Overly Permissive Rules
| Rule # | Rule Name | Source | Destination | Service | Hit Count | Severity |
|--------|-----------|--------|-------------|---------|-----------|----------|
| [seq] | [name] | [src] | [dst] | [svc] | [count] | [sev] |
**Recommendation:** [Narrow to observed traffic / Add compensating controls]
## Unused Rules
| Rule # | Rule Name | Action | Last Hit | Days Observed | Severity |
|--------|-----------|--------|----------|---------------|----------|
| [seq] | [name] | [act] | [date] | [days] | [sev] |
**Recommendation:** [Remove with change control / Extend observation period]
## Redundant Rules
| Rule # | Rule Name | Redundant With | Overlap Type | Recommendation |
|--------|-----------|----------------|--------------|----------------|
| [seq] | [name] | Rule [seq] | [type] | Merge / Remove |
## Ordering Recommendations
| Current Position | Rule # | Hit Count | Optimal Position | Impact |
|-----------------|--------|-----------|------------------|--------|
| [pos] | [seq] | [count] | [new pos] | [desc] |
## Prioritized Remediation Plan
1. [Critical] [Finding description] — [Specific action]
2. [High] [Finding description] — [Specific action]
3. [Medium] [Finding description] — [Specific action]
## Next Review
- **Critical findings present:** Re-audit in 30 days after remediation
- **High findings only:** Re-audit in 90 days
- **Medium/Low only:** Re-audit in 180 days
Troubleshooting
Hit Counters Reset After Reboot
Most platforms reset ACL/policy hit counters on reboot. Before concluding
a rule is unused, verify device uptime:
[Cisco] show version | include uptime,
[JunOS] show system uptime,
[EOS] show uptime,
[PAN-OS] show system info | match uptime,
[FortiGate] get system performance status,
[CheckPoint] cpstat os -f ifconfig.
If uptime is less than the desired observation period, hit count data is
incomplete.
ACL vs Firewall Policy Semantic Differences
ACL-based platforms (Cisco IOS, EOS) evaluate rules top-to-bottom with first-match semantics. Firewall policy platforms (PAN-OS, FortiGate, CheckPoint) also use first-match but have additional dimensions (zones, applications, user identity) that affect matching. Shadowed rule detection must account for all match dimensions on policy platforms, not just source/destination/port.
Implicit Deny Handling Varies by Platform
[Cisco] ACLs have an implicit deny ip any any at the end (not shown
in the ACL output). [JunOS] Firewall filters have an implicit discard
at the end of each term list. [EOS] Follows Cisco convention with
implicit deny. [PAN-OS] Has configurable interzone-default and
intrazone-default rules (deny and allow respectively). [FortiGate]
Implicit deny at end of policy list. [CheckPoint] Implicit drop rule
at end of policy (configurable in SmartConsole).
Account for implicit deny when analyzing rule coverage — the absence of an explicit deny at the bottom is intentional on most platforms.
Large Rulebases (500+ Rules)
Manual analysis of large rulebases is impractical. Export the rulebase
programmatically for automated analysis:
[Cisco] Parse show access-lists output.
[PAN-OS] Use XML API to export the full policy as structured data.
[FortiGate] Use REST API (/api/v2/cmdb/firewall/policy).
[CheckPoint] Use Management API (mgmt_cli show access-rulebase).
Prioritize analysis by hit count — start with the highest-traffic rules
and work down.
False Positives in Shadowed Rule Detection
Object groups, address groups, and nested service groups can create false positive shadow detections. When rule A uses an address group and rule B uses individual addresses that are members of that group, automated tools may report B as shadowed. Expand all groups to their member objects before running shadow comparisons.