We have a large server fleet running different Linux distributions and versions alongside Windows Server. What is the most practical way to implement and maintain CIS Benchmark hardening across all of them? Are you using Ansible, Group Policy, Intune, Terraform, image-building tools, or another configuration-management approach? I'm also interested in how you handle testing, application-specific exceptions, and avoiding outages when applying stricter settings to existing production systems.
4 Answers
Don’t treat the benchmark as a one-click configuration. Start with an assessment, identify which controls would affect each workload, and document approved exceptions. Some services need to remain enabled, certain authentication settings can break applications, and filesystem or network changes may have unexpected dependencies. Roll changes out in stages and validate them before touching the whole fleet.
For a mixed environment, I’d separate the work by operating system and lifecycle stage: benchmark the existing fleet, harden new images by default, and use configuration management for drift correction. Ansible roles can cover common Linux settings, while policy management handles Windows. Track compliance results over time rather than aiming for 100 percent, since some controls may be intentionally excluded for operational reasons.
The most reliable approach we’ve seen is to build hardened Linux templates rather than modifying production servers after the fact. Use tools such as Packer and Ansible to create regularly patched golden images, then apply most of the CIS controls during provisioning. For Windows, use a similar image process while enforcing ongoing settings through Group Policy or Intune.
For Windows, Group Policy or Intune is usually the natural fit. A lot of the required settings have been supported for years, so version differences tend to be manageable. For Linux, Ansible is a common choice, often combined with OpenSCAP or distribution-specific security guidance. Be careful with Windows hardening, though—applying everything blindly can break systems and create some very expensive troubleshooting sessions.
Ansible can also manage Windows through PowerShell and DSC, but that makes the most sense if the organization already has a strong Ansible and infrastructure-as-code setup.

We got much better results by starting with a minimal Linux image and adding a script for controls that were missing. The script asked workload-specific questions, such as whether a web server or DNS service was required, instead of applying every rule universally.