Version information
This version is compatible with:
- Puppet Enterprise 2023.8.x, 2023.7.x, 2023.6.x, 2023.5.x, 2023.4.x, 2023.3.x, 2023.2.x, 2023.1.x, 2023.0.x, 2021.7.x, 2021.6.x, 2021.5.x, 2021.4.x, 2021.3.x, 2021.2.x, 2021.1.x, 2021.0.x
- Puppet >= 7.0.0 < 9.0.0
Start using this module
Add this module to your Puppetfile:
mod 'canihavethisone-cis_security_hardening_windows', '1.0.1'
Learn more about managing modules with a PuppetfileDocumentation
cis_security_hardening_windows
Table of Contents
- Overview
- Description
- Building on CIS controls
- Beginning with os_hardening
- CIS Enforcement Levels
- Reference
- Development
- Release Notes
Overview
This module applies CIS benchmark hardening with a default 100% validation pass and 100% test coverage to:
- Windows 10: Configurable, defaulted to domain-joined Level 1 & 2 + NG + BL (currently v3.0.0)
- Windows 11: Configurable, defaulted to domain-joined Level 1 & 2 + BL (currently v3.0.0)
It also configures additional system resources as described below
Description
Windows CIS controls and other resources are applied using registry, security policy, audit policy, optional local group policy (for HKCU controls), execs and dependency modules.
This module uses a custom windows facts hash leveraging wmi, as reading the registry is unreliable for Windows 11 (and predicted for future versions).
Building on CIS controls
Additional resources are also defined, including:
Windows 10 / 11
- users
- remote desktop
- firewall (limited)
Other Windows 10 / 11 parameters include:
- cis_profile_type
- cis_enforcement_level
- cis_include_bitlocker
- cis_include_nextgen
- cis_include_hkcu
- cis_exclude_rules
- catalog_no_cache
- clear_temp_files
- enable_administrator
- purge_unmanaged_users
- performance_powerscheme
- enable_remote_desktop
Defence in-depth
This module takes a defence in-depth approach, with the following built-in functions:
- undefined users can be optionally purged (except system users)
- where CIS recommendations have more than 1 acceptable setting, the more stringent is used
Beginning with cis_security_hardening_windows
To use this module, include cis_security_hardening_windows
in your Node Classifier (ENC) or wrapping class.
At minimum, the following hiera must be provided to the module:
Windows 10 / 11:
cis_security_hardening_windows::logon_banner
(string)cis_security_hardening_windows::logon_message
(string)cis_security_hardening_windows::administrator_newname
(string)cis_security_hardening_windows::administrator_newpassword
(string)cis_security_hardening_windows::disabled_guest_newname
(string)cis_security_hardening_windows::users
(hash) is required if the built-in administrator is disabled (default)
See example minimum hiera data here
CIS Enforcement Levels
- All recommended domain-joined Level 1 & 2 + NG + BL CIS controls are enforced by default using module hiera (standalone selectable)
- HKCU registry entries are also optionally applied by copying a preconfigured
Registry.pol
file toC:/Windows/System32/GroupPolicy/
- Comments in module hiera identify the objective of each setting however CIS reference numbers are not shown as they are subject to change
- Profile Type, Enforcement Level (1 or 2 (1+2)), BitLocker (BL), NextGen (NG) and HKCU policy inclusion are parameterised:
cis_security_hardening_windows::cis_profile_type: 'domain' cis_security_hardening_windows::cis_enforcement_level: 2 cis_security_hardening_windows::cis_include_bitlocker: true cis_security_hardening_windows::cis_include_nextgen: true cis_security_hardening_windows::cis_include_hkcu: true
- A reference list of rules enforced via the system registry is in the hiera folder for each Windows version, eg here. Note that some additional rules are applied by Local Security Policy and Audit Policy resources however.
- Individual controls can be overridden by any of the following methods:
- creating a optional hiera array for
cis_security_hardening_windows::cis_exclude_rules
containing rule titles to be subtracted from the default included hashes (note that some rules are managed by the local_security_policy or cis_auditpol):cis_security_hardening_windows::cis_exclude_rules: - "(L1) Ensure 'Allow users to enable online speech recognition services is set to 'Disabled'" - "(L1) Ensure 'Configure Solicited Remote Assistance' is set to 'Disabled'"
- creating a hiera hash containing keys with different values at a higher precedence (eg domain or node) and titled any of:
cis_security_hardening_windows::cis_level_1 cis_security_hardening_windows::cis_level_2 cis_security_hardening_windows::cis_bitlocker cis_security_hardening_windows::cis_nextgen cis_security_hardening_windows::cis_secpol_level_1 cis_security_hardening_windows::cis_secpol_level_2 cis_security_hardening_windows::cis_auditpol
- other methods such as resource collectors to override registry key values if wrapping this module into your own class or control repo
- creating a optional hiera array for
Reference
See the Puppet Strings documentation.
Development
Github repo is available for contributions at https://github.com/canihavethisone/cis_security_hardening_windows
Release Notes
See changelog
Reference
Table of Contents
Classes
cis_security_hardening_windows
: Windows main class. The entry point with most parameters processed here. It applies CIS hardeningcis_security_hardening_windows::cis
: Windows cis class. It is called from the cis_security_hardening_windows class. Params are derived from in-module hiera and can be excluded.cis_security_hardening_windows::remote_desktop
: Windows remote_desktop class. It is called from the cis_security_hardening_windows class when $allow_remote_desktop is true.
Classes
cis_security_hardening_windows
Windows main class. The entry point with most parameters processed here. It applies CIS hardening
Examples
Declaring the class
include cis_security_hardening_windows
Parameters
The following parameters are available in the cis_security_hardening_windows
class:
users
purge_unmanaged_users
cis_profile_type
cis_enforcement_level
cis_include_bitlocker
cis_include_nextgen
cis_exclude_rules
cis_include_hkcu
misc_registry
enable_administrator
enable_remote_desktop
trusted_rdp_subnets
remote_local_accounts
performance_powerscheme
clear_temp_files
auto_restart
catalog_no_cache
users
Data type: Hash
Any users to create
Default value: lookup( 'users', Hash, 'deep', {})
purge_unmanaged_users
Data type: Boolean
If unmanaged users should be purged. Requires users hash to be defined
Default value: lookup( 'purge_unmanaged_users', Boolean, undef, false )
cis_profile_type
Data type: Enum['domain', 'standalone']
Apply domain or standalone CIS benchmark
Default value: lookup( 'cis_profile_type', Enum['domain', 'standalone'], undef, 'domain' )
cis_enforcement_level
Data type: Integer[1, 2]
CIS level to apply. Level 2 includes level 1
Default value: lookup( 'cis_enforcement_level', Integer[1, 2], undef, 2 )
cis_include_bitlocker
Data type: Boolean
If cis bitlocker rules should be included
Default value: lookup( 'cis_include_bitlocker', Boolean, undef, true )
cis_include_nextgen
Data type: Boolean
If cis nextgen rules should be included
Default value: lookup( 'cis_include_nextgen', Boolean, undef, true )
cis_exclude_rules
Data type: Hash
Lookup of optional hash for cis_exclude_rules (to opt out of included rules)
Default value: lookup( 'cis_exclude_rules', Array, 'deep', [])
cis_include_hkcu
Data type: Boolean
If true, CIS defined local group policy objects are copied in for users as puppetlabs/registry cannot apply HKCU
Default value: lookup( 'cis_include_hkcu', Boolean, undef, true )
misc_registry
Data type: Hash
Lookup of misc registry items to apply. Currently sets Puppet logging to event viewer and disables SMB1
Default value: lookup( 'misc_registry', Hash, 'deep', {})
enable_administrator
Data type: Boolean
If the local adminsitrator account is enabled. Note that account must be renamed if enabled or not
Default value: lookup( 'enable_administrator', Boolean, undef, false )
enable_remote_desktop
Data type: Boolean
If true the RDP service will be enabled and firewall rule created (false)
Default value: lookup( 'enable_remote_desktop', Boolean, undef, false )
trusted_rdp_subnets
Data type: Array
Trusted subnets for inbound rdp connections for firewall rules. Undef will be converted to 'any'
Default value: lookup( 'trusted_rdp_subnets', Array, undef, [])
remote_local_accounts
Data type: Boolean
If true and RDP is enabled, this allows local user accounts to connect remotely. Required if not domain joined (true)
Default value: lookup( 'remote_local_accounts', Boolean, undef, true )
performance_powerscheme
Data type: Boolean
If true, set the powerscheme to high performance to prevent sleep.
Default value: lookup( 'performance_powerscheme', Boolean, undef, false )
clear_temp_files
Data type: Boolean
If true clears user temp and system temp directories
Default value: lookup( 'clear_temp_files', Boolean, undef, false )
auto_restart
Data type: Boolean
If true, restarts the host at the end of the puppet run when registry local_security_policy changes occur (recommended)
Default value: lookup( 'auto_restart', Boolean, undef, true )
catalog_no_cache
Data type: Boolean
Do not cache the puppet catalog on disk, as passwords and other values are in plain text
Default value: lookup( 'catalog_no_cache', Boolean, undef, false )
cis_security_hardening_windows::cis
Windows cis class. It is called from the cis_security_hardening_windows class. Params are derived from in-module hiera and can be excluded.
Examples
Declaring the class
include cis_security_hardening_windows
Parameters
The following parameters are available in the cis_security_hardening_windows::cis
class:
cis_profile_type
cis_enforcement_level
cis_include_bitlocker
cis_include_nextgen
cis_exclude_rules
cis_include_hkcu
cis_profile_type
Data type: Enum['domain', 'standalone']
Apply domain or standalone CIS benchmark
cis_enforcement_level
Data type: Integer[1, 2]
CIS level to apply. Level 2 includes level 1
cis_include_bitlocker
Data type: Boolean
If cis bitlocker rules should be included
cis_include_nextgen
Data type: Boolean
If cis nextgen rules should be included
cis_exclude_rules
Data type: Hash
Lookup of optional array for cis_exclude_rules (to opt out of included rules)
cis_include_hkcu
Data type: Boolean
If true, lgpo is used to import group policy objects for HKCU as puppetlabs/registry cannot apply them
cis_security_hardening_windows::remote_desktop
Windows remote_desktop class. It is called from the cis_security_hardening_windows class when $allow_remote_desktop is true.
Examples
Declaring the class
include cis_security_hardening_windows
Parameters
The following parameters are available in the cis_security_hardening_windows::remote_desktop
class:
trusted_rdp_subnets
Data type: Array
Trusted subnets for inbound rdp connections for firewall rules. Undef will be converted to 'any'
remote_local_accounts
Data type: Boolean
If local accounts are permitted to connect remotely. Required if not domain joined
Changelog
All notable changes to this project will be documented in this file.
Release 1.0.1
Bugfixes
- Add validation that the following required parameters are set by the implementer:
- logon_banner
- logon_message
- administrator_newname
- administrator_newpassword
- disabled_guest_newname
Release 1.0.0
Breaking Changes
- Rename 'disabled_administrator' references and hiera to 'administrator' as enabling is configurable
Features
- Update dependency versions
Bugfixes
- Remove references to legacy facts that were breaking testing
- Improve Puppet 8 compatibility testing
Release 0.2.3
Features
Bugfixes
- Correct cis_level_1 filename in /data/windows/11
- Correct wrong registry keys from CIS benchmark
- Enable Defender enforcement on Windows 11 (still disabled on Windows 10 due to idempotency issue after Windows Update)
Release 0.2.2
Features
Bugfixes
- Correct commented secpol title
Release 0.2.1
Features
Bugfixes
- Correct references in readme
Known Issues
Release 0.2.0
Features
- Enhance user management including local Administrator account
Bugfixes
Known Issues
Release 0.1.1
Features Initial release
Bugfixes
Known Issues
Dependencies
- ayohrling-local_security_policy (>= 1.1.1 < 2.0.0)
- fervid-auditpol (>= 1.0.1 < 2.0.0)
- puppetlabs-inifile (>= 6.1.1 < 7.0.0)
- puppetlabs-powershell (>= 6.0.0 < 7.0.0)
- puppetlabs-reboot (>= 5.0.0 < 6.0.0)
- puppetlabs-registry (>= 5.0.1 < 6.0.0)
- puppetlabs-stdlib (>= 9.6.0 < 10.0.0)
- webalex-windows_firewall (>= 1.6.1 < 2.0.0)
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.