konstruktoid.hardening

Ansible-Rolle zur Härtung von Servern

Dies ist eine Ansible Rolle, die darauf abzielt, die Sicherheit von Servern, die auf AlmaLinux, Debian oder Ubuntu betrieben werden, zu verbessern.

Die Rolle konzentriert sich auf systemd und erfordert Ansible-Version 2.15 oder höher.

Die Rolle unterstützt die folgenden Betriebssysteme:

Für die Nutzung von AWS oder Azure gibt es auch gehärtete Ubuntu Amazon Machine Images (AMIs) und Azure-Images.

Diese sind im Repository konstruktoid/hardened-images verfügbar. Diese Bilder werden mit Packer erstellt, und diese Ansible-Rolle wird zur Konfiguration verwendet.

Hinweis Verwenden Sie diese Rolle nicht, ohne sie zuerst in einer nicht betrieblichen Umgebung zu testen.

Hinweis Es gibt ein SLSA Artefakt im SLSA-Aktionsworkflow zur Überprüfung.

Abhängigkeiten

Keine.

Beispiele

Anforderungen

---
roles:
  - name: konstruktoid.hardening
    version: v2.1.0
    src: https://github.com/konstruktoid/ansible-role-hardening.git
    scm: git

Playbook

---
- name: Importiere und nutze die Härtungsrolle
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Importiere die Härtungsrolle
      ansible.builtin.import_role:
        name: konstruktoid.hardening
      vars:
        sshd_admin_net:
          - 10.0.2.0/24
          - 192.168.0.0/24
          - 192.168.1.0/24
        suid_sgid_permissions: false

Lokales Playbook mit git checkout

---
- name: Klone und konfiguriere konstruktoid.hardening
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Klone das Härtungsrepository
      become: true
      tags:
        - always
      block:
        - name: Installiere git
          ansible.builtin.package:
            name: git
            state: present

        - name: Klone konstruktoid.hardening
          become: true
          ansible.builtin.git:
            repo: https://github.com/konstruktoid/ansible-role-hardening
            dest: /etc/ansible/roles/konstruktoid.hardening
            version: v2.1.0

        - name: Entferne git
          ansible.builtin.package:
            name: git
            state: absent

    - name: Beziehe die Härtungsrolle
      ansible.builtin.include_role:
        name: konstruktoid.hardening
      vars:
        sshd_allow_groups:
          - ubuntu
        sshd_login_grace_time: 60
        sshd_max_auth_tries: 10
        sshd_use_dns: false
        sshd_update_moduli: true

Hinweis zu UFW-Regeln

Anstatt ufw bei jedem Lauf zurückzusetzen und somit Netzwerkverkehr zu stören, löscht die Rolle jede ufw-Regel ohne den comment: ansible managed Task-Parameter.

Die Rolle setzt auch Standard-Verbotsrichtlinien, was bedeutet, dass Firewallregeln für alle zusätzlichen Ports erstellt werden müssen, außer den in den Variablen sshd_ports und ufw_outgoing_traffic angegebenen.

Siehe ufw(8) für weitere Informationen.

Task-Ausführung und Struktur

Siehe STRUCTURE.md für die Struktur der Rolle.

Rollen-Test

Siehe TESTING.md.

Rollenvariablen mit Standardwerten

./defaults/main/aide.yml

manage_aide: true

aide_checksums: sha512
aide_dir_exclusions:
  - /var/lib/docker
  - /var/lib/lxcfs
  - /var/lib/private/systemd
  - /var/log/audit
  - /var/log/journal

Wenn manage_aide: true ist, wird AIDE installiert und konfiguriert.

aide_checksums ändert die AIDE-Variable Checksums. Beachten Sie, dass die Checksums-Variable je nach Distribution möglicherweise nicht vorhanden ist.

aide_dir_exclusions ist eine Liste von Verzeichnissen, die von der AIDE-Datenbank ausgeschlossen werden.

aide.conf(5)

./defaults/main/auditd.yml

manage_auditd: true

auditd_apply_audit_rules: true
auditd_action_mail_acct: root
auditd_admin_space_left_action: suspend
auditd_disk_error_action: suspend
auditd_disk_full_action: suspend
auditd_enable_flag: 2
auditd_flush: incremental_async
auditd_max_log_file: 20
auditd_max_log_file_action: rotate
auditd_mode: 1
auditd_num_logs: 5
auditd_space_left: 75
auditd_space_left_action: email
grub_audit_backlog_cmdline: audit_backlog_limit=8192
grub_audit_cmdline: audit=1

Wenn manage_auditd: true ist, dann wird das Linux Audit System konfiguriert und beim Booten mit GRUB aktiviert.

Wenn auditd_apply_audit_rules: 'yes', werden die Audit-Regeln aus der enthaltenen Vorlage angewendet.

auditd_action_mail_acct sollte eine gültige E-Mail-Adresse oder Alias sein.

auditd_admin_space_left_action definiert, welche Aktion unternommen werden soll, wenn das System feststellt, dass auf dem Datenträger nur noch wenig Speicherplatz vorhanden ist. suspend führt dazu, dass der Auditing-Daemon aufhört, Protokolle auf die Festplatte zu schreiben.

auditd_enable_flag setzt das Aktivierungsflag. Wenn 0 übergeben wird, wird das Auditing vorübergehend deaktiviert. 1 aktiviert das Auditing und 2 sperrt die Audit-Konfiguration.

auditd_flush: sync weist den Audit-Daemon an, sowohl die Daten als auch die Metadaten bei jedem Schreibvorgang auf die Festplatte vollständig zu synchronisieren.

auditd_max_log_file_action legt fest, welche Aktion zu unternehmen ist, wenn das System festgestellt hat, dass die maximale Dateigröße erreicht wurde. Z.B. wird die Option rotate dazu führen, dass der Audit-Daemon die Protokolle rotiert. Die Option keep_logs ist ähnlich wie rotate, verwendet jedoch nicht die Einstellung num_logs. Dies verhindert, dass Audit-Protokolle überschrieben werden.

auditd_space_left_action gibt dem System an, welche Aktion zu ergreifen ist, wenn das System festgestellt hat, dass es wenig Speicherplatz auf dem Datenträger hat. email bedeutet, dass eine Warnung an die in action_mail_acct angegebene E-Mail-Adresse gesendet wird sowie eine Nachricht an syslog gesendet wird.

auditd_mode setzt den Fehlerzustand von auditd, 0=silent 1=printk 2=panic.

auditd.conf(5)

./defaults/main/automatic_updates.yml

automatic_updates:
  enabled: true
  reboot: false

Wenn automatic_updates aktiviert ist, werden dnf-automatic oder unattended-upgrades installiert und konfiguriert, abhängig von der Distribution.

Wenn die Option reboot auf true gesetzt ist, wird das System bei Bedarf neu gestartet. Siehe Unattended-Upgrade::Automatic-Reboot und dnf_automatic: reboot.

./defaults/main/compilers.yml

manage_compilers: true

compilers:
  - as
  - cargo
  - cc
  - cc-[0-9]*
  - clang-[0-9]*
  - gcc
  - gcc-[0-9]*
  - go
  - make
  - rustc

Wenn manage_compilers: true ist, dann werden die aufgelisteten Compiler auf den root-Benutzer beschränkt.

./defaults/main/crypto_policies.yml

set_crypto_policy: true
crypto_policy: DEFAULT:NO-SHA1

Setze und benutze kryptografische Richtlinien, wenn /etc/crypto-policies/config vorhanden ist und set_crypto_policy: true ist.

./defaults/main/disablewireless.yml

disable_wireless: false

Wenn true, werden alle drahtlosen Schnittstellen deaktiviert.

./defaults/main/dns.yml

manage_resolved: true

dns:
  - 1.1.1.2
  - 9.9.9.9
fallback_dns:
  - 1.0.0.2
  - 149.112.112.112
dnssec: allow-downgrade
dns_over_tls: opportunistic

Wenn manage_resolved: true ist, wird systemd-resolved konfiguriert.

IPv4- und IPv6-Adressen, die als System- und Fallback-DNS-Server verwendet werden sollen. Wenn dnssec auf "allow-downgrade" gesetzt ist, wird versucht, eine DNSSEC-Validierung durchzuführen, aber wenn der Server DNSSEC nicht ordnungsgemäß unterstützt, wird der DNSSEC-Modus automatisch deaktiviert.

Wenn dns_over_tls auf true gesetzt ist, werden alle Verbindungen zum Server verschlüsselt, wenn der DNS-Server DNS-over-TLS unterstützt und über ein gültiges Zertifikat verfügt.

./defaults/main/ipv6.yml

disable_ipv6: false
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 0

ipv6_disable_sysctl_settings:
  net.ipv6.conf.all.disable_ipv6: 1
  net.ipv6.conf.default.disable_ipv6: 1

ipv6_sysctl_settings:
  net.ipv6.conf.all.accept_ra: 0
  net.ipv6.conf.all.accept_redirects: 0
  net.ipv6.conf.all.accept_source_route: 0
  net.ipv6.conf.all.forwarding: 0
  net.ipv6.conf.all.use_tempaddr: 2
  net.ipv6.conf.default.accept_ra: 0
  net.ipv6.conf.default.accept_ra_defrtr: 0
  net.ipv6.conf.default.accept_ra_pinfo: 0
  net.ipv6.conf.default.accept_ra_rtr_pref: 0
  net.ipv6.conf.default.accept_redirects: 0
  net.ipv6.conf.default.accept_source_route: 0
  net.ipv6.conf.default.autoconf: 0
  net.ipv6.conf.default.dad_transmits: 0
  net.ipv6.conf.default.max_addresses: 1
  net.ipv6.conf.default.router_solicitations: 0
  net.ipv6.conf.default.use_tempaddr: 2

Wenn disable_ipv6: true ist, wird IPv6 deaktiviert und die zugehörigen sysctl-Einstellungen werden konfiguriert.

ipv6_sysctl_settings ist die sysctl-Konfiguration, die verwendet wird, wenn der Host IPv6 verwendet.

sysctl.conf

./defaults/main/journal.yml

rsyslog_filecreatemode: "0640"

journald_compress: true
journald_forwardtosyslog: false
journald_storage: persistent

rsyslog_filecreatemode setzt den Erstellungsmodus, mit dem rsyslogd neue Dateien erstellt. Siehe rsconf1_filecreatemode.

journald_compress kann einen booleschen Wert annehmen. Wenn aktiviert (Standardwert), werden Datenobjekte komprimiert, bevor sie auf das Dateisystem geschrieben werden.

journald_storage steuert, wo die Journaldaten gespeichert werden. Eine der Optionen volatile, persistent, auto und none.

journald_forwardtosyslog steuert, ob die vom Journaldämon empfangenen Protokollnachrichten an einen traditionellen Syslog-Dämon weitergeleitet werden.

Siehe journald.conf für mehr Informationen.

./defaults/main/kernel.yml

allow_virtual_system_calls: true
enable_page_poisoning: true
kernel_lockdown: false
page_table_isolation: true
slub_debugger_poisoning: false

allow_virtual_system_calls erlaubt virtuelle Systemaufrufe, wenn true, andernfalls wird keine vsyscall-Zuordnung festgelegt. Siehe CONFIG_LEGACY_VSYSCALL_NONE.

enable_page_poisoning: true aktiviert CONFIG_PAGE_POISONING.

kernel_lockdown konfiguriert die Kernel-Lockdown-Funktion. Gültige Werte sind false, true, integrity und confidentiality. Wenn true, wird der Kernel im integrity-Modus gesperrt.

page_table_isolation ist eine Schutzmaßnahme gegen Angriffe auf den gemeinsamen Benutzer-/Kernel-Adressraum. Siehe CONFIG_PAGE_TABLE_ISOLATION.

slub_debugger_poisoning, wenn auf true gesetzt, verhindert viele Arten von Use-After-Free-Sicherheitsanfälligkeiten und verhindert auch Datenleckagen sowie die Erkennung von beschädigtem Speicher. Siehe Kurzanleitung für SLUB.

./defaults/main/limits.yml

limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512

Setze die maximale Anzahl von Prozessen und geöffneten Dateien. Siehe limits.conf(5).

./defaults/main/misc.yml

reboot_ubuntu: false
redhat_signing_keys:
  - 567E347AD0044ADE55BA8A5F199E2F91FD431D51
  - 47DB287789B21722B6D95DDE5326810137017186
epel7_signing_keys:
  - 91E97D7C4A5E96F17F3E888F6A2FAEA2352C64E5
epel8_signing_keys:
  - 94E279EB8D8F25B21810ADF121EA45AB2F86D6A1
epel9_signing_keys:
  - FF8AD1344597106ECE813B918A3872BF3228467C

Wenn reboot_ubuntu: true ist, wird ein Ubuntu-Server neu gestartet, wenn dies erforderlich ist.

redhat_signing_keys sind die RedHat Product Signing Keys.

Die epel7_signing_keys, epel8_signing_keys und epel9_signing_keys sind distributionsspezifische Fedora EPEL Signing Keys.

./defaults/main/module_blocklists.yml

fs_modules_blocklist:
  - cramfs
  - freevxfs
  - hfs
  - hfsplus
  - jffs2
  - squashfs
  - udf

misc_modules_blocklist:
  - bluetooth
  - bnep
  - btusb
  - can
  - cpia2
  - firewire-core
  - floppy
  - ksmbd
  - n_hdlc
  - net-pf-31
  - pcspkr
  - soundcore
  - thunderbolt
  - usb-midi
  - usb-storage
  - uvcvideo
  - v4l2_common

net_modules_blocklist:
  - atm
  - dccp
  - sctp
  - rds
  - tipc

Kernelmodule, die schwarzgelistet und mittels einer Fake-Installation deaktiviert werden sollen.

Hinweis

Die Deaktivierung des usb-storage-Moduls wird alle USB-Speichergeräte deaktivieren. Wenn solche Geräte benötigt werden, sollte USBGuard oder ein ähnliches Tool entsprechend konfiguriert werden.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid setzt den Zugriffsmodus von /proc/<pid>/.

Die Einstellung process_group konfiguriert die Gruppe, die berechtigt ist, Prozessinformationen zu erfahren, die andernfalls durch hidepid= verboten sind.

/proc-Mountoptionen

./defaults/main/ntp.yml

manage_timesyncd: true

fallback_ntp:
  - ntp.netnod.se
  - ntp.ubuntu.com
ntp:
  - 2.pool.ntp.org
  - time.nist.gov

Wenn manage_timesyncd: true ist, dann wird systemd timesyncd konfiguriert. Andernfalls wird empfohlen, einen NTP-Client zu installieren.

./defaults/main/packagemgmt.yml

apt_hardening_options:
  - Acquire::AllowDowngradeToInsecureRepositories "false";
  - Acquire::AllowInsecureRepositories "false";
  - Acquire::http::AllowRedirect "false";
  - APT::Get::AllowUnauthenticated "false";
  - APT::Get::AutomaticRemove "true";
  - APT::Install-Recommends "false";
  - APT::Install-Suggests "false";
  - APT::Periodic::AutocleanInterval "7";
  - APT::Sandbox::Seccomp "1";
  - Unattended-Upgrade::Remove-Unused-Dependencies "true";
  - Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";

Konfiguriere die APT-Werkzeug-Suite.

./defaults/main/packages.yml

system_upgrade: true

packages_blocklist:
  - apport*
  - autofs
  - avahi*
  - avahi-*
  - beep
  - git
  - pastebinit
  - popularity-contest
  - prelink
  - rpcbind
  - rsh*
  - rsync
  - talk*
  - telnet*
  - tftp*
  - tuned
  - whoopsie
  - xinetd
  - yp-tools
  - ypbind

packages_debian:
  - acct
  - apparmor-profiles
  - apparmor-utils
  - apt-show-versions
  - audispd-plugins
  - auditd
  - cracklib-runtime
  - debsums
  - gnupg2
  - haveged
  - libpam-apparmor
  - libpam-cap
  - libpam-modules
  - libpam-pwquality
  - libpam-tmpdir
  - lsb-release
  - needrestart
  - openssh-server
  - postfix
  - rsyslog
  - sysstat
  - systemd-journal-remote
  - tcpd
  - vlock
  - wamerican

packages_redhat:
  - audispd-plugins
  - audit
  - cracklib
  - gnupg2
  - haveged
  - libpwquality
  - openssh-server
  - needrestart
  - postfix
  - psacct
  - python3-dnf-plugin-post-transaction-actions
  - rsyslog
  - rsyslog-gnutls
  - systemd-journal-remote
  - vlock
  - words

packages_ubuntu:
  - fwupd
  - secureboot-db
  - snapd

system_upgrade: true führt apt upgrade oder dnf update durch, falls erforderlich.

Pakete werden je nach Distribution installiert, und Pakete werden entfernt (siehe packages_blocklist).

./defaults/main/password.yml

manage_faillock: true

faillock:
  admin_group: []
  audit: true
  deny: 5
  dir: /var/run/faillock
  even_deny_root: true
  fail_interval: 900
  local_users_only: true
  no_log_info: false
  nodelay: true
  root_unlock_time: 600
  silent: false
  unlock_time: 600

login_defs:
  login_retries: 5
  login_timeout: 60
  pass_max_days: 60
  pass_min_days: 1
  pass_warn_age: 7

password_remember: 5

pwquality:
  dcredit: -1
  dictcheck: 1
  dictpath: ""
  difok: 8
  enforce_for_root: true
  enforcing: 1
  gecoscheck: 1
  lcredit: -1
  local_users_only: true
  maxclassrepeat: 4
  maxrepeat: 3
  minclass: 4
  minlen: 15
  ocredit: -1
  retry: 3
  ucredit: -1
  usercheck: 1
  usersubstr: 3

manage_faillock: true aktiviert die faillock-Bibliothek.

password_remember legt die Größe des Passwortverlaufs fest, den der Benutzer nicht wiederverwenden kann.

Die Variablen faillock, login_defs und pwquality dienen zur Konfiguration von pam_faillock, login.defs und libpwquality.

./defaults/main/rkhunter.yml

manage_rkhunter: true

rkhunter_allow_ssh_prot_v1: false
rkhunter_allow_ssh_root_user: false
rkhunter_mirrors_mode: "0"
rkhunter_update_mirrors: true
rkhunter_web_cmd: curl -fsSL

Wenn manage_rkhunter: true ist, wird rkhunter konfiguriert.

./defaults/main/sshd.yml

manage_ssh: true

sshd_accept_env: LANG LC_*
sshd_admin_net:
  - 192.168.0.0/24
  - 192.168.1.0/24
sshd_allow_agent_forwarding: false
sshd_allow_groups:
  - sudo
sshd_allow_tcp_forwarding: false
sshd_allow_users:
  - "{{ ansible_user | default(lookup('ansible.builtin.env', 'USER')) }}"
sshd_authentication_methods: any
sshd_authorized_principals_file: /etc/ssh/auth_principals/%u
sshd_banner: /etc/issue.net
sshd_ca_signature_algorithms:
  - ecdsa-sha2-nistp256
  - ecdsa-sha2-nistp384
  - ecdsa-sha2-nistp521
  - ssh-ed25519
  - rsa-sha2-256
  - rsa-sha2-512
  - ssh-rsa
sshd_kbd_interactive_authentication: false
sshd_ciphers:
  - [email protected]
  - [email protected]
  - aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: false
sshd_config_d_force_clear: false
sshd_config_force_replace: false
sshd_debian_banner: false
sshd_deny_groups: []
sshd_deny_users: []
sshd_gssapi_authentication: false
sshd_host_key_algorithms:
  - [email protected]
  - [email protected]
  - ssh-ed25519
  - ssh-rsa
  - [email protected]
  - [email protected]
  - [email protected]
  - ecdsa-sha2-nistp521
  - ecdsa-sha2-nistp384
  - ecdsa-sha2-nistp256
sshd_host_keys_files: []
sshd_host_keys_group: root
sshd_host_keys_mode: "0600"
sshd_host_keys_owner: root
sshd_hostbased_authentication: false
sshd_ignore_rhosts: true
sshd_ignore_user_known_hosts: true
sshd_kerberos_authentication: false
sshd_kex_algorithms:
  - [email protected]
  - ecdh-sha2-nistp521
  - ecdh-sha2-nistp384
  - ecdh-sha2-nistp256
  - diffie-hellman-group-exchange-sha256
sshd_listen:
  - 0.0.0.0
sshd_log_level: VERBOSE
sshd_login_grace_time: 20
sshd_macs:
  - [email protected]
  - [email protected]
  - hmac-sha2-512
  - hmac-sha2-256
sshd_match_addresses: {}
sshd_match_groups: {}
sshd_match_local_ports: {}
sshd_match_users: {}
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: false
sshd_permit_empty_passwords: false
sshd_permit_root_login: false
sshd_permit_tunnel: false
sshd_permit_user_environment: false
sshd_ports:
  - 22
sshd_print_last_log: true
sshd_print_motd: false
sshd_print_pam_motd: false
sshd_rekey_limit: 512M 1h
sshd_required_ecdsa_size: 521
sshd_required_rsa_size: 4096
sshd_sftp_enabled: true
sshd_sftp_only_chroot: true
sshd_sftp_only_chroot_dir: "%h"
sshd_sftp_only_group: ""
sshd_sftp_subsystem: internal-sftp -f LOCAL6 -l INFO
sshd_strict_modes: true
sshd_syslog_facility: AUTH
sshd_tcp_keep_alive: false
sshd_trusted_user_ca_keys_base64: ""
sshd_trusted_user_ca_keys_file: /etc/ssh/trusted-user-ca-keys.pem
sshd_update_moduli: false
sshd_use_dns: false
sshd_use_pam: true
sshd_use_privilege_separation: sandbox
sshd_x11_forwarding: false

Wenn manage_ssh: true ist, werden der SSH-Client und der SSH-Daemon konfiguriert.

Hinweis

CASignatureAlgorithms, Ciphers, HostKeyAlgorithms, KexAlgorithms und MACs werden wie durch kryptografische Richtlinien definiert konfiguriert, wenn /etc/crypto-policies/config vorhanden ist und set_crypto_policy: true.

Für eine Erklärung der nicht beschriebenen Optionen lesen Sie bitte https://man.openbsd.org/sshd_config.

Nur die in sshd_admin_net definierten Netzwerke dürfen eine Verbindung zu sshd_ports herstellen. Beachten Sie, dass zusätzliche Regeln eingerichtet werden müssen, um Zugriff auf zusätzliche Dienste zu ermöglichen.

Der OpenSSH-Login ist nur für Benutzer zulässig, deren primäre Gruppe oder ergänzende Gruppenliste mit einem der Muster in sshd_allow_groups übereinstimmt. Der OpenSSH-Login ist auch für Benutzer in sshd_allow_users zulässig. Um das Gegenteil zu tun und den Zugang zu verweigern, verwenden Sie die Parameter sshd_deny_groups und sshd_deny_users, die wiederum Vorrang vor den vorherigen Parametern haben.

sshd_allow_agent_forwarding gibt an, ob das ssh-agent(1)-Forwarding erlaubt ist.

sshd_allow_tcp_forwarding gibt an, ob TCP-Forwarding erlaubt ist. Die verfügbaren Optionen sind true oder all, um TCP-Forwarding zu erlauben, false, um alle TCP-Forwardings zu verhindern, local, um nur lokales (aus der Perspektive von ssh(1)) Forwarding zu erlauben, oder remote, um nur remote Forwarding zu erlauben.

sshd_authentication_methods gibt die Authentifizierungsmethoden an, die erfolgreich abgeschlossen werden müssen, um einem Benutzer Zugriff zu gewähren.

sshd_log_level gibt das Verbosity-Niveau an, das beim Protokollieren von Nachrichten verwendet wird.

sshd_max_auth_tries und sshd_max_sessions legen die maximale Anzahl von SSH-Authentifizierungsversuchen fest, die pro Verbindung erlaubt sind, und die maximale Anzahl von offenen Shell-, Login- oder Subsystem- (z. B. sftp) Sitzungen, die pro Netzwerkverbindung erlaubt sind.

sshd_password_authentication gibt an, ob die Passwortauthentifizierung erlaubt ist.

sshd_ports legt die Portnummer(n) fest, auf denen sshd(8) lauscht.

sshd_required_rsa_size, RequiredRSASize, wird nur gesetzt, wenn die SSH-Version höher als 9.1 ist.

sshd_config_d_force_clear zwingt dazu, das Verzeichnis /etc/ssh/sshd_config.d zu leeren. Standard: false.

sshd_config_force_replace zwingt dazu, die Konfigurationsdatei /etc/ssh/sshd_config zu ersetzen. Standard: false.

Hinweis

Standardmäßig überprüft die Rolle, ob das Verzeichnis /etc/ssh/sshd_config.d vorhanden ist und ob es über den Include-Parameter in der Datei /etc/ssh/sshd_config verlinkt ist. Wenn dies der Fall ist, wird eine zusätzliche Konfigurationsdatei in /etc/ssh/sshd_config.d erstellt. Wenn nicht, wird die Datei /etc/ssh/sshd_config überschrieben.

Warnung

Wenn einer der Parameter sshd_match_(users|groups|addresses|local_ports) oder sshd_sftp_only_group gesetzt ist, wird der Wert true implizit.

sshd_host_keys_files Hostschlüssel für sshd. Wenn leer, werden ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'] verwendet, sofern dies von der installierten sshd-Version unterstützt wird.

sshd_host_keys_owner setzt den Besitzer der Hostschlüssel für sshd.

sshd_host_keys_group setzt die Gruppe der Hostschlüssel für sshd.

sshd_host_keys_mode legt die Berechtigung der Hostschlüssel für sshd fest.

sshd_match_users fügt einen bedingten Block für Benutzer hinzu. Wenn alle Kriterien in der Match-Zeile erfüllt sind, überschreiben die Regeln/Parameter, die in den folgenden Zeilen definiert sind, die im globalen Abschnitt der Konfigurationsdatei festgelegten Regeln, bis entweder eine andere Match-Zeile oder das Ende der Datei erreicht ist.

Erwartete Konfigurationsstruktur:

sshd_match_users:
  - user: <benutzername>
    rules:
      - <parameter sshd> <wert>
      - <parameter sshd> <wert>

Beispiel, um dem ubuntu-Benutzer den Zugang über Passwortauthentifizierung und dem ansible-Benutzer den Zugang ohne Banner zu erlauben:

sshd_match_users:
  - user: ubuntu
    rules:
      - AllowUsers ubuntu
      - AuthenticationMethods password
      - PasswordAuthentication yes
  - user: ansible
    rules:
      - AllowUsers ansible
      - Banner none

sshd_match_groups fügt einen bedingten Block für Gruppen hinzu. Weitere Details und Beispiele in der Parameterbeschreibung sshd_match_users.

Erwartete Konfigurationsstruktur:

sshd_match_groups:
  - group: <gruppenname>
    rules:
      - <parameter sshd> <wert>
      - <parameter sshd> <wert>

sshd_match_addresses fügt einen bedingten Block für Adressen hinzu. Weitere Details und Beispiele in der Parameterbeschreibung sshd_match_users.

Erwartete Konfigurationsstruktur:

sshd_match_addresses:
  - address: <ip>
    rules:
      - <parameter sshd> <wert>
      - <parameter sshd> <wert>

sshd_match_local_ports fügt einen bedingten Block für Ports hinzu. Weitere Details und Beispiele in der Parameterbeschreibung sshd_match_users.

Erwartete Konfigurationsstruktur:

sshd_match_ports:
  - port: <port>
    rules:
      - <parameter sshd> <wert>
      - <parameter sshd> <wert>

sshd_print_pam_motd gibt an, ob das Drucken der MOTD über pam erfolgen soll.

sshd_sftp_enabled gibt an, ob die SFTP-Konfiguration aktiviert ist.

sshd_sftp_subsystem legt das Subsystem für den Dateiübertragungsdaemon fest.

sshd_sftp_only_group gibt den Namen der Gruppe an, die Zugriff hat, der nur auf den SFTP-Dienst beschränkt ist.

sshd_sftp_only_chroot gibt an, dass der Gruppen Zugriff über chroot-Isolierung erfolgt.

sshd_sftp_only_chroot_dir gibt das Chroot-Verzeichnis an. Akzeptiert die Tokens %% (ein Literal %), %h (das Heimatverzeichnis des Benutzers) und %u (Benutzername).

sshd_syslog_facility setzt den Facility-Code, der zum Protokollieren von Nachrichten verwendet wird.

sshd_update_moduli, wenn auf true gesetzt, lädt eine aktualisierte moduli-Datei aus dem konstruktoid/ssh-moduli Repository herunter.

./defaults/main/suid_sgid_blocklist.yml

suid_sgid_permissions: true
suid_sgid_blocklist:
  - 7z
  - aa-exec
  - ab
  - agetty
  - alpine
  - ansible-playbook
  - ansible-test
  - aoss
  - apt
  - apt-get
  [...]

Wenn suid_sgid_permissions: true ist, wird durch die suid_sgid_blocklist iteriert und alle SUID/SGID-Berechtigungen entfernt.

Eine vollständige Dateiliste ist in defaults/main/suid_sgid_blocklist.yml verfügbar und basiert auf der Arbeit von @GTFOBins.

./defaults/main/sysctl.yml

manage_sysctl: true
sysctl_conf_dir: "{{ '/usr/lib/sysctl.d' if usr_lib_sysctl_d_dir else '/etc/sysctl.d' }}"

sysctl_dev_tty_ldisc_autoload: 0

ipv4_sysctl_settings:
  net.ipv4.conf.all.accept_redirects: 0
  net.ipv4.conf.all.accept_source_route: 0
  net.ipv4.conf.all.log_martians: 1
  net.ipv4.conf.all.rp_filter: 1
  net.ipv4.conf.all.secure_redirects: 0
  net.ipv4.conf.all.send_redirects: 0
  net.ipv4.conf.all.shared_media: 0
  net.ipv4.conf.default.accept_redirects: 0
  net.ipv4.conf.default.accept_source_route: 0
  net.ipv4.conf.default.log_martians: 1
  net.ipv4.conf.default.rp_filter: 1
  net.ipv4.conf.default.secure_redirects: 0
  net.ipv4.conf.default.send_redirects: 0
  net.ipv4.conf.default.shared_media: 0
  net.ipv4.icmp_echo_ignore_broadcasts: 1
  net.ipv4.icmp_ignore_bogus_error_responses: 1
  net.ipv4.ip_forward: 0
  net.ipv4.tcp_challenge_ack_limit: 2147483647
  net.ipv4.tcp_invalid_ratelimit: 500
  net.ipv4.tcp_max_syn_backlog: 20480
  net.ipv4.tcp_rfc1337: 1
  net.ipv4.tcp_syn_retries: 5
  net.ipv4.tcp_synack_retries: 2
  net.ipv4.tcp_syncookies: 1

generic_sysctl_settings:
  fs.protected_fifos: 2
  fs.protected_hardlinks: 1
  fs.protected_symlinks: 1
  fs.suid_dumpable: 0
  kernel.core_pattern: "|/bin/false"
  kernel.core_uses_pid: 1
  kernel.dmesg_restrict: 1
  kernel.kptr_restrict: 2
  kernel.panic: 60
  kernel.panic_on_oops: 60
  kernel.perf_event_paranoid: 3
  kernel.randomize_va_space: 2
  kernel.sysrq: 0
  kernel.unprivileged_bpf_disabled: 1
  kernel.yama.ptrace_scope: 2
  net.core.bpf_jit_harden: 2
  user.max_user_namespaces: 62967

conntrack_sysctl_settings:
  net.netfilter.nf_conntrack_max: 2000000
  net.netfilter.nf_conntrack_tcp_loose: 0

Wenn manage_sysctl: true ist, werden die sysctl-Konfigurationen aktualisiert.

sysctl_conf_dir ist der Ort, an dem die sysctl-Konfiguration abgelegt wird.

Siehe sysctl.conf und die Kernel-Dokumentation.

./defaults/main/templates.yml

adduser_conf_template: etc/adduser.conf.j2
common_account_template: etc/pam.d/common-account.j2
common_auth_template: etc/pam.d/common-auth.j2
common_password_template: etc/pam.d/common-password.j2
coredump_conf_template: etc/systemd/coredump.conf.j2
faillock_conf_template: etc/security/faillock.conf.j2
hardening_rules_template: etc/audit/rules.d/hardening.rules.j2
hosts_allow_template: etc/hosts.allow.j2
hosts_deny_template: etc/hosts.deny.j2
initpath_sh_template: etc/profile.d/initpath.sh.j2
issue_template: etc/issue.j2
journald_conf_template: etc/systemd/journald.conf.j2
limits_conf_template: etc/security/limits.conf.j2
login_defs_template: etc/login.defs.j2
login_template: etc/pam.d/login.j2
logind_conf_template: etc/systemd/logind.conf.j2
logrotate_conf_template: etc/logrotate.conf.j2
motd_template: etc/motd.j2
pwquality_conf_template: etc/security/pwquality.conf.j2
resolved_conf_template: etc/systemd/resolved.conf.j2
rkhunter_template: etc/default/rkhunter.j2
ssh_config_template: etc/ssh/ssh_config.j2
sshd_config_template: etc/ssh/sshd_config.j2
sysctl_ipv6_config_template: etc/sysctl/sysctl.ipv6.conf.j2
sysctl_main_config_template: etc/sysctl/sysctl.main.conf.j2
system_conf_template: etc/systemd/system.conf.j2
timesyncd_conf_template: etc/systemd/timesyncd.conf.j2
tmp_mount_template: etc/systemd/tmp.mount.j2
user_conf_template: etc/systemd/user.conf.j2
useradd_template: etc/default/useradd.j2

Pfad, um die standardmäßigen Rollen-Vorlagen zu unterstützen.

./defaults/main/ufw.yml

manage_ufw: true

ufw_outgoing_traffic:
  - 22
  - 53
  - 80
  - 123
  - 443
  - 853

ufw_rate_limit: false

Siehe die Anmerkung zu den erforderlichen Kommentaren.

manage_ufw: true installiert und konfiguriert ufw mit den entsprechenden Regeln. Setzen Sie es auf false, um eine Firewall manuell zu installieren und zu konfigurieren.

ufw_outgoing_traffic öffnet die spezifischen ufw-Ports und erlaubt ausgehenden Verkehr.

ufw_rate_limit, wenn true, wird die Verbindungsratenbegrenzung für alle verfügbaren physikalischen Netzwerk-Schnittstellen festgelegt.

./defaults/main/umask.yml

session_timeout: 900
umask_value: "077"

session_timeout legt, in Sekunden, die TMOUT Umgebungsvariable fest.

umask_value setzt den Standard Umask-Wert.

./defaults/main/usbguard.yml

manage_usbguard: true

usbguard_configuration_file: /etc/usbguard/usbguard-daemon.conf
usbguard_rulefile: /etc/usbguard/rules.conf

usbguard_auditbackend: LinuxAudit
usbguard_auditfilepath: /var/log/usbguard/usbguard-audit.log
usbguard_authorizeddefault: none
usbguard_devicemanagerbackend: uevent
usbguard_deviceruleswithport: false
usbguard_hidepii: false
usbguard_implicitpolicytarget: block
usbguard_inserteddevicepolicy: apply-policy
usbguard_ipcaccesscontrolfiles: /etc/usbguard/IPCAccessControl.d/
usbguard_ipcallowedgroups:
  - plugdev
  - root
  - wheel
usbguard_ipcallowedusers:
  - root
usbguard_presentcontrollerpolicy: keep
usbguard_presentdevicepolicy: apply-policy
usbguard_restorecontrollerdevicestate: false

manage_usbguard: true installiert und konfiguriert USBGuard.

Eine Richtlinie wird erstellt, wenn Regeln aufgelistet werden können und noch keine Richtlinie existiert.

Siehe die Konfigurationsdokumentation zu den verfügbaren Optionen.

./defaults/main/users.yml

delete_users:
  - games
  - gnats
  - irc
  - list
  - news
  - sync
  - uucp

Zu löschende Benutzer.

Empfohlene Lektüre

Vergleich der DISA STIG und CIS Benchmark-Werte

Center for Internet Security Linux Benchmarks

Common Configuration Enumeration

DISA Security Technical Implementation Guides

SCAP Security Guides

Security-focused systemd-Konfiguration

Beiträge

Möchten Sie beitragen? Großartig! Beiträge sind jederzeit willkommen, egal wie groß oder klein. Wenn Sie etwas Ungewöhnliches gefunden haben, zögern Sie nicht, ein Issue einzureichen, den Code mit einem Pull Request zu verbessern oder dieses Projekt zu sponsern.

Lizenz

Apache-Lizenz Version 2.0

Autoreninformationen

https://github.com/konstruktoid

Über das Projekt

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Installieren
ansible-galaxy install konstruktoid.hardening
Lizenz
apache-2.0
Downloads
33.6k
Besitzer