
Ce module Puppet fournit de nombreuses configurations liées à la sécurité, offrant une protection de base complète.
Ce module Puppet fournit une configuration sécurisée de votre système d'exploitation de base avec durcissement et fait partie du DevSec Hardening Framework.
Après avoir ajouté ce module, vous pouvez utiliser la classe :
class { 'os_hardening': }
Tous les paramètres sont contenus dans la classe principale os_hardening, vous devez donc simplement les passer comme ceci :
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
Si vous utilisez ce module dans un environnement PE, vous devez définir pe_environment = true
Sinon, Puppet générera une erreur (ressource en double) !
system_environment = 'default'
définit le contexte dans lequel le système fonctionne. Certaines options ne fonctionnent pas pour docker/lxcpe_environment = false
définissez ceci sur true si vous utilisez Puppet Enterprise IMPORTANT - voir ci-dessusextra_user_paths = []
ajoute des chemins supplémentaires à la variable PATH de l'utilisateur (vide par défaut).umask = undef
umask utilisé pour la création de nouveaux répertoires personnels par useradd / newusers (par ex. '027')maildir = undef
chemin pour maildir (par ex. '/var/mail')usergroups = true
true si vous voulez des groupes séparés pour chaque utilisateur, false sinonsys_uid_min = undef et sys_gid_min = undef
remplace le paramètre par défaut pour login.defspassword_max_age = 60
âge maximal du mot de passepassword_min_age = 7
âge minimal du mot de passe (avant d'autoriser tout autre changement de mot de passe)password_warn_age = 7
jours d'avertissement avant l'échéance du changement de mot de passelogin_retries = 5
le nombre maximal de tentatives de connexion si le mot de passe est incorrect (normalement remplacé par PAM / auth_retries)login_timeout = 60
délai d'authentification en secondes, la connexion se terminera si ce temps est dépasséchfn_restrict = ''
quels champs peuvent être modifiés par les utilisateurs réguliers avec chfnallow_login_without_home = false
true pour autoriser les utilisateurs sans répertoire personnel à se connecterallow_change_user = false
si un utilisateur peut utiliser su pour changer sa connexionignore_users = []
tableau des comptes d'utilisateurs système qui ne doivent pas être durcis (mot de passe désactivé et shell défini sur /usr/sbin/nologin)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
dossiers pour lesquels il faut s'assurer que le groupe et les autres n'ont pas d'accès en écriture, ni sur le dossier ni sur son contenuignore_max_files_warnings = false
true si vous ne voulez pas que Puppet journalise les avertissements max_files et de performance lors de la récursion des dossiers avec > 1000 fichiers, par ex. /bin /usr/binrecurselimit = 5
profondeur de répertoire pour la vérification récursive des permissionspasswdqc_enabled = true
true si vous voulez utiliser une vérification forte des mots de passe dans PAM avec passwdqcauth_retries = 5
le nombre maximal de tentatives d'authentification, avant que le compte soit verrouillé pendant un certain tempsauth_lockout_time = 600
temps en secondes qui doit s'écouler, si le compte a été verrouillé en raison de trop nombreuses tentatives d'authentification échouéespasswdqc_options = 'min=disabled,disabled,16,12,8'
définissez sur toute ligne d'options (sous forme de chaîne) que vous voulez passer à passwdqcmanage_pam_unix = false
true si vous voulez que pam_unix soit géré par ce moduleenable_pw_history = true
true si vous voulez que pam_unix mémorise l'historique des mots de passe pour empêcher la réutilisation des mots de passe (nécessite manage_pam_unix = true)pw_remember_last = 5
le nombre des derniers mots de passe (par ex. 5 empêchera l'utilisateur de réutiliser l'un de ses 5 derniers mots de passe)only_root_may_su = false
true lorsque seul root et les membres du groupe wheel peuvent utiliser su, doit être true pour la conformité CIS Benchmarkroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
TTY enregistrés pour rootwhitelist = []
tous les fichiers qui doivent conserver leurs bits SUID/SGID s'ils sont définis (seront combinés avec la liste blanche prédéfinie de fichiers)blacklist = []
tous les fichiers dont les bits SUID/SGID doivent être supprimés s'ils sont définis (seront combinés avec la liste noire prédéfinie de fichiers)remove_from_unknown = false
true si vous voulez supprimer les bits SUID/SGID de tout fichier qui n'est pas explicitement configuré dans une blacklist. Cela fera rechercher à chaque exécution de Puppet les bits SUID/SGID dans les systèmes de fichiers montés qui ne sont pas configurés dans la liste noire par défaut et celle de l'utilisateur. S'il trouve un bit SUID/SGID, il sera supprimé, sauf si ce fichier est dans votre whitelist.dry_run_on_unknown = false
comme remove_from_unknown ci-dessus, sauf que les bits SUID/SGID ne sont pas supprimés. Il recherchera toujours les bits SUID/SGID dans les systèmes de fichiers mais les affichera uniquement dans votre journal. Cette option n'est recommandée que lorsque vous configurez d'abord remove_from_unknown pour les bits SUID/SGID, afin de pouvoir voir les fichiers qui sont modifiés et d'ajuster votre whitelist et votre blacklist.enable_module_loading = true
true si vous voulez être autorisé à modifier les modules du noyau une fois que le système est en cours d'exécution (par ex. modprobe, rmmod)load_modules = []
charge ces modules via initramfs si enable_module_loading est falsedisable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
tableau des systèmes de fichiers (modules du noyau) qui doivent être désactivéscpu_vendor = 'intel'
requis uniquement si enable_module_loading = false : définit le fabricant du CPU pour les modules à chargericmp_ratelimit = '100'
valeur par défaut '100', permet la surcharge, nécessite une chaînedesktop_enabled = false
true s'il s'agit d'un système de bureau, c'est-à-dire Xorg, KDE/GNOME/Unity, etc.enable_ipv4_forwarding = false
true si ce système nécessite le transfert de paquets en IPv4 (par ex. routeur), false sinonmanage_ipv6 = true
true pour durcir la configuration IPv6, false pour ignorer complètement IPv6enable_ipv6 = false
false pour désactiver IPv6 sur ce système, true pour l'activerenable_ipv6_forwarding = false
true si ce système nécessite le transfert de paquets en IPv6 (par ex. routeur), false sinonarp_restricted = true
true si vous voulez que le comportement d'annonce et de réponse à ARP soit restreint, false sinonarp_ignore_samenet = false
true supprimera les paquets qui ne proviennent pas du même sous-réseau (arp_ignore = 2), false vérifiera uniquement l'IP cible (arp_ignore = 1)enable_sysrq = false
true pour activer la touche magique sysrq, false sinonenable_core_dump = false
false pour empêcher la création de fichiers core dump, true sinonenable_stack_protection = true
pour la randomisation de la disposition de l'espace d'adressage (ASLR). L'ASLR peut aider à contrer certains types d'attaques par débordement de tampon. L'ASLR peut placer la base, les bibliothèques, le tas et la pile à des positions aléatoires dans l'espace d'adressage d'un processus, ce qui rend difficile pour un programme attaquant de prédire l'adresse mémoire de la prochaine instruction.enable_rpfilter = true
true pour activer le filtrage du chemin inverse (rejeter les paquets frauduleux), false sinonrpfilter_loose = false
(uniquement si enable_rpfilter est true) mode souple (rp_filter = 2) si true, mode strict sinonenable_log_martians = true
true pour activer la journalisation des paquets réseau suspects / non routables, false sinon ATTENTION - cela peut générer d'énormes fichiers journaux !unwanted_packages = []
paquets qui doivent être supprimés du systèmewanted_packages = []
paquets qui doivent être ajoutés au systèmedisabled_services = []
services qui ne doivent pas être activésenable_grub_hardening = false
définissez sur true pour activer certaines règles de durcissement de grubgrub_user = 'root'
le nom d'utilisateur grub qui doit être fourni lors de la modification de la configuration à l'invite grubgrub_password_hash = ''
un hachage de mot de passe créé avec grub-mkpasswd-pbkdf2 qui est associé au grub_userboot_without_password = true
configure Grub pour qu'il ne demande un mot de passe que lors de la modification d'une entrée, pas lors du démarrage d'une entrée existantesystem_umask = undef
si cette variable est définie, configure l'umask pour tous les utilisateurs du système (par ex. '027')manage_home_permissions = false
définissez sur true pour gérer les permissions des fichiers et répertoires des utilisateurs locaux (g-w,o-rwx)ignore_home_users = []
tableau des utilisateurs qui ne doivent pas être restreints par manage_home_permissionsmanage_log_permissions = false
définissez sur true pour gérer les permissions des fichiers journaux (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
définit le répertoire journal principalignore_restrict_log_dir = []
tableau pour exclure les répertoires journaux sous le répertoire journal principalignore_files_in_folder_to_restrict = []
tableau pour ignorer les fichiers à durcir dans les répertoires sous le tableau folder_to_restrictmanage_cron_permissions = false
définissez sur true pour gérer les permissions des fichiers cron (og-rwx)enable_sysctl_config = true
définissez sur false pour désactiver la configuration sysctlmanage_system_users = true
définissez sur false pour désactiver la gestion des utilisateurs système (mot de passe vide et définition du shell nologin)shadow_group = undef
remplace la propriété du groupe de /etc/shadowshadow_mode = undef
remplace les permissions de fichier de /etc/shadowIl est également possible de définir les paramètres dans Hiera comme ceci :
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']
Comme le CIS Distribution Independent Linux Benchmark est un bon point de départ concernant le durcissement des systèmes, il a été jugé approprié d'implémenter un moyen simple de gérer les cas ponctuels pour lesquels on ne souhaite pas écrire un module entier.
Par exemple, pour augmenter la conformité CIS DIL sur un système Debian, il faut définir ce qui suit :
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
Les paramètres par défaut de NTP sont en réalité assez bons pour la plupart des situations, il n'est donc pas immédiatement nécessaire d'implémenter un module. Cependant, si vous utilisez un module pour contrôler ces services, c'est bien sûr préférable.
Ce module a été testé et devrait fonctionner sur la plupart des distributions Linux. Pour une liste exhaustive des systèmes d'exploitation pris en charge, consultez metadata.json
Si vous souhaitez contribuer, veuillez suivre notre guide de contribution.
Vous devez avoir un interpréteur Ruby installé sur votre système. Il peut être judicieux d'utiliser rvm à cette fin. En plus de cela, vous devez installer le Puppet Development Kit PDK et Docker Community Edition, car les tests d'intégration s'exécutent dans des conteneurs Docker.
Pour tous nos tests d'intégration, nous utilisons test-kitchen. Si vous n'êtes pas familier avec test-kitchen, veuillez consulter leur guide.
# Tests de syntaxe et de lint
pdk validate
# Tests unitaires
pdk test unit
Par défaut, les tests d'intégration s'exécutent dans des conteneurs Docker - malheureusement, tous les tests ne peuvent pas s'exécuter dans des environnements conteneurisés (par ex. les paramètres sysctl).
# Installation des dépendances
gem install bundler
bundle install
# liste toutes les instances de test
bundle exec kitchen list
# test rapide sur une machine
bundle exec kitchen test ubuntu-16-04-puppet5
# test sur toutes les machines
bundle exec kitchen test
Pour des tests d'intégration complets avec DigitalOcean, vous devez y créer un compte et configurer certaines variables d'environnement :
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - jeton d'accès pour DigitalOceanDIGITALOCEAN_SSH_KEY_IDS - ID dans DigitalOcean de votre clé ssh, voir ceci pour plus d'informationsLa clé ssh doit être nommée ~/.ssh/do_ci et ajoutée à votre profil sur DigitalOcean.
Après cela, vous êtes prêt à exécuter les tests comme décrit dans Tests d'intégration (Docker).
Si vous souhaitez exécuter les tests d'intégration complets avec Github Actions dans votre fork, vous devrez ajouter ces variables d'environnement dans les paramètres de votre fork :
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - jeton d'accès pour DigitalOceanCI_SSH_KEY - partie privée d'une clé ssh, disponible sur DigitalOcean pour vos instances, sous forme encodée en base64 (par ex. cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS - ID dans DigitalOcean de CI_SSH_KEY, voir ceci pour plus d'informationsVos correctifs seront automatiquement testés via Github Actions. Le résumé des tests est visible sur Github dans votre PR, les détails se trouvent dans les tests liés.
Vous pouvez nous joindre de plusieurs manières :
Pour le portage original de chef-os-hardening vers puppet :
Merci à tous !!
Sous licence Apache License, Version 2.0 (la « Licence ») ; vous ne pouvez pas utiliser ce fichier sauf en conformité avec la Licence. Vous pouvez obtenir une copie de la Licence à l'adresse
http://www.apache.org/licenses/LICENSE-2.0
Sauf si requis par la loi applicable ou convenu par écrit, le logiciel distribué sous la Licence est distribué sur une base « EN L'ÉTAT », SANS GARANTIES NI CONDITIONS D'AUCUNE SORTE, expresses ou implicites. Voir la Licence pour le langage spécifique régissant les permissions et les limitations sous la Licence.