{
  "title": "How to Implement NIST SP 800-171 REV.2 / CMMC 2.0 Level 2 - Control - CM.L2-3.4.9: Step-by-Step Plan to Control and Monitor User-Installed Software",
  "date": "2026-04-10",
  "author": "Lakeridge Technologies",
  "featured_image": "/assets/images/blog/2026/4/how-to-implement-nist-sp-800-171-rev2-cmmc-20-level-2-control-cml2-349-step-by-step-plan-to-control-and-monitor-user-installed-software.jpg",
  "content": {
    "full_html": "<p>Controlling and monitoring user-installed software (CMMC 2.0 / NIST SP 800-171 CM.L2-3.4.9) is essential to reduce attack surface, prevent unauthorized applications, and produce the auditable evidence required by the Compliance Framework; this post gives a practical, step-by-step plan—with technical examples and small-business scenarios—to implement an effective control and monitoring capability.</p>\n\n<h2>Control overview and objectives</h2>\n<p>The objective of CM.L2-3.4.9 is to ensure that users cannot introduce unapproved software onto systems that process, store, or transmit Controlled Unclassified Information (CUI) and that any user-installed software is inventoried, approved, and monitored. For Compliance Framework purposes you must: (1) define an approved-software/exception process, (2) prevent unauthorized installs (or detect them immediately), and (3) produce logs and artifacts that demonstrate continuous monitoring and enforcement.</p>\n\n<h2>Step-by-step implementation plan</h2>\n\n<h3>1) Create policy, approval workflow, and an approved software baseline</h3>\n<p>Start with a written policy that defines who may request software, the approval criteria (security review, licensing, vendor trust), and the retention period for approvals. Maintain an Approved Software List (ASL) that includes vendor, version, digital signature requirements, and allowed install paths. For evidence: publish the policy, approval forms, and a changelog of ASL entries in your compliance repository (Confluence, SharePoint, or a simple versioned document store).</p>\n\n<h3>2) Inventory existing user-installed software</h3>\n<p>Perform a full inventory across Windows, macOS, and Linux endpoints. Tools: for small businesses use Intune (Endpoint Manager), Microsoft Defender for Endpoint inventory, or free agents like OSQuery/Wazuh. Quick Windows commands: query installed programs via registry (HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall and HKCU equivalent) or run Get-CimInstance -ClassName Win32_Product (note: Win32_Product can be slow and triggers repairs; prefer registry reads). On Linux use dpkg -l or rpm -qa; on macOS use system_profiler SPApplicationsDataType. Export inventory snapshots and store them as evidence for compliance.</p>\n\n<h3>3) Remove unnecessary local admin rights and enforce least privilege</h3>\n<p>The most effective control is removing local administrative privileges so users cannot run installers. Implement privileged access by role: admins get Just-In-Time (JIT) privileges via a tool (e.g., Azure AD Privileged Identity Management, or request-based elevation). For small businesses without JIT tools, remove users from local Administrators and use software deployment tools to install approved apps.</p>\n\n<h3>4) Deploy Application Control & Endpoint Management</h3>\n<p>Implement allowlisting (preferred) or hardened blacklisting. Windows options: AppLocker (via Group Policy or Intune), Microsoft Defender Application Control (MDAC), or Smart App Control. Example AppLocker rule types: path-based for known install directories, publisher rules for signed MSI/EXE, and hash rules for single-file exceptions. Example AppLocker path rule (conceptual): allow path \"C:\\Program Files\\ApprovedVendor\\*\" for group \"Domain Computers\". For macOS, use MDM (Jamf/Intune) and kernel extension policies; for Linux use SELinux/AppArmor profiles plus package whitelists. Use Endpoint Management (Intune, SCCM/MECM, Jamf) to deploy approved software packages and enforce versions.</p>\n\n<h3>5) Monitor, log, and alert on user-installed software</h3>\n<p>Centralize logs from endpoints and application control into a SIEM (Splunk, Azure Sentinel, Elastic). Collect Event IDs and telemetry such as Windows Event 4688 (process creation) and Sysmon Event ID 1, application install-related registry changes, Windows Installer events (MsiInstaller EVT), and Intune device inventory change events. Create alerts for newly discovered installers, unsigned executables executed from user directories (e.g., %TEMP%, Downloads), or unauthorized package manager installs on Linux (apt/rpm installs outside a baseline). Retain logs according to your policy to demonstrate continuous monitoring for audits.</p>\n\n<h2>Technical examples and short commands</h2>\n<p>Inventory examples: Windows registry query PowerShell to list installed apps (safer than Win32_Product):\nGet-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* |\nSelect-Object DisplayName, DisplayVersion, Publisher, InstallDate | Export-Csv C:\\temp\\installed_apps.csv\nLinux (Debian): dpkg-query -W -f='${binary:Package}\\t${Version}\\n' > /tmp/installed_pkgs.txt\nmacOS: system_profiler SPApplicationsDataType -xml > /tmp/apps.xml\nAppLocker approach (high level): create publisher rule to allow only signed installers from approved publisher; block execution from user temp and downloads. For SIEM, a sample Splunk query to find recent unsigned installers: index=endpoint sourcetype=sysmon EventCode=1 Image=*\\Installer* OR CommandLine=\"*msiexec*\" | where NOT Signer=\"*Microsoft*\".</p>\n\n<h2>Real-world small-business scenario</h2>\n<p>Example: a 50-user engineering firm uses Intune and Defender for Endpoint. Implementation steps: (a) document an approved-software SOP and host it on SharePoint; (b) remove local admin from users via Group Policy and enable Azure AD device enrollment; (c) build an ASL in Intune and publish as required apps; (d) enable AppLocker with a baseline that allows signed vendor installers; (e) enable Defender Application Control to block unsigned code; (f) stream endpoint telemetry to a low-cost SIEM (Azure Sentinel pay-as-you-go or Elastic Cloud) and configure alerts for new installs. Evidence collected for audits: policy docs, Intune app assignment screenshots, exported AppLocker policy XML, SIEM alert history, and inventory snapshots.</p>\n\n<h2>Risks, compliance tips, and best practices</h2>\n<p>Risk of not implementing CM.L2-3.4.9: users installing unvetted software can introduce malware, credential-stealing tools, shadow IT that exfiltrates CUI, or vulnerable components that enable lateral movement—leading to breaches, loss of contracts, and audit failures. Best practices: prefer allowlist/allow-only policies where feasible; enforce code-signing and publisher validation; require ticketed approval with security review; automate inventory and drift detection; document exception approvals with expiration dates; and include software control checks in regular vulnerability scans and penetration tests. For small businesses, leverage built-in cloud tools (Intune + Defender + Azure Sentinel free tiers) before investing in enterprise solutions.</p>\n\n<h2>Summary</h2>\n<p>Implementing CM.L2-3.4.9 is a mix of policy, process, and technology: publish an approved-software policy and workflow, inventory existing software, remove local admin rights, deploy endpoint management and application control (AppLocker/MDAC/MDM), centralize logging into a SIEM, and maintain an auditable trail of approvals and alerts. By following the step-by-step plan above, even small businesses can achieve demonstrable compliance within the Compliance Framework while materially reducing the risk from user-installed software.</p>",
    "plain_text": "Controlling and monitoring user-installed software (CMMC 2.0 / NIST SP 800-171 CM.L2-3.4.9) is essential to reduce attack surface, prevent unauthorized applications, and produce the auditable evidence required by the Compliance Framework; this post gives a practical, step-by-step plan—with technical examples and small-business scenarios—to implement an effective control and monitoring capability.\n\nControl overview and objectives\nThe objective of CM.L2-3.4.9 is to ensure that users cannot introduce unapproved software onto systems that process, store, or transmit Controlled Unclassified Information (CUI) and that any user-installed software is inventoried, approved, and monitored. For Compliance Framework purposes you must: (1) define an approved-software/exception process, (2) prevent unauthorized installs (or detect them immediately), and (3) produce logs and artifacts that demonstrate continuous monitoring and enforcement.\n\nStep-by-step implementation plan\n\n1) Create policy, approval workflow, and an approved software baseline\nStart with a written policy that defines who may request software, the approval criteria (security review, licensing, vendor trust), and the retention period for approvals. Maintain an Approved Software List (ASL) that includes vendor, version, digital signature requirements, and allowed install paths. For evidence: publish the policy, approval forms, and a changelog of ASL entries in your compliance repository (Confluence, SharePoint, or a simple versioned document store).\n\n2) Inventory existing user-installed software\nPerform a full inventory across Windows, macOS, and Linux endpoints. Tools: for small businesses use Intune (Endpoint Manager), Microsoft Defender for Endpoint inventory, or free agents like OSQuery/Wazuh. Quick Windows commands: query installed programs via registry (HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall and HKCU equivalent) or run Get-CimInstance -ClassName Win32_Product (note: Win32_Product can be slow and triggers repairs; prefer registry reads). On Linux use dpkg -l or rpm -qa; on macOS use system_profiler SPApplicationsDataType. Export inventory snapshots and store them as evidence for compliance.\n\n3) Remove unnecessary local admin rights and enforce least privilege\nThe most effective control is removing local administrative privileges so users cannot run installers. Implement privileged access by role: admins get Just-In-Time (JIT) privileges via a tool (e.g., Azure AD Privileged Identity Management, or request-based elevation). For small businesses without JIT tools, remove users from local Administrators and use software deployment tools to install approved apps.\n\n4) Deploy Application Control & Endpoint Management\nImplement allowlisting (preferred) or hardened blacklisting. Windows options: AppLocker (via Group Policy or Intune), Microsoft Defender Application Control (MDAC), or Smart App Control. Example AppLocker rule types: path-based for known install directories, publisher rules for signed MSI/EXE, and hash rules for single-file exceptions. Example AppLocker path rule (conceptual): allow path \"C:\\Program Files\\ApprovedVendor\\*\" for group \"Domain Computers\". For macOS, use MDM (Jamf/Intune) and kernel extension policies; for Linux use SELinux/AppArmor profiles plus package whitelists. Use Endpoint Management (Intune, SCCM/MECM, Jamf) to deploy approved software packages and enforce versions.\n\n5) Monitor, log, and alert on user-installed software\nCentralize logs from endpoints and application control into a SIEM (Splunk, Azure Sentinel, Elastic). Collect Event IDs and telemetry such as Windows Event 4688 (process creation) and Sysmon Event ID 1, application install-related registry changes, Windows Installer events (MsiInstaller EVT), and Intune device inventory change events. Create alerts for newly discovered installers, unsigned executables executed from user directories (e.g., %TEMP%, Downloads), or unauthorized package manager installs on Linux (apt/rpm installs outside a baseline). Retain logs according to your policy to demonstrate continuous monitoring for audits.\n\nTechnical examples and short commands\nInventory examples: Windows registry query PowerShell to list installed apps (safer than Win32_Product):\nGet-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* |\nSelect-Object DisplayName, DisplayVersion, Publisher, InstallDate | Export-Csv C:\\temp\\installed_apps.csv\nLinux (Debian): dpkg-query -W -f='${binary:Package}\\t${Version}\\n' > /tmp/installed_pkgs.txt\nmacOS: system_profiler SPApplicationsDataType -xml > /tmp/apps.xml\nAppLocker approach (high level): create publisher rule to allow only signed installers from approved publisher; block execution from user temp and downloads. For SIEM, a sample Splunk query to find recent unsigned installers: index=endpoint sourcetype=sysmon EventCode=1 Image=*\\Installer* OR CommandLine=\"*msiexec*\" | where NOT Signer=\"*Microsoft*\".\n\nReal-world small-business scenario\nExample: a 50-user engineering firm uses Intune and Defender for Endpoint. Implementation steps: (a) document an approved-software SOP and host it on SharePoint; (b) remove local admin from users via Group Policy and enable Azure AD device enrollment; (c) build an ASL in Intune and publish as required apps; (d) enable AppLocker with a baseline that allows signed vendor installers; (e) enable Defender Application Control to block unsigned code; (f) stream endpoint telemetry to a low-cost SIEM (Azure Sentinel pay-as-you-go or Elastic Cloud) and configure alerts for new installs. Evidence collected for audits: policy docs, Intune app assignment screenshots, exported AppLocker policy XML, SIEM alert history, and inventory snapshots.\n\nRisks, compliance tips, and best practices\nRisk of not implementing CM.L2-3.4.9: users installing unvetted software can introduce malware, credential-stealing tools, shadow IT that exfiltrates CUI, or vulnerable components that enable lateral movement—leading to breaches, loss of contracts, and audit failures. Best practices: prefer allowlist/allow-only policies where feasible; enforce code-signing and publisher validation; require ticketed approval with security review; automate inventory and drift detection; document exception approvals with expiration dates; and include software control checks in regular vulnerability scans and penetration tests. For small businesses, leverage built-in cloud tools (Intune + Defender + Azure Sentinel free tiers) before investing in enterprise solutions.\n\nSummary\nImplementing CM.L2-3.4.9 is a mix of policy, process, and technology: publish an approved-software policy and workflow, inventory existing software, remove local admin rights, deploy endpoint management and application control (AppLocker/MDAC/MDM), centralize logging into a SIEM, and maintain an auditable trail of approvals and alerts. By following the step-by-step plan above, even small businesses can achieve demonstrable compliance within the Compliance Framework while materially reducing the risk from user-installed software."
  },
  "metadata": {
    "description": "Step-by-step, practical guidance to meet CM.L2-3.4.9 by preventing, controlling, and monitoring user-installed software across endpoints using policies, endpoint management, application control, and logging.",
    "permalink": "/how-to-implement-nist-sp-800-171-rev2-cmmc-20-level-2-control-cml2-349-step-by-step-plan-to-control-and-monitor-user-installed-software.json",
    "categories": [],
    "tags": []
  }
}