Overview
The CIS Critical Security Controls (formerly SANS Top 20) provide a prioritized set of cybersecurity best practices. This guide covers implementing CIS Controls v8 with a focus on practical implementation, tooling, and mapping to Implementation Groups (IG1, IG2, IG3).
Who Should Use This Guide:
- Security architects designing security programs
- IT administrators implementing security controls
- Compliance teams mapping to security frameworks
- CISOs assessing security maturity
CIS Controls v8 Overview:
| Control Group | Focus Area | Controls |
|---|---|---|
| Basic (1-6) | Foundational hygiene | Inventory, software, data, configuration, accounts, access |
| Foundational (7-12) | Technical controls | Email, malware, recovery, network, logging, security |
| Organizational (13-18) | Process & governance | Awareness, providers, network, application, incident, penetration |
Implementation Groups:
| Group | Description | Organization Size |
|---|---|---|
| IG1 | Essential cyber hygiene | Small, limited IT resources |
| IG2 | Expanded capabilities | Medium, dedicated IT staff |
| IG3 | Comprehensive security | Large, security team, sensitive data |
Implementation Roadmap
Phase 1: Foundation (IG1 Essential)
Target: First 90 days - Establish baseline security
┌─────────────────────────────────────────────────────────────────────┐
│ IG1 Implementation Roadmap │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Month 1 Month 2 Month 3 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Control 1 │ │ Control 5 │ │ Control 11 │ │
│ │ Hardware │ │ Account │ │ Data │ │
│ │ Inventory │ │ Management │ │ Recovery │ │
│ ├─────────────┤ ├─────────────┤ ├─────────────┤ │
│ │ Control 2 │ │ Control 6 │ │ Control 14 │ │
│ │ Software │ │ Access │ │ Security │ │
│ │ Inventory │ │ Management │ │ Awareness │ │
│ ├─────────────┤ ├─────────────┤ └─────────────┘ │
│ │ Control 3 │ │ Control 7 │ │
│ │ Data │ │ Continuous │ │
│ │ Protection │ │ Vuln Mgmt │ │
│ ├─────────────┤ └─────────────┘ │
│ │ Control 4 │ │
│ │ Secure │ │
│ │ Config │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘Control 1: Inventory and Control of Enterprise Assets
IG1 Safeguards (Required):
| ID | Safeguard | Implementation |
|---|---|---|
| 1.1 | Establish asset inventory | Automated discovery tool |
| 1.2 | Address unauthorized assets | Quarantine or remediate |
Implementation Steps:
1. Deploy Asset Discovery:
# Windows - Query local network for active hosts
$subnet = "192.168.1"
1..254 | ForEach-Object -Parallel {
$ip = "$using:subnet.$_"
if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
[PSCustomObject]@{
IP = $ip
Hostname = (Resolve-DnsName $ip -ErrorAction SilentlyContinue).NameHost
MAC = (Get-NetNeighbor -IPAddress $ip -ErrorAction SilentlyContinue).LinkLayerAddress
}
}
} -ThrottleLimit 50 | Export-Csv ".\asset-discovery.csv" -NoTypeInformation2. Recommended Tools:
| Tool | Type | Best For |
|---|---|---|
| Lansweeper | Commercial | SMB, comprehensive |
| Snipe-IT | Open Source | Hardware tracking |
| NetBox | Open Source | DCIM/IPAM |
| NinjaOne | RMM | MSP environments |
| Microsoft Intune | Cloud | M365 environments |
3. Asset Classification:
Asset Categories:
├── Endpoints
│ ├── Workstations (Windows, macOS)
│ ├── Mobile (iOS, Android)
│ └── Virtual Desktops
├── Servers
│ ├── Physical
│ ├── Virtual (VMware, Hyper-V)
│ └── Cloud (Azure VMs, AWS EC2)
├── Network
│ ├── Routers/Switches
│ ├── Firewalls
│ └── Wireless APs
└── IoT/OT
├── Printers
├── Cameras
└── Industrial devicesVerification:
- All IP-connected devices discovered
- Asset inventory updated weekly
- Unauthorized assets identified and addressed
- Asset owners assigned
Control 2: Inventory and Control of Software Assets
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 2.1 | Establish software inventory | Automated collection |
| 2.2 | Ensure authorized software installed | Allowlisting/review |
| 2.3 | Address unauthorized software | Remove or document exception |
Implementation:
1. Collect Software Inventory:
# Windows - Get installed software
$software = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*,
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Where-Object { $_.DisplayName } |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
$software | Export-Csv ".\software-inventory.csv" -NoTypeInformation
# Get running processes (may indicate uninstalled software)
Get-Process | Select-Object Name, Path, Company |
Where-Object { $_.Path } |
Sort-Object Name -Unique |
Export-Csv ".\running-software.csv" -NoTypeInformation2. Application Allowlisting (Windows):
# Windows Defender Application Control (WDAC)
# Create policy from golden image
$policyPath = "C:\Policies\BasePolicy.xml"
New-CIPolicy -FilePath $policyPath -Level Publisher -UserPEs -MultiplePolicyFormat
# Audit mode first
Set-RuleOption -FilePath $policyPath -Option 3 # Enable Audit Mode
# Convert to binary
ConvertFrom-CIPolicy -XmlFilePath $policyPath -BinaryFilePath "C:\Policies\BasePolicy.cip"3. Unauthorized Software Detection:
# Compare current inventory to approved list
$approved = Import-Csv ".\approved-software.csv"
$current = Import-Csv ".\software-inventory.csv"
$unauthorized = $current | Where-Object {
$_.DisplayName -notin $approved.DisplayName
}
$unauthorized | Export-Csv ".\unauthorized-software.csv" -NoTypeInformation
if ($unauthorized) {
Write-Warning "Unauthorized software found: $($unauthorized.Count) items"
}Control 3: Data Protection
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 3.1 | Establish data management process | Policies and classification |
| 3.2 | Establish data inventory | Discover sensitive data |
| 3.3 | Configure data access control | RBAC and least privilege |
| 3.4 | Enforce data retention | Automated retention policies |
| 3.6 | Encrypt data on end-user devices | BitLocker/FileVault |
Implementation:
1. Data Classification Framework:
Classification Levels:
┌────────────────────────────────────────────────────────────┐
│ Level 4: RESTRICTED │
│ - PII, PHI, PCI data │
│ - Trade secrets │
│ - Encryption required at rest and transit │
├────────────────────────────────────────────────────────────┤
│ Level 3: CONFIDENTIAL │
│ - Internal business data │
│ - Employee information │
│ - Encryption required at rest │
├────────────────────────────────────────────────────────────┤
│ Level 2: INTERNAL │
│ - Day-to-day business operations │
│ - Not for public release │
│ - Standard access controls │
├────────────────────────────────────────────────────────────┤
│ Level 1: PUBLIC │
│ - Marketing materials │
│ - Public website content │
│ - No special handling required │
└────────────────────────────────────────────────────────────┘2. Enable BitLocker (Windows):
# Check BitLocker status
Get-BitLockerVolume
# Enable BitLocker with TPM
Enable-BitLocker -MountPoint "C:" -EncryptionMethod XtsAes256 -UsedSpaceOnly -TpmProtector
# Add recovery password
Add-BitLockerKeyProtector -MountPoint "C:" -RecoveryPasswordProtector
# Backup to Azure AD (Intune managed)
BackupToAAD-BitLockerKeyProtector -MountPoint "C:" -KeyProtectorId (
(Get-BitLockerVolume -MountPoint "C:").KeyProtector |
Where-Object { $_.KeyProtectorType -eq 'RecoveryPassword' }
).KeyProtectorId3. Data Discovery (PowerShell):
# Find files with potential sensitive data
$patterns = @(
'\b\d{3}-\d{2}-\d{4}\b', # SSN
'\b\d{16}\b', # Credit card
'\b[A-Z]{2}\d{6}[A-Z]\b' # Passport
)
$sensitiveFiles = Get-ChildItem -Path "C:\Users" -Recurse -Include "*.xlsx", "*.csv", "*.docx" -ErrorAction SilentlyContinue |
ForEach-Object {
$content = Get-Content $_.FullName -Raw -ErrorAction SilentlyContinue
foreach ($pattern in $patterns) {
if ($content -match $pattern) {
[PSCustomObject]@{
File = $_.FullName
Pattern = $pattern
Modified = $_.LastWriteTime
}
}
}
}
$sensitiveFiles | Export-Csv ".\sensitive-data-scan.csv" -NoTypeInformationControl 4: Secure Configuration of Enterprise Assets
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 4.1 | Establish secure configuration process | Baselines and hardening guides |
| 4.2 | Establish secure configuration for network devices | Firewall/switch hardening |
| 4.7 | Manage default accounts | Disable or rename defaults |
Implementation:
1. Windows Security Baseline (Intune):
# Key Security Baseline Settings
Password Policy:
- Minimum Length: 14 characters
- Complexity: Required
- History: 24 passwords
- Maximum Age: 90 days
Account Lockout:
- Threshold: 5 invalid attempts
- Duration: 30 minutes
- Reset Counter: 30 minutes
User Rights:
- Deny log on locally: Guests
- Deny access from network: Guests, Anonymous
Security Options:
- UAC: Enabled (Prompt for consent)
- Guest account: Disabled
- Rename administrator account: Yes
- Blank passwords: Disabled2. Apply CIS Benchmark (PowerShell):
# Example CIS hardening script excerpts
# 2.3.1.1 - Accounts: Administrator account status
Disable-LocalUser -Name "Administrator"
# 2.3.1.3 - Rename administrator account
Rename-LocalUser -Name "Administrator" -NewName "IT-Admin-$((Get-Random -Maximum 9999))"
# 2.3.7.3 - Interactive logon: Machine inactivity limit
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "InactivityTimeoutSecs" -Value 900
# 18.4.3 - MSS: Enable ICMP redirects
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "EnableICMPRedirect" -Value 0
# 18.5.4.1 - Turn off multicast name resolution (LLMNR)
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient" -Name "EnableMulticast" -Value 0
# 18.9.102.1 - Configure Windows Defender SmartScreen
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "EnableSmartScreen" -Value 13. Network Device Hardening (FortiGate):
# Disable unused services
config system global
set admin-https-redirect enable
set admin-telnet disable
set admin-ssh-port 22
set admin-ssh-grace-time 60
set admin-ssh-password enable
set admintimeout 10
set timezone 12
end
# Configure admin password policy
config system password-policy
set status enable
set min-length 14
set min-lower-case-letter 1
set min-upper-case-letter 1
set min-number 1
set min-non-alphanumeric 1
set expire-status enable
set expire-day 90
end
# Restrict admin access by IP
config system admin
edit "admin"
set trusthost1 10.0.0.0 255.0.0.0
set trusthost2 192.168.1.0 255.255.255.0
next
endControl 5: Account Management
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 5.1 | Establish account inventory | List all accounts |
| 5.2 | Use unique passwords | Password manager, policies |
| 5.3 | Disable dormant accounts | 45-day inactivity disable |
| 5.4 | Restrict admin privileges | Least privilege principle |
Implementation:
1. Account Inventory:
# Active Directory - Get all user accounts
Get-ADUser -Filter * -Properties LastLogonDate, Enabled, PasswordLastSet, MemberOf |
Select-Object SamAccountName, DisplayName, Enabled, LastLogonDate, PasswordLastSet,
@{N='Groups'; E={($_.MemberOf | ForEach-Object { (Get-ADGroup $_).Name }) -join '; '}} |
Export-Csv ".\ad-user-inventory.csv" -NoTypeInformation
# Find stale accounts (no logon in 45 days)
$staleDate = (Get-Date).AddDays(-45)
Get-ADUser -Filter { LastLogonDate -lt $staleDate -and Enabled -eq $true } -Properties LastLogonDate |
Select-Object SamAccountName, LastLogonDate |
Export-Csv ".\stale-accounts.csv" -NoTypeInformation2. Disable Dormant Accounts:
# Automatically disable accounts inactive for 45 days
$staleDate = (Get-Date).AddDays(-45)
$staleUsers = Get-ADUser -Filter { LastLogonDate -lt $staleDate -and Enabled -eq $true } -Properties LastLogonDate
foreach ($user in $staleUsers) {
Disable-ADAccount -Identity $user.SamAccountName
Set-ADUser -Identity $user.SamAccountName -Description "Disabled by automation - Inactive since $($user.LastLogonDate)"
Write-Output "Disabled: $($user.SamAccountName) - Last logon: $($user.LastLogonDate)"
}3. Privileged Account Audit:
# Find all privileged group members
$privGroups = @("Domain Admins", "Enterprise Admins", "Schema Admins", "Administrators", "Account Operators", "Backup Operators")
$privAccounts = foreach ($group in $privGroups) {
Get-ADGroupMember -Identity $group -Recursive | ForEach-Object {
[PSCustomObject]@{
Group = $group
SamAccountName = $_.SamAccountName
ObjectClass = $_.objectClass
}
}
}
$privAccounts | Export-Csv ".\privileged-accounts.csv" -NoTypeInformation
Write-Output "Found $($privAccounts.Count) privileged account memberships"Control 6: Access Control Management
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 6.1 | Establish access granting process | Request/approval workflow |
| 6.2 | Establish access revoking process | Termination procedures |
| 6.3 | Require MFA for external applications | Conditional Access |
| 6.4 | Require MFA for remote access | VPN, RDP with MFA |
| 6.5 | Require MFA for admin access | All admin actions |
Implementation:
1. MFA Implementation Priority:
MFA Rollout Order:
┌────────────────────────────────────────────────────────────┐
│ Phase 1 (Immediate): Privileged Accounts │
│ - Domain Admins, Global Admins │
│ - Service desk with elevated privileges │
│ - Cloud admin accounts │
├────────────────────────────────────────────────────────────┤
│ Phase 2 (Week 2): Remote Access │
│ - VPN users │
│ - Remote desktop users │
│ - Cloud application access │
├────────────────────────────────────────────────────────────┤
│ Phase 3 (Week 4): All External Applications │
│ - Microsoft 365 │
│ - SaaS applications │
│ - Customer-facing portals │
├────────────────────────────────────────────────────────────┤
│ Phase 4 (Month 2): All Users │
│ - Complete MFA rollout │
│ - Phishing-resistant MFA for sensitive roles │
└────────────────────────────────────────────────────────────┘2. Entra ID Conditional Access (Reference):
See our Conditional Access Zero Trust guide for detailed implementation.
Control 7: Continuous Vulnerability Management
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 7.1 | Establish vulnerability management process | Policy and procedures |
| 7.2 | Establish remediation process | SLAs by severity |
| 7.3 | Perform automated OS patching | WSUS, Intune, Autopatch |
| 7.4 | Perform automated application patching | Third-party patching |
Implementation:
1. Vulnerability Remediation SLAs:
| Severity | CVSS Score | Remediation SLA |
|---|---|---|
| Critical | 9.0 - 10.0 | 7 days |
| High | 7.0 - 8.9 | 30 days |
| Medium | 4.0 - 6.9 | 90 days |
| Low | 0.1 - 3.9 | 180 days |
2. Windows Update Configuration:
# Configure Windows Update via PowerShell
$WUSettings = @{
'AcceptTrustedPublisherCerts' = 1
'DisableWindowsUpdateAccess' = 0
'ElevateNonAdmins' = 0
'AUOptions' = 4 # Auto download and schedule install
'ScheduledInstallDay' = 0 # Every day
'ScheduledInstallTime' = 3 # 3 AM
'NoAutoRebootWithLoggedOnUsers' = 0
}
$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU"
if (-not (Test-Path $regPath)) {
New-Item -Path $regPath -Force
}
foreach ($setting in $WUSettings.GetEnumerator()) {
Set-ItemProperty -Path $regPath -Name $setting.Key -Value $setting.Value
}3. Vulnerability Scanning Tools:
| Tool | Type | Best For |
|---|---|---|
| Nessus | Commercial | Enterprise scanning |
| OpenVAS | Open Source | Budget-conscious |
| Qualys | Cloud | Large enterprises |
| Microsoft Defender Vuln Mgmt | Built-in | M365 E5 customers |
| Rapid7 InsightVM | Commercial | DevSecOps integration |
Control 11: Data Recovery
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 11.1 | Establish data recovery process | Backup procedures |
| 11.2 | Perform automated backups | Daily/weekly schedules |
| 11.3 | Protect recovery data | Encryption, access control |
| 11.4 | Establish isolated recovery environment | Air-gapped or immutable |
| 11.5 | Test backup recovery | Quarterly restore tests |
Implementation:
1. 3-2-1 Backup Strategy:
3-2-1 Backup Rule:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 3 Copies of Data │
│ ├── Production (Original) │
│ ├── On-site backup (NAS, SAN, local server) │
│ └── Off-site backup (Cloud, remote DC, tape) │
│ │
│ 2 Different Media Types │
│ ├── Disk-based (fast recovery) │
│ └── Cloud/Tape (ransomware protection) │
│ │
│ 1 Off-site Copy │
│ └── Geographically separated (disaster recovery) │
│ │
│ BONUS: 1 Immutable/Air-gapped Copy │
│ └── Cannot be modified or deleted by ransomware │
│ │
└─────────────────────────────────────────────────────────────┘2. Backup Verification Script:
# Test backup integrity
function Test-BackupIntegrity {
param(
[string]$BackupPath,
[string]$TestRestorePath = "C:\BackupTest"
)
# Create test restore directory
New-Item -ItemType Directory -Path $TestRestorePath -Force
# Attempt to restore sample files
try {
# Example: Veeam restore
# Start-VBRRestoreSession -BackupSession $session
# Verify file integrity
$testFile = Get-ChildItem $TestRestorePath -Recurse | Select-Object -First 1
if ($testFile -and (Test-Path $testFile.FullName)) {
Write-Output "Backup verification: SUCCESS"
return $true
}
} catch {
Write-Error "Backup verification: FAILED - $_"
return $false
} finally {
# Cleanup
Remove-Item -Path $TestRestorePath -Recurse -Force -ErrorAction SilentlyContinue
}
}Control 14: Security Awareness Training
IG1 Safeguards:
| ID | Safeguard | Implementation |
|---|---|---|
| 14.1 | Establish security awareness program | Training curriculum |
| 14.2 | Train workforce on secure authentication | Password, MFA training |
| 14.3 | Train workforce on data handling | Classification training |
| 14.4 | Train workforce on social engineering | Phishing awareness |
| 14.5 | Train workforce on malware dangers | Safe computing |
Implementation:
1. Annual Training Topics:
| Topic | Frequency | Target Audience |
|---|---|---|
| Security Awareness Basics | Annually + new hire | All employees |
| Phishing Recognition | Quarterly simulations | All employees |
| Password/MFA Best Practices | Annually | All employees |
| Data Handling | Annually | Data handlers |
| Secure Remote Work | Annually | Remote workers |
| Privileged User Security | Annually | IT/Admins |
| Incident Reporting | Annually | All employees |
2. Phishing Simulation Program:
Phishing Campaign Schedule:
┌────────────────────────────────────────────────────────────┐
│ Quarter 1: Basic Phishing │
│ - Generic phishing email (obvious) │
│ - Training for all who click │
├────────────────────────────────────────────────────────────┤
│ Quarter 2: Credential Harvesting │
│ - Fake login page (Microsoft branded) │
│ - Focus on those who clicked in Q1 │
├────────────────────────────────────────────────────────────┤
│ Quarter 3: Business Email Compromise │
│ - CEO fraud / invoice scam │
│ - Target finance and executives │
├────────────────────────────────────────────────────────────┤
│ Quarter 4: Spear Phishing │
│ - Personalized attacks │
│ - Based on OSINT │
└────────────────────────────────────────────────────────────┘Implementation Tracking
IG1 Compliance Scorecard
Control Assessment Scoring:
┌────────────────────────────────────────────────────────────────────┐
│ Score │ Description │
├────────────────────────────────────────────────────────────────────┤
│ 0 │ Not Implemented - No safeguards in place │
│ 1 │ Initial - Ad-hoc implementation, not documented │
│ 2 │ Developing - Partially implemented, some documentation │
│ 3 │ Defined - Fully implemented, documented, not validated │
│ 4 │ Managed - Implemented, documented, measured, reviewed │
│ 5 │ Optimized - Continuous improvement, automated, audited │
└────────────────────────────────────────────────────────────────────┘Assessment Template
| Control | Safeguard | Current Score | Target Score | Gap | Owner | Due Date |
|---|---|---|---|---|---|---|
| 1.1 | Asset Inventory | 2 | 4 | 2 | IT Ops | Q1 |
| 1.2 | Unauthorized Assets | 1 | 3 | 2 | IT Ops | Q1 |
| 2.1 | Software Inventory | 2 | 4 | 2 | IT Ops | Q1 |
| 3.6 | Device Encryption | 3 | 4 | 1 | Security | Q2 |
| 5.3 | Dormant Accounts | 1 | 4 | 3 | IAM | Q1 |
| 6.5 | Admin MFA | 4 | 5 | 1 | IAM | Q1 |
| 11.2 | Automated Backups | 3 | 4 | 1 | IT Ops | Q2 |
| 14.4 | Phishing Training | 2 | 4 | 2 | Security | Q2 |
Tooling Recommendations
Control-to-Tool Mapping
| Control | Recommended Tools |
|---|---|
| 1 - Asset Inventory | Lansweeper, Snipe-IT, NinjaOne, Intune |
| 2 - Software Inventory | SCCM, Intune, PDQ Inventory |
| 3 - Data Protection | Microsoft Purview, BitLocker, FileVault |
| 4 - Secure Config | CIS-CAT, Microsoft Security Baselines |
| 5 - Account Mgmt | Active Directory, Entra ID |
| 6 - Access Control | Entra ID Conditional Access, Duo |
| 7 - Vuln Management | Nessus, Qualys, Rapid7, Defender |
| 8 - Audit Logs | Splunk, Microsoft Sentinel, Elastic |
| 10 - Malware Defense | Defender for Endpoint, SentinelOne |
| 11 - Data Recovery | Veeam, Azure Backup, Cove |
| 14 - Security Training | KnowBe4, Proofpoint, Infosec IQ |
Verification Checklist
IG1 Implementation Complete:
- Control 1: Asset inventory established and maintained
- Control 2: Software inventory with unauthorized detection
- Control 3: Data classification and encryption deployed
- Control 4: Security baselines applied to all systems
- Control 5: Account inventory with dormant account process
- Control 6: MFA enforced for remote and admin access
- Control 7: Vulnerability management with patching SLAs
- Control 11: Backup strategy with tested recovery
- Control 14: Security awareness program active
Next Steps
After achieving IG1 compliance:
- Assess for IG2 - Plan extended control implementation
- Continuous Monitoring - Automate compliance checking
- Integrate with Risk Management - Map controls to business risks
- External Validation - Consider CIS Controls certification
References
- CIS Controls v8
- CIS Benchmarks
- CIS Controls Self-Assessment Tool (CSAT)
- NIST Cybersecurity Framework Mapping
Last Updated: February 2026