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.
Control overview and objectives
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.
Step-by-step implementation plan
1) Create policy, approval workflow, and an approved software baseline
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).
2) Inventory existing user-installed software
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.
3) Remove unnecessary local admin rights and enforce least privilege
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.
4) Deploy Application Control & Endpoint Management
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.
5) Monitor, log, and alert on user-installed software
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.
Technical examples and short commands
Inventory examples: Windows registry query PowerShell to list installed apps (safer than Win32_Product): Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Export-Csv C:\temp\installed_apps.csv Linux (Debian): dpkg-query -W -f='${binary:Package}\t${Version}\n' > /tmp/installed_pkgs.txt macOS: system_profiler SPApplicationsDataType -xml > /tmp/apps.xml AppLocker 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*".
Real-world small-business scenario
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.
Risks, compliance tips, and best practices
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.
Summary
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.