EthicsComputerCourses
Join training +91 90532 10052

CIS Critical Security Controls

Cyber Security · Lesson 39 of 44 Advanced 8 min read Updated

By the end of this lesson you will be able to pick a starting group of CIS Controls for a small company. You will also run a simple self-assessment and turn its gaps into a quarter-by-quarter plan with Python.

NIST CSF tells you what outcomes to aim for. ISO 27001 tells you how to run a management system. But a small company with one IT person asks a simpler question: "What should we do first, second and third?" The CIS Critical Security Controls answer that question. They are a ranked list of concrete actions, a bit like a doctor's checklist for a basic health check-up. You can read about the other frameworks in Security Frameworks: NIST CSF 2.0 & ISO 27001.

What the CIS Controls are

The Center for Internet Security (CIS) is a non-profit organisation. It publishes the controls with help from security workers around the world. The controls are based on what attackers really do, and they are free to download. The current version is v8.1 (2024). It updates v8 (2021). It has:

  • 18 controls. Each is a broad area, such as account management or data recovery.
  • 153 safeguards inside them. A safeguard is one specific action you can check, such as "use MFA for remote network access".
  • Three Implementation Groups. They say which safeguards to do first.

Version 8.1 added a Govern security function to match NIST CSF 2.0. It also updated its mappings to CSF 2.0, made some safeguard wording clearer and added more words to the glossary.

The 18 controls

#ControlIn plain wordsCourse lesson
1Inventory and Control of Enterprise AssetsKnow every deviceVulnerability Management & Patching
2Inventory and Control of Software AssetsKnow every program, allow only approved onesEndpoint Hardening
3Data ProtectionClassify, handle, retain and dispose of data safelyCryptography Basics
4Secure Configuration of Enterprise Assets and SoftwareHardened baselinesEndpoint Hardening
5Account ManagementInventory and lifecycle of accountsIdentity Security
6Access Control ManagementLeast privilege, MFAIdentity Security
7Continuous Vulnerability ManagementScan, prioritise, patchVulnerability Management & Patching
8Audit Log ManagementCollect, keep and review logsLogging, SIEM & Threat Detection
9Email and Web Browser ProtectionsSafe browsers, mail filtering, DMARCEmail Security
10Malware DefensesAnti-malware and EDRMalware Types & Defences
11Data RecoveryBackups and restore testsBackups & Recovery
12Network Infrastructure ManagementSecure, up-to-date network devicesFirewalls, IDS & IPS
13Network Monitoring and DefenseWatch and filter network trafficDetection Engineering
14Security Awareness and Skills TrainingTrain peopleSecurity Awareness Programmes
15Service Provider ManagementManage supplier riskRisk Assessment & Treatment
16Application Software SecuritySecure developmentSecure SDLC & DevSecOps
17Incident Response ManagementPlan and practise responseIncident Response
18Penetration TestingTest defences like an attacker, with permissionVA vs PT

The order is on purpose. Controls 1 and 2 come first because you cannot protect what you do not know about. Think of a school hostel warden: before locking up at night, the warden first needs the list of rooms and students.

Implementation Groups

No organisation can do all 153 safeguards at once. So CIS sorts them into three groups:

GroupTypical organisationSafeguards
IG1Small or medium business, limited IT expertise, mostly protecting employee and financial data56 (called essential cyber hygiene)
IG2Has IT staff, several departments, some sensitive or regulated dataIG1 + 74 = 130
IG3Holds very sensitive data, faces targeted attacks, has security specialistsIG2 + 23 = all 153

Each group includes the ones below it, like school classes: Class 3 builds on everything from Class 2. CIS calls IG1 the minimum every organisation should meet. IG1 is aimed at common attacks that are not aimed at anyone in particular, such as phishing and ransomware. Here is a rough way to pick a starting group:

PythonRun it yourself
def implementation_group(has_security_staff, sensitive_or_regulated_data, targeted_attacks_likely):
    if has_security_staff and sensitive_or_regulated_data and targeted_attacks_likely:
        return "IG3"
    if sensitive_or_regulated_data or has_security_staff:
        return "IG2"
    return "IG1"

organisations = [
    ("Tuition centre in Rohtak, 12 staff", False, False, False),
    ("Diagnostic lab chain in Pune, 2 IT staff", False, True, False),
    ("Fintech app with a security team", True, True, True),
]
for name, staff, data, targeted in organisations:
    print(f"{implementation_group(staff, data, targeted)}  {name}")
Output
IG1  Tuition centre in Rohtak, 12 staff
IG2  Diagnostic lab chain in Pune, 2 IT staff
IG3  Fintech app with a security team

Real decisions also depend on regulators, what customers ask for in contracts and the company's own risk assessment. Still, the idea is simple: start with IG1, then grow.

Running a self-assessment

A self-assessment means going through the safeguards of your chosen group one by one. For each one, you write down its status: yes, partial or no. CIS offers free tools for this, and a spreadsheet works too. Here is a small sample of safeguards for the tuition centre, written in short words:

PythonRun it yourself
assessment = [
    (1, "Detailed inventory of all devices", "partial"),
    (2, "Inventory of installed software", "no"),
    (4, "Secure configuration process", "no"),
    (5, "Inventory of all accounts", "yes"),
    (6, "MFA for externally exposed apps and remote access", "partial"),
    (7, "Documented vulnerability management process", "no"),
    (8, "Audit logs collected", "yes"),
    (10, "Anti-malware on all endpoints", "yes"),
    (11, "Automated backups and restore tests", "partial"),
    (14, "Security awareness programme", "no"),
]
POINTS = {"yes": 1.0, "partial": 0.5, "no": 0.0}

score = sum(POINTS[status] for _, _, status in assessment)
print(f"Score: {score} of {len(assessment)} ({100 * score / len(assessment):.0f}%)")
for control, safeguard, status in assessment:
    if status != "yes":
        print(f"  Control {control:>2} [{status:<7}] {safeguard}")
Output
Score: 4.5 of 10 (45%)
  Control  1 [partial] Detailed inventory of all devices
  Control  2 [no     ] Inventory of installed software
  Control  4 [no     ] Secure configuration process
  Control  6 [partial] MFA for externally exposed apps and remote access
  Control  7 [no     ] Documented vulnerability management process
  Control 11 [partial] Automated backups and restore tests
  Control 14 [no     ] Security awareness programme

Be honest when you score. Every "partial" needs a note that says exactly what is missing, for example "MFA on email, not yet on the VPN". A score that looks better than reality is like hiding a bad mark from your parents. It only hides the gaps from the people who could pay to fix them.

From gaps to a roadmap

Now turn the gaps into a plan, one quarter at a time. Follow these simple rules:

  1. Fix the lowest-numbered controls first, because later controls depend on earlier ones.
  2. Move up anything that blocks the most common attacks. MFA and backups are classic quick wins against phishing and ransomware.
  3. Stop adding tasks to a quarter when the team's capacity is full.
PythonRun it yourself
gaps = [(1, "Device inventory", 2), (2, "Software inventory", 2), (4, "Secure configuration", 3),
        (6, "MFA everywhere remote", 1), (7, "Vulnerability process", 2), (11, "Backups with restore tests", 1),
        (14, "Awareness programme", 2)]
QUICK_WINS = {6, 11}
CAPACITY_PER_QUARTER = 4   # effort points the team can handle per quarter

ordered = sorted(gaps, key=lambda g: (g[0] not in QUICK_WINS, g[0]))
quarter, used, plan = 1, 0, {}
for control, task, effort in ordered:
    if used + effort > CAPACITY_PER_QUARTER:
        quarter, used = quarter + 1, 0
    plan.setdefault(f"Q{quarter}", []).append(f"C{control} {task}")
    used += effort
for q, tasks in plan.items():
    print(f"{q}: {'; '.join(tasks)}")
Output
Q1: C6 MFA everywhere remote; C11 Backups with restore tests; C1 Device inventory
Q2: C2 Software inventory
Q3: C4 Secure configuration
Q4: C7 Vulnerability process; C14 Awareness programme

The effort points and the capacity are estimates that the team agrees on. A one-page roadmap like this is easy to show a small business owner. It is also easy to update every quarter.

How CIS fits with other frameworks

CIS publishes mappings from its safeguards to NIST CSF 2.0, ISO/IEC 27001 and other standards. A mapping is a table that shows which safeguard meets which requirement. So the CIS work also counts towards those standards. Many organisations use IG1 as their practical first year. Later they grow into ISO 27001 certification.

CIS also publishes the CIS Benchmarks. These are detailed setting guides for specific products, and you use them to meet Control 4 (see Endpoint Hardening). Do not mix the two up. The Controls say what to do. The Benchmarks say how to set up one particular system, like a recipe for one dish.

Common mistakes

  • Skipping Controls 1 and 2 and jumping straight to expensive tools.
  • Trying to do IG3 in a small company, and finishing nothing.
  • Scoring yourself too generously.
  • Confusing CIS Controls with CIS Benchmarks.
  • Treating the assessment as a one-off instead of repeating it every year.

Key points

  • CIS Controls v8.1 has 18 controls and 153 safeguards, ranked by how real attackers behave.
  • IG1 (56 safeguards) is essential cyber hygiene for every organisation; IG2 adds 74 and IG3 adds 23 more.
  • Start with device and software inventories; you cannot protect what you do not know.
  • Self-assess honestly, write down what "partial" means, and turn gaps into a quarterly roadmap.
  • v8.1 added a Govern function and mappings to NIST CSF 2.0.
  • CIS Benchmarks give product-specific settings that put Control 4 into practice.

Exercise

Change the roadmap program so that it also prints the total effort in each quarter. Then set CAPACITY_PER_QUARTER to 5. How many quarters does the plan need now, compared with four before?

Show solution
Python
gaps = [(1, "Device inventory", 2), (2, "Software inventory", 2), (4, "Secure configuration", 3),
        (6, "MFA everywhere remote", 1), (7, "Vulnerability process", 2), (11, "Backups with restore tests", 1),
        (14, "Awareness programme", 2)]
QUICK_WINS = {6, 11}
CAPACITY_PER_QUARTER = 5

ordered = sorted(gaps, key=lambda g: (g[0] not in QUICK_WINS, g[0]))
quarter, plan = 1, {"Q1": ([], 0)}
for control, task, effort in ordered:
    tasks, used = plan[f"Q{quarter}"]
    if used + effort > CAPACITY_PER_QUARTER:
        quarter += 1
        tasks, used = [], 0
    plan[f"Q{quarter}"] = (tasks + [f"C{control}"], used + effort)
for q, (tasks, used) in plan.items():
    print(f"{q} (effort {used}): {', '.join(tasks)}")

With a capacity of 5 the plan needs three quarters instead of four. Q1 holds C6, C11 and C1 (effort 4, since adding C2 would make 6). Q2 holds C2 and C4 (effort 5), and Q3 holds C7 and C14 (effort 4). One extra point of capacity saves a whole quarter, because C2 and C4 now fit together.

Quick Quiz

1. How many controls and safeguards are in CIS Controls v8.1?

2. What is Implementation Group 1 (IG1)?

3. Why do asset and software inventories come first?

4. What is the difference between CIS Controls and CIS Benchmarks?

Learn Cyber Security with a mentor

Free lessons get you started. Our Ethical Hacking & Cyber Security training adds real projects and code reviews from working developers.

  • Project-based learning
  • Mentor code reviews
  • Free counselling call