
NERC CIP Compliance Controls
FreeStreamline NERC CIP compliance for BES cyber systems.
Free · Opens the source repo
What NERC CIP Compliance Controls does
The Implementing NERC CIP Compliance Controls skill is designed for entities that need to achieve or maintain compliance with the North American Electric Reliability Corporation (NERC) Critical Infrastructure Protection (CIP) standards for Bulk Electric System (BES) cyber systems. This skill provides a structured approach to implementing key compliance controls, including asset categorization (CIP-002), electronic security perimeters (CIP-005), system security management (CIP-007), configuration management (CIP-010), and supply chain risk management (CIP-013). It also incorporates the latest updates required by the 2025 CIP standards.
This skill is particularly useful for organizations preparing for compliance audits by Regional Entities or those categorizing newly commissioned BES cyber systems. The workflow includes a systematic method for categorizing BES cyber systems based on their potential impact on the reliable operation of the Bulk Electric System. By leveraging this skill, users can effectively document their compliance efforts, ensuring that all necessary controls are in place and that they can provide adequate evidence during audits.
To utilize this skill effectively, users should have a solid understanding of NERC CIP standards and maintain a comprehensive inventory of their BES cyber systems. The skill requires access to network diagrams and firewall configurations, as well as familiarity with the NERC Glossary of Terms. With this knowledge, users can categorize their systems and generate reports that detail their compliance status, helping to streamline the compliance process and reduce the risk of non-compliance penalties.
Overall, this skill is targeted at cybersecurity professionals and compliance officers within organizations that operate BES cyber systems, providing them with the tools needed to navigate the complexities of NERC CIP compliance efficiently.
When to use it
Use this skill when your organization must comply with NERC CIP standards, especially during audits or when commissioning new BES cyber systems.
When not to use it
This skill is not suitable for non-BES industrial systems or general IT compliance frameworks.
What you can build with it
Preparing for a NERC CIP Audit
Use this skill to ensure all compliance controls are in place and to generate necessary documentation ahead of a Regional Entity audit.
Categorizing New BES Cyber Systems
When commissioning new generation or control center assets, this skill helps categorize them according to their impact on the Bulk Electric System.
Implementing 2025 CIP Updates
Utilize this skill to integrate the latest NERC CIP updates into your compliance processes, ensuring adherence to the most current standards.
How to install NERC CIP Compliance Controls
View source1. Install with the skills CLI
npx skills add mukul975/anthropic-cybersecurity-skills/implementing-nerc-cip-compliance-controls --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by mukul975Implementing NERC CIP Compliance Controls
When to Use
- When a registered entity must achieve or maintain NERC CIP compliance for BES cyber systems
- When preparing for a NERC CIP compliance audit by the Regional Entity
- When implementing the 2025 CIP standard updates (CIP-003-9, CIP-005-7, CIP-010-4, CIP-013-2)
- When categorizing BES cyber systems after commissioning new generation, transmission, or control center assets
- When developing a compliance monitoring and evidence collection program
Do not use for non-BES industrial systems (see implementing-iec-62443-security-zones), for general IT compliance frameworks (see auditing-cloud-with-cis-benchmarks), or for physical security of substations without cyber components.
Prerequisites
- Understanding of NERC CIP standards (CIP-002 through CIP-014)
- BES cyber system inventory with impact ratings (high, medium, low)
- Access to Electronic Security Perimeter (ESP) network diagrams and firewall configurations
- Compliance management system for evidence collection and audit documentation
- Familiarity with NERC Glossary of Terms (BES Cyber Asset, BES Cyber System, Electronic Access Point)
Workflow
Step 1: Categorize BES Cyber Systems (CIP-002-5.1a)
Identify and categorize all BES cyber systems based on their impact to the reliable operation of the Bulk Electric System.
#!/usr/bin/env python3
"""NERC CIP BES Cyber System Categorization Tool.
Implements CIP-002-5.1a categorization criteria to classify
BES cyber systems as high, medium, or low impact.
"""
import json
import sys
from dataclasses import dataclass, field, asdict
from datetime import datetime
@dataclass
class BESCyberSystem:
"""Represents a BES Cyber System for CIP-002 categorization."""
system_id: str
name: str
description: str
location: str
asset_type: str # control_center, generation, transmission, distribution
connected_mw: float = 0
transmission_kv: float = 0
is_control_center: bool = False
is_backup_control_center: bool = False
has_cranking_path: bool = False
has_blackstart: bool = False
is_sps_ras: bool = False # Special Protection System / Remedial Action Scheme
impact_rating: str = "" # high, medium, low
categorization_basis: str = ""
cyber_assets: list = field(default_factory=list)
class CIP002Categorizer:
"""NERC CIP-002-5.1a BES Cyber System categorization engine."""
def __init__(self):
self.systems = []
self.categorization_date = datetime.now().isoformat()
def add_system(self, system: BESCyberSystem):
self.systems.append(system)
def categorize_all(self):
"""Apply CIP-002 Attachment 1 criteria to all systems."""
for system in self.systems:
self._categorize_system(system)
def _categorize_system(self, sys):
"""Apply high, medium, low impact criteria per CIP-002 Attachment 1."""
# HIGH IMPACT criteria (CIP-002 Attachment 1, Criterion 1)
if sys.is_control_center and sys.asset_type == "control_center":
# Control Centers that perform the functional obligations
# of a Reliability Coordinator, Balancing Authority, or TOP
sys.impact_rating = "high"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 1.1: Control Center performing "
"RC/BA/TOP functional obligations"
)
return
if sys.is_backup_control_center and sys.asset_type == "control_center":
sys.impact_rating = "high"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 1.2: Backup Control Center performing "
"RC/BA/TOP functional obligations"
)
return
if sys.connected_mw >= 3000:
sys.impact_rating = "high"
sys.categorization_basis = (
f"CIP-002 Att.1 Criterion 1.3: Generation >= 3000 MW "
f"(actual: {sys.connected_mw} MW)"
)
return
# MEDIUM IMPACT criteria (CIP-002 Attachment 1, Criterion 2)
if sys.connected_mw >= 1500 and sys.asset_type == "generation":
sys.impact_rating = "medium"
sys.categorization_basis = (
f"CIP-002 Att.1 Criterion 2.1: Generation >= 1500 MW "
f"(actual: {sys.connected_mw} MW)"
)
return
if sys.transmission_kv >= 500:
sys.impact_rating = "medium"
sys.categorization_basis = (
f"CIP-002 Att.1 Criterion 2.5: Transmission >= 500 kV "
f"(actual: {sys.transmission_kv} kV)"
)
return
if sys.has_cranking_path:
sys.impact_rating = "medium"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 2.6: Cranking path element"
)
return
if sys.has_blackstart:
sys.impact_rating = "medium"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 2.7: Blackstart resource"
)
return
if sys.is_sps_ras:
sys.impact_rating = "medium"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 2.9: SPS/RAS component"
)
return
if sys.is_control_center and sys.asset_type == "generation":
sys.impact_rating = "medium"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 2.11: Generation control center "
"for medium impact generation"
)
return
# LOW IMPACT - all other BES Cyber Systems
sys.impact_rating = "low"
sys.categorization_basis = (
"CIP-002 Att.1 Criterion 3: BES Cyber System not meeting "
"high or medium impact criteria"
)
def generate_report(self):
"""Generate CIP-002 categorization report."""
high = [s for s in self.systems if s.impact_rating == "high"]
medium = [s for s in self.systems if s.impact_rating == "medium"]
low = [s for s in self.systems if s.impact_rating == "low"]
report = []
report.append("=" * 70)
report.append("NERC CIP-002-5.1a BES CYBER SYSTEM CATEGORIZATION")
report.append(f"Date: {self.categorization_date}")
report.append("=" * 70)
report.append(f"\nTotal BES Cyber Systems: {len(self.systems)}")
report.append(f" High Impact: {len(high)}")
report.append(f" Medium Impact: {len(medium)}")
report.append(f" Low Impact: {len(low)}")
for category, systems in [("HIGH", high), ("MEDIUM", medium), ("LOW", low)]:
if systems:
report.append(f"\n--- {category} IMPACT SYSTEMS ---")
for s in systems:
report.append(f" [{s.system_id}] {s.name}")
report.append(f" Location: {s.location}")
report.append(f" Type: {s.asset_type}")
report.append(f" Basis: {s.categorization_basis}")
report.append(f" Cyber Assets: {len(s.cyber_assets)}")
return "\n".join(report)
def export_json(self, output_file):
"""Export categorization to JSON for compliance evidence."""
data = {
"categorization_date": self.categorization_date,
"standard": "CIP-002-5.1a",
"systems": [asdict(s) for s in self.systems],
}
with open(output_file, "w") as f:
json.dump(data, f, indent=2)
if __name__ == "__main__":
categorizer = CIP002Categorizer()
# Example BES Cyber Systems
categorizer.add_system(BESCyberSystem(
system_id="BCS-001", name="Main Energy Control Center EMS",
description="Energy Management System for BA operations",
location="Control Center Alpha", asset_type="control_center",
is_control_center=True))
categorizer.add_system(BESCyberSystem(
system_id="BCS-002", name="Wind Farm SCADA",
description="SCADA for 500MW wind generation facility",
location="Wind Farm Delta", asset_type="generation",
connected_mw=500))
categorizer.add_system(BESCyberSystem(
system_id="BCS-003", name="Substation Alpha RTU",
description="345kV transmission substation",
location="Substation Alpha", asset_type="transmission",
transmission_kv=345))
categorizer.categorize_all()
print(categorizer.generate_report())
Step 2: Implement Electronic Security Perimeters (CIP-005-7)
Define and enforce Electronic Security Perimeters (ESP) around high and medium impact BES cyber systems with Electronic Access Points (EAP) at all boundary crossing points.
# Electronic Security Perimeter - Firewall Configuration
# CIP-005-7 R1: Electronic Security Perimeter
# Define ESP boundary for Control Center EMS (High Impact)
# All BES Cyber Assets within the ESP boundary
# Palo Alto PA-3260 - ESP Boundary Firewall
# Inbound rules - strictly limit what enters the ESP
# CIP-005-7 R1.3: All inbound/outbound access permissions documented
# Allow ICCP (Inter-Control Center Communications Protocol) from neighbor BA
set rulebase security rules ICCP-Inbound from Corporate-Zone to ESP-Zone
set rulebase security rules ICCP-Inbound source 192.168.100.10
set rulebase security rules ICCP-Inbound destination 10.20.1.50
set rulebase security rules ICCP-Inbound application iccp
set rulebase security rules ICCP-Inbound service application-default
set rulebase security rules ICCP-Inbound action allow
set rulebase security rules ICCP-Inbound log-setting CIP-Audit-Log
# Allow NTP for time synchronization (CIP-007 R5.7)
set rulebase security rules NTP-Inbound from Corporate-Zone to ESP-Zone
set rulebase security rules NTP-Inbound source 192.168.100.1
set rulebase security rules NTP-Inbound destination 10.20.1.1
set rulebase security rules NTP-Inbound application ntp
set rulebase security rules NTP-Inbound action allow
# CIP-005-7 R2: Remote Access Management
# Require Intermediate System for all remote access sessions
# CIP-005-7 R2.4: Multi-factor authentication required (2025 update)
set rulebase security rules RemoteAccess from External to DMZ-Zone
set rulebase security rules RemoteAccess destination 172.16.1.10
set rulebase security rules RemoteAccess application ssl-vpn
set rulebase security rules RemoteAccess action allow
# MFA enforced on Intermediate System (jump server)
# Default deny all other traffic
set rulebase security rules ESP-Default-Deny from any to ESP-Zone
set rulebase security rules ESP-Default-Deny action deny
set rulebase security rules ESP-Default-Deny log-setting CIP-Audit-Log
Step 3: Implement System Security Management (CIP-007-6)
Configure security controls for BES cyber assets including port management, security patching, malicious code prevention, and security event monitoring.
# CIP-007-6 Implementation Checklist
cip_007_controls:
R1_ports_services:
description: "Ports and Services Management"
requirements:
- "Disable or restrict all unnecessary physical ports (USB, serial)"
- "Disable all unnecessary logical ports and services"
- "Document all enabled ports/services with business justification"
implementation:
windows_servers: |
# Disable unnecessary services on Windows BES Cyber Assets
Set-Service -Name "RemoteRegistry" -StartupType Disabled
Set-Service -Name "WinRM" -StartupType Disabled
Set-Service -Name "Spooler" -StartupType Disabled
# Disable USB storage via Group Policy
# Computer Config > Admin Templates > System > Removable Storage Access
linux_servers: |
# Disable unnecessary services
systemctl disable cups bluetooth avahi-daemon
systemctl mask cups bluetooth avahi-daemon
# Disable USB storage
echo "blacklist usb-storage" > /etc/modprobe.d/disable-usb.conf
R2_security_patches:
description: "Security Patch Management"
requirements:
- "Track security patches for all BES Cyber Systems"
- "Evaluate patches within 35 days of availability"
- "Apply patches or document mitigation plan"
- "Test patches in non-production before deployment"
implementation:
tracking: "Use WSUS/SCCM for Windows; yum/dnf for Linux"
testing: "Maintain staging environment mirroring production"
evidence: "Document patch evaluation in compliance tracking system"
R3_malicious_code:
description: "Malicious Code Prevention"
requirements:
- "Deploy anti-malware on all applicable BES Cyber Assets"
- "Update signatures or use application allowlisting"
- "Mitigate threats from transient cyber assets"
implementation:
servers: "CrowdFalcon or Carbon Black with OT-optimized policy"
hmi_stations: "Application allowlisting (Carbon Black App Control)"
transient_devices: "Scan all removable media before connection to BCA"
R4_security_event_monitoring:
description: "Security Event Monitoring"
requirements:
- "Log security events on all high/medium impact BCS"
- "Generate alerts for detected security events"
- "Retain logs for minimum 90 days (CIP-007-6 R4.3)"
- "Review logs at minimum every 15 days"
implementation:
siem: "Splunk Enterprise Security with CIP content pack"
log_sources:
- "ESP boundary firewall logs"
- "EAP authentication logs"
- "BES Cyber Asset authentication success/failure"
- "Remote access session logs"
- "Malicious code detection events"
retention: "90 days online, 3 years archived"
R5_system_access:
description: "System Access Control"
requirements:
- "Enforce authentication for all interactive access"
- "Implement least-privilege access control"
- "Change default passwords"
- "Enforce password complexity (CIP-007-6 R5.5)"
- "Limit unsuccessful login attempts"
implementation:
password_policy:
min_length: 8
complexity: "Mixed case + numbers + special characters"
max_age_days: 365
lockout_threshold: 5
lockout_duration_minutes: 30
shared_accounts: "Document all shared/service accounts with authorization"
Key Concepts
| Term | Definition |
|---|---|
| BES Cyber System | Group of one or more BES Cyber Assets that perform a reliability function for the Bulk Electric System |
| Electronic Security Perimeter (ESP) | Logical border surrounding a network containing BES Cyber Systems, with all traffic flowing through Electronic Access Points |
| Electronic Access Point (EAP) | Interface on the ESP boundary that controls traffic flowing in and out of the ESP |
| Intermediate System | System used for remote access that prevents direct connectivity to BES Cyber Assets (jump server) |
| Transient Cyber Asset | Device that is directly connected to a BES Cyber System for less than 30 consecutive calendar days (laptops, USB drives) |
| NERC Glossary | Official definitions used in CIP standards; precise terminology required for compliance |
Tools & Systems
- Tripwire Enterprise: Configuration compliance monitoring and file integrity monitoring for CIP-010 baseline management
- Splunk with CIP Content Pack: SIEM with pre-built CIP-007 security event monitoring dashboards and alerts
- Carbon Black App Control: Application allowlisting for HMI stations and BES cyber assets (CIP-007 R3)
- Trellix/McAfee ePO: Endpoint protection with OT-optimized scanning policies for BES cyber assets
Output Format
NERC CIP Compliance Assessment Report
=======================================
Entity: [Registered Entity Name]
Date: YYYY-MM-DD
Standards: CIP-002 through CIP-014
BES CYBER SYSTEM CATEGORIZATION:
High Impact: [N] systems
Medium Impact: [N] systems
Low Impact: [N] systems
COMPLIANCE STATUS BY STANDARD:
CIP-002: [Compliant/Partial/Non-Compliant]
CIP-005: [Status] - [N] gaps identified
CIP-007: [Status] - [N] gaps identified
CIP-010: [Status] - [N] gaps identified
CIP-013: [Status] - [N] gaps identified
Frequently asked questions about NERC CIP Compliance Controls
Similar skills
Data Breach Blast Radius Analyzer
Assess potential breach impacts before they occur.
Verify Agent Action
Ensure safe execution of AI agent actions with thorough reviews.
Agent Supply Chain Integrity
Ensure the integrity of AI agent plugins and tools.
Agent OWASP ASI Compliance Check
Ensure your AI agents meet OWASP ASI security standards.
Securing S3 Buckets
Enhance your S3 bucket security with AWS best practices.
AWS Account Enumeration with ScoutSuite
Assess AWS security posture with comprehensive audits.
