
Questo modulo Puppet fornisce numerose configurazioni relative alla sicurezza, offrendo una protezione di base a tutto tondo.
Questo modulo Puppet fornisce una configurazione sicura del tuo sistema operativo di base con hardening e fa parte del DevSec Hardening Framework.
Dopo aver aggiunto questo modulo, puoi usare la classe:
class { 'os_hardening': }
Tutti i parametri sono contenuti nella classe principale os_hardening, quindi devi solo passarli in questo modo:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
Se stai usando questo modulo in un ambiente PE, devi impostare pe_environment = true
Altrimenti puppet genererà un errore (risorsa duplicata)!
system_environment = 'default'
definisce il contesto in cui il sistema opera. Alcune opzioni non funzionano con docker/lxcpe_environment = false
imposta su true se stai usando Puppet Enterprise IMPORTANTE - vedi sopraextra_user_paths = []
aggiungi percorsi aggiuntivi alla variabile PATH dell'utente (il default è vuoto).umask = undef
umask utilizzato per la creazione di nuove directory home da useradd / newusers (es. '027')maildir = undef
percorso per maildir (es. '/var/mail')usergroups = true
true se vuoi gruppi separati per ogni utente, false altrimentisys_uid_min = undef e sys_gid_min = undef
sovrascrive l'impostazione predefinita per login.defspassword_max_age = 60
età massima della passwordpassword_min_age = 7
età minima della password (prima di consentire qualsiasi altro cambio password)password_warn_age = 7
giorni di preavviso prima della scadenza del cambio passwordlogin_retries = 5
il numero massimo di tentativi di login se la password è errata (normalmente sovrascritto da PAM / auth_retries)login_timeout = 60
timeout di autenticazione in secondi, quindi il login terminerà se questo tempo trascorrechfn_restrict = ''
quali campi possono essere modificati dagli utenti normali usando chfnallow_login_without_home = false
true per consentire l'accesso agli utenti senza homeallow_change_user = false
se un utente può usare su per cambiare il proprio loginignore_users = []
array di account utente di sistema che non devono essere induriti (password disabilitata e shell impostata su /usr/sbin/nologin)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
cartelle di cui assicurarsi che gruppo e altri non abbiano accesso in scrittura né ad esse né a qualsiasi loro contenutoignore_max_files_warnings = false
true se non vuoi che puppet registri avvisi su max_files e prestazioni durante la ricorsione di cartelle con > 1000 file es. /bin /usr/binrecurselimit = 5
profondità delle directory per il controllo ricorsivo dei permessipasswdqc_enabled = true
true se vuoi usare un controllo password forte in PAM usando passwdqcauth_retries = 5
il numero massimo di tentativi di autenticazione, prima che l'account venga bloccato per un certo periodoauth_lockout_time = 600
tempo in secondi che deve trascorrere, se l'account è stato bloccato a causa di troppi tentativi di autenticazione fallitipasswdqc_options = 'min=disabled,disabled,16,12,8'
imposta qualsiasi riga di opzioni (come stringa) che vuoi passare a passwdqcmanage_pam_unix = false
true se vuoi che pam_unix sia gestito da questo moduloenable_pw_history = true
true se vuoi che pam_unix ricordi la cronologia delle password per prevenire il riutilizzo delle password (richiede manage_pam_unix = true)pw_remember_last = 5
il numero delle ultime password (es. 5 impedirà all'utente di riutilizzare una delle sue ultime 5 password)only_root_may_su = false
true quando solo root e i membri del gruppo wheel possono usare su, richiesto su true per la conformità al CIS Benchmarkroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
TTY registrati per rootwhitelist = []
tutti i file che dovrebbero mantenere i loro bit SUID/SGID se impostati (saranno combinati con la whitelist predefinita di file)blacklist = []
tutti i file che dovrebbero avere i loro bit SUID/SGID rimossi se impostati (saranno combinati con la blacklist predefinita di file)remove_from_unknown = false
true se vuoi rimuovere i bit SUID/SGID da qualsiasi file che non è esplicitamente configurato in una blacklist. Questo farà sì che ogni esecuzione di Puppet cerchi attraverso i filesystem montati alla ricerca di bit SUID/SGID che non sono configurati nella blacklist predefinita e in quella utente. Se trova un bit SUID/SGID, verrà rimosso, a meno che questo file non sia nella tua whitelist.dry_run_on_unknown = false
come remove_from_unknown sopra, solo che i bit SUID/SGID non vengono rimossi. Cercherà comunque nei filesystem alla ricerca di bit SUID/SGID ma li stamperà solo nel tuo log. Questa opzione è consigliata solo quando configuri per la prima volta remove_from_unknown per i bit SUID/SGID, così puoi vedere i file che vengono modificati e apportare modifiche alla tua whitelist e blacklist.enable_module_loading = true
true se vuoi poter modificare i moduli del kernel una volta che il sistema è in esecuzione (es. modprobe, rmmod)load_modules = []
carica questi moduli tramite initramfs se enable_module_loading è falsedisable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
array di filesystem (moduli del kernel) che dovrebbero essere disabilitaticpu_vendor = 'intel'
richiesto solo se enable_module_loading = false: imposta il vendor della CPU per i moduli da caricareicmp_ratelimit = '100'
valore predefinito '100', consente la sovrascrittura, richiede Stringdesktop_enabled = false
true se questo è un sistema desktop, es. Xorg, KDE/GNOME/Unity/ecc.enable_ipv4_forwarding = false
true se questo sistema richiede l'inoltro dei pacchetti in IPv4 (es. Router), false altrimentimanage_ipv6 = true
true per indurire la configurazione ipv6, false per ignorare completamente ipv6enable_ipv6 = false
false per disabilitare ipv6 su questo sistema, true per abilitarloenable_ipv6_forwarding = false
true se questo sistema richiede l'inoltro dei pacchetti in IPv6 (es. Router), false altrimentiarp_restricted = true
true se vuoi che il comportamento di annuncio e risposta ad ARP sia ristretto, false altrimentiarp_ignore_samenet = false
true scarterà i pacchetti che non provengono dalla stessa sottorete (arp_ignore = 2), false controllerà solo l'IP di destinazione (arp_ignore = 1)enable_sysrq = false
true per abilitare il tasto magico sysrq, false altrimentienable_core_dump = false
false per prevenire la creazione di core dump, true altrimentienable_stack_protection = true
per la Randomizzazione del Layout dello Spazio degli Indirizzi (ASLR). L'ASLR può aiutare a sconfiggere alcuni tipi di attacchi di buffer overflow. L'ASLR può posizionare la base, le librerie, l'heap e lo stack in posizioni casuali nello spazio degli indirizzi di un processo, il che rende difficile per un programma attaccante prevedere l'indirizzo di memoria della prossima istruzione.enable_rpfilter = true
true per abilitare il filtraggio del percorso inverso (scarta pacchetti falsi), false altrimentirpfilter_loose = false
(solo se enable_rpfilter è true) modalità loose (rp_filter = 2) se true, modalità strict altrimentienable_log_martians = true
true per abilitare la registrazione di pacchetti di rete sospetti / non instradabili, false altrimenti ATTENZIONE - questo potrebbe generare file di log enormi!unwanted_packages = []
pacchetti che dovrebbero essere rimossi dal sistemawanted_packages = []
pacchetti che dovrebbero essere aggiunti al sistemadisabled_services = []
servizi che non dovrebbero essere abilitatienable_grub_hardening = false
imposta su true per abilitare alcune regole di hardening di grubgrub_user = 'root'
il nome utente grub che deve essere fornito quando si modifica la configurazione al prompt di grubgrub_password_hash = ''
un hash di password creato con grub-mkpasswd-pbkdf2 associato a grub_userboot_without_password = true
configura Grub in modo che richieda una password solo quando si modifica una voce, non quando si avvia una voce esistentesystem_umask = undef
se questa variabile è impostata, configura l'umask per tutti gli utenti del sistema (es. '027')manage_home_permissions = false
imposta su true per gestire i permessi di file e directory degli utenti locali (g-w,o-rwx)ignore_home_users = []
array per gli utenti che non devono essere limitati da manage_home_permissionsmanage_log_permissions = false
imposta su true per gestire i permessi dei file di log (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
imposta la directory principale dei logignore_restrict_log_dir = []
array per escludere directory di log sotto la directory principale dei logignore_files_in_folder_to_restrict = []
array per ignorare file da indurire nelle directory sotto l'array folder_to_restrictmanage_cron_permissions = false
imposta su true per gestire i permessi dei file cron (og-rwx)enable_sysctl_config = true
imposta su false per disabilitare la configurazione sysctlmanage_system_users = true
imposta su false per disabilitare la gestione degli utenti di sistema (password vuota e impostazione della shell nologin)shadow_group = undef
sovrascrive la proprietà del gruppo di /etc/shadowshadow_mode = undef
sovrascrive i permessi dei file di /etc/shadowÈ anche possibile impostare i parametri in Hiera in questo modo:
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']
Poiché il CIS Distribution Independent Linux Benchmark è un buon punto di partenza per quanto riguarda l'hardening dei sistemi, è stato ritenuto appropriato implementare un modo semplice per gestire casi singoli per i quali non si vuole scrivere un intero modulo.
Ad esempio, per aumentare la conformità CIS DIL su un sistema Debian, si dovrebbe impostare quanto segue:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
Le impostazioni predefinite di NTP sono in realtà abbastanza buone per la maggior parte delle situazioni, quindi non è immediatamente necessario implementare un modulo. Tuttavia, se usi un modulo per controllare questi servizi, questo è ovviamente preferibile.
Questo modulo è stato testato e dovrebbe funzionare sulla maggior parte delle distribuzioni Linux. Per un elenco esteso dei sistemi operativi supportati, consulta metadata.json
Se vuoi contribuire, segui la nostra guida ai contributi.
Dovresti avere l'interprete Ruby installato sul tuo sistema. Potrebbe essere una buona idea usare rvm per questo scopo. Oltre a ciò devi installare il Puppet Development Kit PDK e Docker Community Edition, poiché i test di integrazione vengono eseguiti in container Docker.
Per tutti i nostri test di integrazione usiamo test-kitchen. Se non hai familiarità con test-kitchen, dai un'occhiata alla loro guida.
# Test di sintassi e lint
pdk validate
# Test unitari
pdk test unit
Per impostazione predefinita i test di integrazione vengono eseguiti in container docker - sfortunatamente non tutti i test possono essere eseguiti in ambienti container (es. impostazioni sysctl).
# Installa le dipendenze
gem install bundler
bundle install
# elenca tutte le istanze di test
bundle exec kitchen list
# test rapido su una macchina
bundle exec kitchen test ubuntu-16-04-puppet5
# test su tutte le macchine
bundle exec kitchen test
Per test di integrazione completi con DigitalOcean devi ottenere un account lì e configurare alcune variabili d'ambiente:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - token di accesso per DigitalOceanDIGITALOCEAN_SSH_KEY_IDS - ID in DigitalOcean della tua chiave ssh, vedi questo per maggiori informazioniLa chiave ssh deve essere nominata ~/.ssh/do_ci e aggiunta al tuo profilo su DigitalOcean.
Dopo questo sei pronto per eseguire i test come descritto in Test di Integrazione (Docker).
Se vuoi eseguire i test di integrazione completi con Github Actions nel tuo fork, dovrai aggiungere queste variabili d'ambiente nelle impostazioni del tuo fork:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - token di accesso per DigitalOceanCI_SSH_KEY - parte privata di una chiave ssh, disponibile su DigitalOcean per le tue istanze, in forma codificata base64 (es. cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS - ID in DigitalOcean di CI_SSH_KEY, vedi questo per maggiori informazioniLe tue patch verranno automaticamente testate tramite Github Actions. Il riepilogo dei test è visibile su Github nella tua PR, i dettagli si trovano nei test collegati.
Puoi raggiungerci in diversi modi:
Per la portabilità originale di chef-os-hardening a puppet:
Grazie a tutti!!
Concesso in licenza sotto la Apache License, Versione 2.0 (la "Licenza"); non puoi usare questo file se non in conformità con la Licenza. Puoi ottenere una copia della Licenza all'indirizzo
http://www.apache.org/licenses/LICENSE-2.0
Salvo quanto richiesto dalla legge applicabile o concordato per iscritto, il software distribuito sotto la Licenza è distribuito su base "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. Consulta la Licenza per le autorizzazioni e le limitazioni specifiche che regolano l'uso del software.