
Dieses Puppet-Modul bietet zahlreiche sicherheitsbezogene Konfigurationen und gewährleistet einen umfassenden Basisschutz.
Dieses Puppet-Modul bietet eine sichere Konfiguration Ihres Basis-Betriebssystems mit Härtung und ist Teil des DevSec Hardening Framework.
Nach dem Hinzufügen dieses Moduls können Sie die Klasse verwenden:
class { 'os_hardening': }
Alle Parameter sind in der Hauptklasse os_hardening enthalten, sodass Sie sie einfach wie folgt übergeben müssen:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
Wenn Sie dieses Modul in einer PE-Umgebung verwenden, müssen Sie pe_environment = true setzen.
Andernfalls gibt Puppet einen Fehler aus (doppelte Ressource)!
system_environment = 'default'
definiert den Kontext, in dem das System läuft. Einige Optionen funktionieren nicht für docker/lxcpe_environment = false
setzen Sie dies auf true, wenn Sie Puppet Enterprise verwenden WICHTIG – siehe obenextra_user_paths = []
fügt zusätzliche Pfade zur PATH-Variable des Benutzers hinzu (Standard ist leer).umask = undef
umask, die für die Erstellung neuer Home-Verzeichnisse durch useradd / newusers verwendet wird (z. B. '027')maildir = undef
Pfad für maildir (z. B. '/var/mail')usergroups = true
true, wenn Sie separate Gruppen für jeden Benutzer möchten, andernfalls falsesys_uid_min = undef und sys_gid_min = undef
überschreibt die Standardeinstellung für login.defspassword_max_age = 60
maximale Passwortalterpassword_min_age = 7
minimale Passwortalter (bevor eine andere Passwortänderung erlaubt ist)password_warn_age = 7
Tage Warnung, bevor eine Passwortänderung fällig istlogin_retries = 5
die maximale Anzahl von Login-Versuchen, wenn das Passwort falsch ist (normalerweise durch PAM / auth_retries überschrieben)login_timeout = 60
Authentifizierungs-Timeout in Sekunden, sodass der Login beendet wird, wenn diese Zeit überschritten wirdchfn_restrict = ''
welche Felder von regulären Benutzern mit chfn geändert werden dürfenallow_login_without_home = false
true, um Benutzern ohne Home-Verzeichnis den Login zu erlaubenallow_change_user = false
ob ein Benutzer su verwenden darf, um seinen Login zu ändernignore_users = []
Array von Systembenutzerkonten, die nicht gehärtet werden sollen (Passwort deaktiviert und Shell auf /usr/sbin/nologin gesetzt)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
Ordner, bei denen sichergestellt werden soll, dass Gruppe und Andere keinen Schreibzugriff auf sie oder deren Inhalte habenignore_max_files_warnings = false
true, wenn Puppet keine max_files- und Performance-Warnungen bei der Rekursion über Ordner mit > 1000 Dateien (z. B. /bin /usr/bin) protokollieren sollrecurselimit = 5
Verzeichnistiefe für die rekursive Berechtigungsprüfungpasswdqc_enabled = true
true, wenn Sie eine starke Passwortprüfung in PAM mit passwdqc verwenden möchtenauth_retries = 5
die maximale Anzahl von Authentifizierungsversuchen, bevor das Konto für einige Zeit gesperrt wirdauth_lockout_time = 600
Zeit in Sekunden, die vergehen muss, wenn das Konto aufgrund zu vieler fehlgeschlagener Authentifizierungsversuche gesperrt wurdepasswdqc_options = 'min=disabled,disabled,16,12,8'
setzen Sie eine beliebige Optionszeile (als String), die Sie an passwdqc übergeben möchtenmanage_pam_unix = false
true, wenn pam_unix von diesem Modul verwaltet werden sollenable_pw_history = true
true, wenn pam_unix den Passwortverlauf speichern soll, um die Wiederverwendung von Passwörtern zu verhindern (erfordert manage_pam_unix = true)pw_remember_last = 5
die Anzahl der letzten Passwörter (z. B. verhindert 5, dass der Benutzer eines seiner letzten 5 Passwörter wiederverwendet)only_root_may_su = false
true, wenn nur root und Mitglieder der Gruppe wheel su verwenden dürfen; für die CIS-Benchmark-Konformität auf true erforderlichroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
registrierte TTYs für rootwhitelist = []
alle Dateien, die ihre SUID/SGID-Bits behalten sollen, falls gesetzt (werden mit der vordefinierten Whitelist von Dateien kombiniert)blacklist = []
alle Dateien, deren SUID/SGID-Bits entfernt werden sollen, falls gesetzt (werden mit der vordefinierten Blacklist von Dateien kombiniert)remove_from_unknown = false
true, wenn Sie SUID/SGID-Bits von jeder Datei entfernen möchten, die nicht explizit in einer blacklist konfiguriert ist. Dadurch durchsucht jeder Puppet-Lauf die eingehängten Dateisysteme nach SUID/SGID-Bits, die nicht in der Standard- und Benutzer-Blacklist konfiguriert sind. Wenn ein SUID/SGID-Bit gefunden wird, wird es entfernt, es sei denn, diese Datei befindet sich in Ihrer whitelist.dry_run_on_unknown = false
wie remove_from_unknown oben, nur dass SUID/SGID-Bits nicht entfernt werden. Es durchsucht weiterhin die Dateisysteme nach SUID/SGID-Bits, protokolliert sie jedoch nur in Ihrem Log. Diese Option wird nur empfohlen, wenn Sie remove_from_unknown für SUID/SGID-Bits erstmals konfigurieren, damit Sie die geänderten Dateien sehen und Anpassungen an Ihrer whitelist und blacklist vornehmen können.enable_module_loading = true
true, wenn das Ändern von Kernel-Modulen erlaubt sein soll, während das System läuft (z. B. modprobe, rmmod)load_modules = []
lädt diese Module über initramfs, wenn enable_module_loading false istdisable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
Array von Dateisystemen (Kernel-Modulen), die deaktiviert werden sollencpu_vendor = 'intel'
nur erforderlich, wenn enable_module_loading = false: setzt den CPU-Hersteller für zu ladende Moduleicmp_ratelimit = '100'
Standardwert '100', Überschreiben erlaubt, benötigt Stringdesktop_enabled = false
true, wenn dies ein Desktop-System ist, d. h. Xorg, KDE/GNOME/Unity usw.enable_ipv4_forwarding = false
true, wenn dieses System Paketweiterleitung in IPv4 benötigt (z. B. Router), andernfalls falsemanage_ipv6 = true
true, um das IPv6-Setup zu härten, false, um IPv6 vollständig zu ignorierenenable_ipv6 = false
false, um IPv6 auf diesem System zu deaktivieren, true, um es zu aktivierenenable_ipv6_forwarding = false
true, wenn dieses System Paketweiterleitung in IPv6 benötigt (z. B. Router), andernfalls falsearp_restricted = true
true, wenn das Verhalten des Ankündigens und Antwortens auf ARP eingeschränkt werden soll, andernfalls falsearp_ignore_samenet = false
true verwirft Pakete, die nicht aus demselben Subnetz stammen (arp_ignore = 2), false prüft nur die Ziel-IP (arp_ignore = 1)enable_sysrq = false
true, um die magische SysRq-Taste zu aktivieren, andernfalls falseenable_core_dump = false
false, um die Erstellung von Core-Dumps zu verhindern, andernfalls trueenable_stack_protection = true
für Address Space Layout Randomization. ASLR kann helfen, bestimmte Arten von Pufferüberlauf-Angriffen abzuwehren. ASLR kann die Basis, Bibliotheken, den Heap und den Stack an zufälligen Positionen im Adressraum eines Prozesses platzieren, was es einem angreifenden Programm erschwert, die Speicheradresse des nächsten Befehls vorherzusagen.enable_rpfilter = true
true, um Reverse-Path-Filtering zu aktivieren (verwirft gefälschte Pakete), andernfalls falserpfilter_loose = false
(nur wenn enable_rpfilter true ist) Loose Mode (rp_filter = 2) wenn true, andernfalls Strict Modeenable_log_martians = true
true, um die Protokollierung verdächtiger / nicht routbarer Netzwerkpakete zu aktivieren, andernfalls false WARNUNG – dies könnte riesige Logdateien erzeugen!unwanted_packages = []
Pakete, die vom System entfernt werden sollenwanted_packages = []
Pakete, die zum System hinzugefügt werden sollendisabled_services = []
Dienste, die nicht aktiviert sein sollenenable_grub_hardening = false
auf true setzen, um einige Grub-Härtungsregeln zu aktivierengrub_user = 'root'
der Grub-Benutzername, der bei der Änderung der Konfiguration an der Grub-Eingabeaufforderung angegeben werden mussgrub_password_hash = ''
ein Passwort-Hash, der mit grub-mkpasswd-pbkdf2 erstellt wurde und dem grub_user zugeordnet istboot_without_password = true
Grub so einrichten, dass nur beim Ändern eines Eintrags ein Passwort erforderlich ist, nicht beim Booten eines vorhandenen Eintragssystem_umask = undef
wenn diese Variable gesetzt ist, wird die umask für alle Benutzer im System eingerichtet (z. B. '027')manage_home_permissions = false
auf true setzen, um Datei- und Verzeichnisberechtigungen lokaler Benutzer zu verwalten (g-w,o-rwx)ignore_home_users = []
Array für Benutzer, die nicht durch manage_home_permissions eingeschränkt werden sollenmanage_log_permissions = false
auf true setzen, um Logdateiberechtigungen zu verwalten (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
Haupt-Logverzeichnis festlegenignore_restrict_log_dir = []
Array zum Ausschließen von Logverzeichnissen unterhalb des Haupt-Logverzeichnissesignore_files_in_folder_to_restrict = []
Array zum Ignorieren von Dateien, die in Verzeichnissen unterhalb des folder_to_restrict-Arrays gehärtet werden sollenmanage_cron_permissions = false
auf true setzen, um Cron-Dateiberechtigungen zu verwalten (og-rwx)enable_sysctl_config = true
auf false setzen, um die sysctl-Konfiguration zu deaktivierenmanage_system_users = true
auf false setzen, um die Verwaltung von Systembenutzern zu deaktivieren (leeres Passwort und Setzen der nologin-Shell)shadow_group = undef
überschreibt die Gruppenbesitzer von /etc/shadowshadow_mode = undef
überschreibt die Dateiberechtigungen von /etc/shadowEs ist auch möglich, die Parameter in Hiera wie folgt zu setzen:
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']
Da das CIS Distribution Independent Linux Benchmark ein guter Ausgangspunkt für die Härtung von Systemen ist, wurde es als angemessen erachtet, eine einfache Möglichkeit zu implementieren, um mit Einzelfällen umzugehen, für die man kein ganzes Modul schreiben möchte.
Um beispielsweise die CIS-DIL-Konformität auf einem Debian-System zu erhöhen, sollte man Folgendes setzen:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
Die Standardeinstellungen von NTP sind für die meisten Situationen tatsächlich recht gut, daher ist es nicht sofort notwendig, ein Modul zu implementieren. Wenn Sie jedoch ein Modul zur Steuerung dieser Dienste verwenden, ist das natürlich vorzuziehen.
Dieses Modul wurde getestet und sollte auf den meisten Linux-Distributionen laufen. Für eine umfangreiche Liste unterstützter Betriebssysteme siehe metadata.json
Wenn Sie beitragen möchten, folgen Sie bitte unserem Beitragsleitfaden.
Sie sollten eine Ruby-Interpreter auf Ihrem System installiert haben. Es könnte eine gute Idee sein, rvm für diesen Zweck zu verwenden. Darüber hinaus müssen Sie das Puppet Development Kit PDK und Docker Community Edition installieren, da die Integrationstests in Docker-Containern laufen.
Für alle unsere Integrationstests verwenden wir test-kitchen. Wenn Sie mit test-kitchen nicht vertraut sind, werfen Sie bitte einen Blick auf deren Leitfaden.
# Syntax- & Lint-Tests
pdk validate
# Unit-Tests
pdk test unit
Standardmäßig laufen die Integrationstests in Docker-Containern – leider können nicht alle Tests in Container-Umgebungen ausgeführt werden (z. B. sysctl-Einstellungen).
# Abhängigkeiten installieren
gem install bundler
bundle install
# alle Testinstanzen auflisten
bundle exec kitchen list
# schneller Test auf einer Maschine
bundle exec kitchen test ubuntu-16-04-puppet5
# Test auf allen Maschinen
bundle exec kitchen test
Für vollständige Integrationstests mit DigitalOcean müssen Sie dort ein Konto erstellen und einige Umgebungsvariablen einrichten:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN – Zugriffstoken für DigitalOceanDIGITALOCEAN_SSH_KEY_IDS – ID Ihres SSH-Schlüssels bei DigitalOcean, siehe dies für weitere InformationenDer SSH-Schlüssel muss ~/.ssh/do_ci heißen und zu Ihrem Profil bei DigitalOcean hinzugefügt werden.
Danach können Sie die Tests wie unter Integrationstests (Docker) beschrieben ausführen.
Wenn Sie die vollständigen Integrationstests mit Github Actions in Ihrem Fork ausführen möchten, müssen Sie diese Umgebungsvariablen in den Einstellungen Ihres Forks hinzufügen:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN – Zugriffstoken für DigitalOceanCI_SSH_KEY – privater Teil eines SSH-Schlüssels, der bei DigitalOcean für Ihre Instanzen verfügbar ist, in base64-kodierter Form (z. B. cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS – ID von CI_SSH_KEY bei DigitalOcean, siehe dies für weitere InformationenIhre Patches werden automatisch über Github Actions getestet. Die Testzusammenfassung ist auf Github in Ihrem PR sichtbar, Details finden Sie in den verlinkten Tests.
Sie können uns auf verschiedene Weise erreichen:
Für den ursprünglichen Port von chef-os-hardening auf Puppet:
Vielen Dank an alle!!
Lizenziert unter der Apache License, Version 2.0 (die "Lizenz"); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. Eine Kopie der Lizenz erhalten Sie unter
http://www.apache.org/licenses/LICENSE-2.0
Sofern nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, wird die unter der Lizenz verteilte Software auf einer "WIE BESEHEN"-BASIS OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend, bereitgestellt. Die spezifischen Berechtigungen und Einschränkungen unter der Lizenz finden Sie in der Lizenz.