thechip911.hardening

Absichern - die Ansible-Rolle

Eine Ansible Rolle, um einen AlmaLinux, Debian oder Ubuntu Server etwas sicherer zu machen. systemd-Version.

Benötigt Ansible >= 2.12.

Verfügbar auf Ansible Galaxy.

AlmaLinux 8, Debian 11, Ubuntu 20.04 LTS (Focal Fossa) und 22.04 LTS (Jammy Jellyfish) werden unterstützt.

Hinweis

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

Hinweis

Es gibt ein SLSA Artefakt im slsa-Action-Workflow zur Überprüfung.

Abhängigkeiten

Keine.

Beispiele

Playbook

---
- hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Die Hardening-Rolle einbinden
      ansible.builtin.include_role:
        name: thechip911.hardening
      vars:
        block_blacklisted: true
        sshd_admin_net:
          - 10.0.0.0/16
        suid_sgid_permissions: false
...

ansible-pull mit git checkout

---
- hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Git installieren
      become: true
      ansible.builtin.package:
        name: git
        state: present

    - name: Thechip911.hardening auschecken
      become: true
      ansible.builtin.git:
        repo: 'https://github.com/thechip911/ansible-role-hardening'
        dest: /etc/ansible/roles/thechip911.hardening
        version: master

    - name: Die Hardening-Rolle einbinden
      ansible.builtin.include_role:
        name: thechip911.hardening
      vars:
        block_blacklisted: true
        sshd_admin_net:
          - 10.0.2.0/16
        suid_sgid_permissions: false
...

Hinweis zu UFW-Firewallregeln

Anstatt ufw bei jedem Durchlauf zurückzusetzen und damit den Netzwerkverkehr zu stören, löscht die Rolle jede ufw-Regel ohne das comment: ansible managed-Parameter und dessen Wert.

Die Rolle legt auch Standardverweigerungsrichtlinien fest, was bedeutet, dass Firewallregeln für zusätzliche Ports erstellt werden müssen, außer für die in den Variablen sshd_port und ufw_outgoing_traffic angegebenen.

Ausführung und Struktur der Aufgaben

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

Rollentest

Siehe TESTING.md.

Rollenv Variablen mit Standardwerten

./defaults/main/auditd.yml

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_max_log_file: 8
auditd_max_log_file_action: keep_logs
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

Aktivieren Sie auditd beim Booten über Grub.

Wenn auditd_apply_audit_rules: 'yes' gesetzt ist, wendet die Rolle die auditd-Regeln aus der enthaltenen Vorlagendatei an.

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

auditd_admin_space_left_action definiert, welche Aktion unternommen wird, wenn das System erkannt hat, dass der Speicherplatz niedrig ist. suspend führt dazu, dass der Audit-Daemon aufhört, Protokolle auf die Festplatte zu schreiben.

auditd_max_log_file_action legt fest, welche Aktion unternommen wird, wenn das System erkannt hat, dass die maximale Dateigröße erreicht ist. Zum Beispiel wird die rotate-Option den Audit-Daemon dazu bringen, die Protokolle zu rotieren. Die keep_logs-Option ist ähnlich wie rotate, es verwendet jedoch nicht die num_logs-Einstellung. Dadurch wird verhindert, dass Audit-Protokolle überschrieben werden.

auditd_space_left_action teilt dem System mit, welche Aktion unternommen werden soll, wenn erkannt wird, dass der Speicherplatz niedrig ist. email bedeutet, dass eine Warnung an das in action_mail_acct angegebene E-Mail-Konto gesendet wird sowie eine Nachricht an syslog gesendet wird.

auditd_mode legt den Fehlermodus von auditd fest, 0=silent 1=printk 2=panic.

auditd.conf(5)

./defaults/main/compilers.yml

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

Liste der Compiler, die auf den Root-Benutzer beschränkt werden.

./defaults/main/disablewireless.yml

disable_wireless: false

Wenn true, werden alle drahtlosen Schnittstellen deaktiviert.

./defaults/main/dns.yml

dns: 127.0.0.1 1.1.1.1
fallback_dns: 9.9.9.9 1.0.0.1
dnssec: allow-downgrade
dns_over_tls: opportunistic

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

Wenn dns_over_tls wahr ist, werden alle Verbindungen zum Server verschlüsselt, wenn der DNS-Server DNS-over-TLS unterstützt und ein gültiges Zertifikat hat.

systemd Option.

./defaults/main/ipv6.yml

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

Wenn disable_ipv6: true gesetzt ist, wird IPv6 deaktiviert.

./defaults/main/limits.yml

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

Maximale Anzahl von Prozessen und offenen Dateien.

./defaults/main/misc.yml

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

Wenn install_aide: true gesetzt ist, wird AIDE installiert und konfiguriert.

Wenn reboot_ubuntu: true gesetzt ist, wird ein Ubuntu-Knoten bei Bedarf neu gestartet.

redhat_signing_keys sind RedHat Produkt-Signaturschlüssel.

Die epel7_signing_keys, epel8_signing_keys und epel9_signing_keys sind versionsspezifische Fedora EPEL-Signaturschlüssel.

./defaults/main/module_blocklists.yml

block_blacklisted: false
fs_modules_blocklist:
  - cramfs
  - freevxfs
  - hfs
  - hfsplus
  - jffs2
  - squashfs
  - udf
misc_modules_blocklist:
  - bluetooth
  - bnep
  - btusb
  - can
  - cpia2
  - firewire-core
  - floppy
  - n_hdlc
  - net-pf-31
  - pcspkr
  - soundcore
  - thunderbolt
  - usb-midi
  - usb-storage
  - uvcvideo
  - v4l2_common
net_modules_blocklist:
  - atm
  - dccp
  - sctp
  - rds
  - tipc

Blockierte Kernel-Module.

Durch Setzen von block_blacklisted: true werden alle automatisch geladenen blacklisted Kernel-Module blockiert oder deaktiviert. Der Grund dafür ist, dass ein blockiertes Modul dennoch manuell mit modprobe module_name geladen werden kann. Die Verwendung von install module_name /bin/true verhindert dies.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid legt den Zugangsmodus für /proc/<pid>/ fest.

Die Einstellung process_group konfiguriert die Gruppe, die berechtigt ist, Informationen über Prozesse zu erfahren, die sonst durch hidepid= verboten sind.

/proc Mount-Optionen

./defaults/main/ntp.yml

fallback_ntp: 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org
ntp: 0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org

NTP-Server-Hostnamen oder IP-Adressen. systemd Option.

./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*
  - 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
  - rkhunter
  - rsyslog
  - sysstat
  - tcpd
  - vlock
  - wamerican
packages_redhat:
  - audispd-plugins
  - audit
  - cracklib
  - gnupg2
  - haveged
  - libpwquality
  - openssh-server
  - needrestart
  - postfix
  - psacct
  - rkhunter
  - rsyslog
  - rsyslog-gnutls
  - vlock
  - words
packages_ubuntu:
  - fwupd
  - secureboot-db

system_upgrade: 'yes' führt apt upgrade oder dnf update durch, wenn nötig.

Pakete, die abhängig von der Distribution installiert werden sollen, und Pakete, die entfernt werden sollen (packages_blocklist).

./defaults/main/password.yml

crypto_policy: FIPS
pwquality_config:
  dcredit: -1
  dictcheck: 1
  difok: 8
  enforcing: 1
  lcredit: -1
  maxclassrepeat: 4
  maxrepeat: 3
  minclass: 4
  minlen: 15
  ocredit: -1
  ucredit: -1

Setzt kryptografische Richtlinien wenn /etc/crypto-policies/config existiert.

Konfiguriert die libpwquality Bibliothek.

./defaults/main/sshd.yml

sshd_accept_env: LANG LC_*
sshd_admin_net:
  - 192.168.0.0/24
  - 192.168.1.0/24
sshd_allow_agent_forwarding: 'no'
sshd_allow_groups: sudo
sshd_allow_tcp_forwarding: 'no'
sshd_authentication_methods: any
sshd_banner: /etc/issue.net
sshd_challenge_response_authentication: 'no'
sshd_ciphers: [email protected],[email protected],aes256-ctr
sshd_client_alive_count_max: 1
sshd_client_alive_interval: 200
sshd_compression: 'no'
sshd_gssapi_authentication: 'no'
sshd_hostbased_authentication: 'no'
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_ignore_user_known_hosts: 'yes'
sshd_kerberos_authentication: 'no'
sshd_kex_algorithms: [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
sshd_login_grace_time: 20
sshd_log_level: VERBOSE
sshd_macs: [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
sshd_max_auth_tries: 3
sshd_max_sessions: 3
sshd_max_startups: 10:30:60
sshd_password_authentication: 'no'
sshd_permit_empty_passwords: 'no'
sshd_permit_root_login: 'no'
sshd_permit_user_environment: 'no'
sshd_port: 22
sshd_print_last_log: 'yes'
sshd_print_motd: 'no'
sshd_rekey_limit: 512M 1h
sshd_required_rsa_size: 2048
sshd_strict_modes: 'yes'
sshd_subsystem: sftp internal-sftp
sshd_tcp_keep_alive: 'no'
sshd_use_dns: 'no'
sshd_use_pam: 'yes'
sshd_x11_forwarding: 'no'

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

Nur die Netzwerke, die in sshd_admin_net definiert sind, dürfen sich mit sshd_port verbinden. Beachten Sie, dass zusätzliche Regeln eingerichtet werden müssen, um den Zugriff auf zusätzliche Dienste zu ermöglichen.

Die SSH-Login ist nur für Benutzer erlaubt, deren Hauptgruppe oder Liste der zusätzlichen Gruppen mit einem der Muster in sshd_allow_groups übereinstimmt.

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

sshd_allow_tcp_forwarding gibt an, ob TCP-Weiterleitung erlaubt ist. Die verfügbaren Optionen sind yes oder all, um TCP-Forwarding zuzulassen, no, um alles zu verhindern, local, um nur lokale (aus der Sicht von ssh(1)) Weiterleitung zuzulassen, oder remote, um nur remote Weiterleitung zuzulassen.

sshd_authentication_methods gibt die Authentifizierungsmethoden an, die erfolgreich abgeschlossen sein müssen, um einem Benutzer den Zugang zu gewähren.

sshd_log_level gibt die Detailtiefe an, die beim Protokollieren verwendet wird.

sshd_max_auth_tries und sshd_max_sessions geben die maximale Anzahl von SSH-Authentifizierungsversuchen pro Verbindung und die maximale Anzahl an offenen Shell-, Anmelde- oder Subsystem (z.B. sftp) Sitzungen pro Netzwerkverbindung an.

sshd_password_authentication gibt an, ob die Passwortauthentifizierung erlaubt ist.

sshd_port gibt die Portnummer an, auf der sshd(8) lauscht.

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

./defaults/main/suid_sgid_blocklist.yml

suid_sgid_permissions: true
suid_sgid_blocklist:
  - ansible-playbook
  - ar
  - as
  - at
  - awk
  - base32
  - base64
  - bash
  - busctl
  - busybox
  [...]

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

Eine vollständige Dateiliste ist verfügbar in defaults/main/suid_sgid_blocklist.yml.

./defaults/main/sysctl.yml

sysctl_dev_tty_ldisc_autoload: 0
sysctl_net_ipv6_conf_accept_ra_rtr_pref: 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

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

generic_sysctl_settings:
  fs.protected_fifos: 2
  fs.protected_hardlinks: 1
  fs.protected_symlinks: 1
  fs.suid_dumpable: 0
  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

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

sysctl Konfiguration.

sysctl.conf

./defaults/main/ufw.yml

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

ufw_enable: true installiert und konfiguriert ufw mit den entsprechenden Regeln. Setzen Sie es auf false, um die Firewall manuell zu installieren und zu konfigurieren. ufw_outgoing_traffic öffnet die spezifischen ufw-Ports, und erlaubt ausgehenden Verkehr.

./defaults/main/users.yml

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

Benutzer, die entfernt werden sollen.

Empfohlene Literatur

Vergleich der DISA STIG- und CIS Benchmark-Werte

Center for Internet Security Linux Benchmarks

Common Configuration Enumeration

DISA Sicherheitsleitfäden

SCAP Sicherheitsleitfäden

Sicherheitsfokussierte systemd-Konfiguration

Mitwirken

Möchten Sie mitwirken? Toll! Beiträge sind immer willkommen, egal wie groß oder klein. Wenn Ihnen etwas Seltsames aufgefallen ist, zögern Sie nicht, ein Problem zu melden, den Code zu verbessern, indem Sie einen Pull-Request erstellen, oder dieses Projekt zu unterstützen.

Lizenz

Apache Lizenz Version 2.0

Autoreninformation

https://github.com/thechip911

Über das Projekt

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Installieren
ansible-galaxy install thechip911.hardening
GitHub Repository
Lizenz
apache-2.0
Downloads
109
Besitzer