该 Puppet 模块为您的操作系统提供安全的加固配置,是 DevSec 加固框架 的一部分。
添加此模块后,您可以使用该类:
class { 'os_hardening': }
所有参数都包含在主 os_hardening 类中,因此您只需像这样传递它们:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
如果您在 PE 环境中使用此模块,则必须设置 pe_environment = true
否则 puppet 将报错(资源重复)!
system_environment = 'default'
定义系统运行的上下文。某些选项不适用于 docker/lxcpe_environment = false
如果您使用 Puppet Enterprise,请将其设置为 true 重要 - 请参阅上文extra_user_paths = []
向用户的 PATH 变量添加额外的路径(默认为空)。umask = undef
useradd / newusers 创建新主目录时使用的 umask(例如 '027')maildir = undef
maildir 的路径(例如 '/var/mail')usergroups = true
如果希望每个用户都有独立的组,则为 true,否则为 falsesys_uid_min = undef 和 sys_gid_min = undef
覆盖 login.defs 的默认设置password_max_age = 60
密码最大有效期也可以在 Hiera 中设置参数,如下所示:
os_hardening::password_max_age: 90
os_hardening::password_min_age: 0
os_hardening::password_warn_age: 14
os_hardening::unwanted_packages: ['telnet']
os_hardening::ignore_users: ['git','githook','ansible','apache','puppetboard']
由于 CIS 发行版无关 Linux 基准是系统加固的良好起点, 因此认为有必要实现一种简单的方式来处理那些不需要编写整个模块的一次性情况。
例如,要提高 Debian 系统上的 CIS DIL 合规性,应设置 以下内容:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
NTP 的默认设置对于大多数情况来说实际上已经足够好,因此 并非立即需要实现模块。但是,如果您确实使用模块来控制这些服务,那当然是首选。
该模块已经过测试,应该可以在大多数 Linux 发行版上运行。有关受支持操作系统的完整列表,请参阅 metadata.json
如果您想贡献代码,请遵循我们的 贡献指南。
您的系统上应安装 Ruby 解释器。为此目的使用 rvm 可能是个好主意。除此之外,您还必须安装 Puppet Development Kit PDK 和 Docker Community Edition,因为集成测试在 Docker 容器中运行。
对于我们所有的集成测试,我们使用 test-kitchen。如果您不熟悉 test-kitchen,请查看 他们的指南。
# 语法和 Lint 测试
pdk validate
# 单元测试
pdk test unit
默认情况下,集成测试将在 docker 容器中运行 - 不幸的是,并非所有测试都可以在容器环境中运行(例如 sysctl 设置)。
# 安装依赖项
gem install bundler
bundle install
# 列出所有测试实例
bundle exec kitchen list
# 在一台机器上快速测试
bundle exec kitchen test ubuntu-16-04-puppet5
# 在所有机器上测试
bundle exec kitchen test
要使用 DigitalOcean 进行完整的集成测试,您必须在那里获得一个帐户并设置一些环境变量:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - DigitalOcean 的访问令牌DIGITALOCEAN_SSH_KEY_IDS - 您的 ssh 密钥在 DigitalOcean 中的 ID,请参阅 此文档 了解更多信息ssh 密钥必须命名为 ~/.ssh/do_ci 并添加到您在 DigitalOcean 的配置文件中。
之后,您就可以按照 集成测试(Docker) 中的描述运行测试了。
如果您想在 fork 中使用 Github Actions 运行完整的集成测试,则必须在 fork 的设置中添加这些 环境变量:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - DigitalOcean 的访问令牌CI_SSH_KEY - 可在 DigitalOcean 上用于您的实例的 ssh 密钥的私钥部分,以 base64 编码形式提供(例如 cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS - CI_SSH_KEY 在 DigitalOcean 中的 ID,请参阅 此文档 了解更多信息您的补丁将自动通过 Github Actions 进行测试。测试摘要可在 Github 上的 PR 中查看,详细信息可在链接的测试中找到。
您可以通过多种方式联系我们:
对于 chef-os-hardening 到 puppet 的原始移植:
感谢大家!!
根据 Apache 许可证 2.0 版("许可证")授权; 除非遵守许可证,否则您不得使用此文件。 您可以在以下位置获得许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件 按"原样"分发,不附带任何明示或暗示的保证或条件。 请参阅许可证以了解管理权限和 限制的特定语言。
password_min_age = 7
密码最小有效期(在允许任何其他密码更改之前)password_warn_age = 7
密码更改到期前的警告天数login_retries = 5
密码错误时的最大登录重试次数(通常由 PAM / auth_retries 覆盖)login_timeout = 60
认证超时时间(秒),超过此时间登录将退出chfn_restrict = ''
普通用户可以使用 chfn 更改哪些字段allow_login_without_home = false
如果允许没有主目录的用户登录,则为 trueallow_change_user = false
用户是否可以使用 su 更改其登录身份ignore_users = []
不应被加固的系统用户帐户数组(禁用密码并将 shell 设置为 /usr/sbin/nologin)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
确保组和其他用户对其或其任何内容没有写权限的文件夹ignore_max_files_warnings = false
如果您不希望 puppet 在递归包含 > 1000 个文件的文件夹(例如 /bin /usr/bin)时记录 max_files 和性能警告,则为 truerecurselimit = 5
递归权限检查的目录深度passwdqc_enabled = true
如果您希望在 PAM 中使用 passwdqc 进行强密码检查,则为 trueauth_retries = 5
帐户被锁定一段时间之前允许的最大认证尝试次数auth_lockout_time = 600
如果帐户因认证失败次数过多而被锁定,需要经过的时间(秒)passwdqc_options = 'min=disabled,disabled,16,12,8'
设置为要传递给 passwdqc 的任何选项行(作为字符串)manage_pam_unix = false
如果您希望此模块管理 pam_unix,则为 trueenable_pw_history = true
如果您希望 pam_unix 记住密码历史以防止密码重用,则为 true(需要 manage_pam_unix = true)pw_remember_last = 5
最近密码的数量(例如 5 将阻止用户重用其最近 5 个密码中的任何一个)only_root_may_su = false
当只有 root 和 wheel 组成员可以使用 su 时为 true,CIS 基准合规性要求为 trueroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
root 注册的 TTYwhitelist = []
如果设置了 SUID/SGID 位,应保留其 SUID/SGID 位的所有文件(将与预定义的文件白名单合并)blacklist = []
如果设置了 SUID/SGID 位,应移除其 SUID/SGID 位的所有文件(将与预定义的文件黑名单合并)remove_from_unknown = false
如果您希望从任何未在 blacklist 中明确配置的文件中移除 SUID/SGID 位,则为 true。这将使每次 Puppet 运行都搜索已挂载的文件系统,查找未在默认和用户黑名单中配置的 SUID/SGID 位。如果找到 SUID/SGID 位,除非该文件在您的 whitelist 中,否则将被移除。dry_run_on_unknown = false
类似于上面的 remove_from_unknown,只是不移除 SUID/SGID 位。它仍将搜索文件系统以查找 SUID/SGID 位,但只会在您的日志中打印它们。此选项仅在您首次为 SUID/SGID 位配置 remove_from_unknown 时推荐使用,以便您可以查看正在更改的文件并对您的 whitelist 和 blacklist 进行调整。enable_module_loading = true
如果您希望在系统运行后允许更改内核模块(例如 modprobe、rmmod),则为 trueload_modules = []
如果 enable_module_loading 为 false,则通过 initramfs 加载这些模块disable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
应禁用的文件系统(内核模块)数组cpu_vendor = 'intel'
仅在 enable_module_loading = false 时需要:设置要加载模块的 CPU 厂商icmp_ratelimit = '100'
默认值 '100',允许覆盖,需要字符串desktop_enabled = false
如果这是桌面系统(即 Xorg、KDE/GNOME/Unity 等),则为 trueenable_ipv4_forwarding = false
如果此系统需要 IPv4 数据包转发(例如路由器),则为 true,否则为 falsemanage_ipv6 = true
true 表示加固 ipv6 设置,false 表示完全忽略 ipv6enable_ipv6 = false
false 表示在此系统上禁用 ipv6,true 表示启用enable_ipv6_forwarding = false
如果此系统需要 IPv6 数据包转发(例如路由器),则为 true,否则为 falsearp_restricted = true
如果您希望限制 ARP 通告和回复的行为,则为 true,否则为 falsearp_ignore_samenet = false
true 将丢弃不来自同一子网的数据包(arp_ignore = 2),false 将仅检查目标 IP(arp_ignore = 1)enable_sysrq = false
true 表示启用魔术 sysrq 键,否则为 falseenable_core_dump = false
false 表示阻止创建核心转储,否则为 trueenable_stack_protection = true
用于地址空间布局随机化。ASLR 可以帮助抵御某些类型的缓冲区溢出攻击。ASLR 可以将基址、库、堆和栈定位在进程地址空间中的随机位置,这使得攻击程序难以预测下一条指令的内存地址。enable_rpfilter = true
true 表示启用反向路径过滤(丢弃伪造数据包),否则为 falserpfilter_loose = false
(仅在 enable_rpfilter 为 true 时)如果为 true,则为 宽松模式(rp_filter = 2),否则为 严格模式enable_log_martians = true
true 表示启用对可疑/不可路由网络数据包的日志记录,否则为 false 警告 - 这可能会生成巨大的日志文件!unwanted_packages = []
应从系统中移除的软件包wanted_packages = []
应添加到系统中的软件包disabled_services = []
不应启用的服务enable_grub_hardening = false
设置为 true 以启用一些 grub 加固规则grub_user = 'root'
在 grub 提示符下更改配置时需要提供的 grub 用户名grub_password_hash = ''
使用 grub-mkpasswd-pbkdf2 创建的与 grub_user 关联的密码哈希boot_without_password = true
设置 Grub,使其仅在更改条目时需要密码,而在引导现有条目时不需要system_umask = undef
如果设置了此变量,则为系统中的所有用户设置 umask(例如 '027')manage_home_permissions = false
设置为 true 以管理本地用户的文件和目录权限(g-w,o-rwx)ignore_home_users = []
不受 manage_home_permissions 限制的用户数组manage_log_permissions = false
设置为 true 以管理日志文件权限(g-wx,o-rwx)restrict_log_dir = ['/var/log/']
设置主日志目录ignore_restrict_log_dir = []
用于排除主日志目录下的日志目录的数组ignore_files_in_folder_to_restrict = []
用于忽略 folder_to_restrict 数组下目录中需要加固的文件的数组manage_cron_permissions = false
设置为 true 以管理 cron 文件权限(og-rwx)enable_sysctl_config = true
设置为 false 以禁用 sysctl 配置manage_system_users = true
设置为 false 以禁用管理系统用户(空密码和设置 nologin shell)shadow_group = undef
覆盖 /etc/shadow 的组所有权shadow_mode = undef
覆盖 /etc/shadow 的文件权限