workspace/skills/ise-posture-audit/SKILL.md
Cisco ISE posture and policy audit - authorization rules, posture compliance, profiling gaps, TrustSec SGT matrix, active session health. Use when running a periodic ISE compliance audit, reviewing authorization policies for over-permissiveness, checking TrustSec segmentation, assessing endpoint profiling accuracy, or preparing for SOC2 or PCI-DSS review.
npx skillsauth add automateyournetwork/netclaw ise-posture-auditInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
All ISE tools are called via mcp-call with the ISE MCP server command:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" TOOL_NAME '{"param":"value"}'
Start every audit with a fresh cache to ensure current data:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" clear_cache '{}'
Verify connectivity and cache state:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" get_cache_stats '{}'
Pull all policy sets, then drill into authorization rules:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" network_access_policy_set '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" network_access_authorization_rules '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" network_access_authentication_rules '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" network_access_conditions '{}'
Authorization Policy Checks:
| Check | What to Look For | Severity If Found | |-------|-----------------|-------------------| | Default Allow | Default rule granting PermitAccess or DenyAccess without conditions | CRITICAL | | Overly permissive rules | AuthZ rules with no posture condition and full network access | CRITICAL | | Stale rules | Rules referencing deleted/unused identity groups or conditions | HIGH | | Rule ordering | Permissive rules ranked above restrictive rules (shadowing) | HIGH | | Missing posture check | AuthZ rules that grant access without posture assessment | MEDIUM | | Duplicate conditions | Multiple rules with identical match criteria | LOW |
Review endpoints and identity groups to identify posture gaps:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" endpoints '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" identity_groups '{}'
Posture Compliance Checks:
| Check | What to Look For | Severity If Found | |-------|-----------------|-------------------| | Endpoints bypassing posture | Endpoints with full access but no posture assessment recorded | CRITICAL | | Non-compliant endpoints on network | Endpoints marked non-compliant but not quarantined | CRITICAL | | Missing posture policy for endpoint type | Endpoint categories (BYOD, IoT, contractor) without posture rules | HIGH | | Posture reassessment interval | No periodic reassessment configured (one-time posture only) | MEDIUM | | Unknown endpoints with access | Endpoints in "Unknown" group with network access beyond guest | HIGH |
Assess how well ISE is profiling connected endpoints:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" profiler_profiles '{}'
Cross-reference with the endpoint list from Step 3.
Profiling Checks:
| Check | What to Look For | Severity If Found | |-------|-----------------|-------------------| | Unknown endpoint ratio | More than 10% of endpoints profiled as "Unknown" | HIGH | | Unmatched profiles | Custom profiles with zero matched endpoints (dead profiles) | LOW | | Missing critical profiles | No profiles for known device types on the network (printers, phones, cameras) | MEDIUM | | Profile certainty | Endpoints with low certainty factor (< 20) receiving production access | HIGH | | Profiling probe coverage | Insufficient probe types enabled for accurate classification | MEDIUM |
Review Security Group Tags and their access control:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" trustsec_sgts '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" trustsec_sgacls '{}'
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" trustsec_egress_matrix_cell '{}'
TrustSec Checks:
| Check | What to Look For | Severity If Found |
|-------|-----------------|-------------------|
| Permit-all SGACLs | SGACLs with permit ip (no restrictions between segments) | CRITICAL |
| Missing matrix cells | SGT-to-SGT pairs with no defined policy (defaults to permit or deny?) | HIGH |
| Unused SGTs | SGTs defined but assigned to zero endpoints | LOW |
| Overly broad SGTs | Single SGT assigned to endpoints with different trust levels | HIGH |
| No deny logging | SGACLs with deny rules but no log keyword | MEDIUM |
| Flat segmentation | Fewer than 3 SGTs defined (minimal micro-segmentation) | HIGH |
Review current active sessions for anomalies:
ISE_BASE=$ISE_BASE USERNAME=$ISE_USERNAME PASSWORD=$ISE_PASSWORD python3 $MCP_CALL "python3 -u $ISE_MCP_SCRIPT" active_sessions '{}'
Session Health Checks:
| Check | What to Look For | Severity If Found | |-------|-----------------|-------------------| | Long-lived sessions | Sessions active for > 24 hours without reauthentication | MEDIUM | | Failed auth spikes | Multiple failed authentications from same MAC/IP in short window | HIGH | | Guest on production VLAN | Guest-profiled endpoints on non-guest VLANs | CRITICAL | | Multiple MACs per port | More than expected endpoints on a single switchport (hub or rogue AP) | HIGH | | Auth method mismatch | Endpoints using MAB when 802.1X is expected for that device type | MEDIUM |
CRITICAL -- Immediate risk of unauthorized access or data exfiltration:
HIGH -- Significant policy gap that could be exploited:
MEDIUM -- Policy weakness that should be addressed this cycle:
LOW -- Housekeeping and hygiene items:
ISE Posture Audit Report
ISE Deployment: $ISE_BASE
Audit Date: YYYY-MM-DD
CRITICAL FINDINGS (Immediate Action Required):
1. [C-001] Default AuthZ rule grants PermitAccess — all unmatched endpoints get full access
2. [C-002] 14 endpoints marked non-compliant but not quarantined
3. [C-003] SGACL "Permit_All" applied to IoT-to-Server matrix cell
HIGH FINDINGS (Address This Week):
4. [H-001] 23% of endpoints profiled as "Unknown" — profiling gap
5. [H-002] SGT "Employees" assigned to both corporate laptops and contractor devices
6. [H-003] 3 authorization rules shadowed by permissive rule at rank 1
MEDIUM FINDINGS (Address This Month):
7. [M-001] No posture reassessment configured — one-time check only
8. [M-002] 47 sessions active > 24h without reauthentication
9. [M-003] 12 endpoints using MAB instead of expected 802.1X
LOW / INFORMATIONAL:
10. [L-001] 5 unused SGTs: "Test_SGT", "Legacy_Printers", etc.
11. [L-002] 3 profiler profiles with zero matched endpoints
Summary: 3 Critical | 3 High | 3 Medium | 2 Low
Policy Sets Reviewed: N
Authorization Rules Reviewed: N
Endpoints Analyzed: N
SGTs Evaluated: N
Active Sessions Checked: N
After completing the audit, record the session in GAIT:
python3 $MCP_CALL "python3 -u $GAIT_MCP_SCRIPT" gait_record_turn '{"input":{"role":"assistant","content":"ISE posture audit completed. ISE: $ISE_BASE. Findings: 3 CRITICAL, 3 HIGH, 3 MEDIUM, 2 LOW. Critical items: default permit-all AuthZ rule, 14 non-compliant endpoints not quarantined, permit-all SGACL on IoT-to-Server cell.","artifacts":[]}}'
Generate a policy hierarchy mind map for the audit report:
python3 $MCP_CALL "node $MARKMAP_MCP_SCRIPT" markmap_customize '{"markdown_content":"# ISE Policy Audit\n## CRITICAL\n### Default AuthZ permits all\n### Non-compliant endpoints active\n### Permit-all SGACL\n## HIGH\n### 23% Unknown endpoints\n### SGT overlap (employees + contractors)\n### Shadowed AuthZ rules\n## MEDIUM\n### No posture reassessment\n### Long-lived sessions\n### MAB instead of 802.1X\n## LOW\n### Unused SGTs\n### Dead profiler profiles","theme":"dark"}'
testing
Human-in-the-loop escalation via HumanRail — route low-confidence agent decisions, pre-destructive operation approvals, and ambiguous incident tickets to real human engineers. Human answers are verified and returned as structured output. Workers are paid via Lightning Network. Use when the agent is uncertain, when a destructive change needs explicit human sign-off beyond a ServiceNow CR, or when an ambiguous ticket requires human triage before automated handling.
testing
Manage EVE-NG node lifecycle. Use when listing nodes, checking runtime state, creating or deleting nodes, starting or stopping nodes or whole labs, verifying node details, or wiping node NVRAM back to factory defaults.
development
Manage EVE-NG labs and platform inventory. Use when listing labs, checking lab metadata, creating or deleting labs, importing or exporting lab archives, checking EVE-NG health or auth, or verifying available node images before build work.
tools
Execute live CLI commands on running EVE-NG nodes over telnet console. Use when running show commands, making live config changes, verifying protocol state, testing connectivity, checking console readiness, or interacting with IOS, Junos, VPCS, EOS, or NX-OS nodes.