konstruktoid.hardening

Rola Ansible do Wzmocnienia Bezpieczeństwa Serwera

To jest rola Ansible zaprojektowana w celu zwiększenia bezpieczeństwa serwerów działających na AlmaLinux, Debianie lub Ubuntu.

Skupia się na systemd i wymaga wersji Ansible 2.15 lub wyższej.

Rola obsługuje następujące systemy operacyjne:

Dla tych, którzy korzystają z AWS lub Azure, dostępne są również wzmocnione obrazy maszyn Ubuntu (AMIs) oraz obrazy maszyn wirtualnych Azure.

Są one dostępne w repozytorium konstruktoid/hardened-images. Te obrazy są tworzone przy użyciu Packer i ta rola Ansible jest używana do konfiguracji.

Uwaga Nie używaj tej roli bez wcześniejszego przetestowania w środowisku nieoperacyjnym.

Uwaga Występuje artefakt SLSA w ramach workflow akcji slsa do weryfikacji.

Zależności

Brak.

Przykłady

Wymagania

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

Playbook

---
- name: Importuj i użyj roli wzmocnienia
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Importuj rolę wzmocnienia
      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

Lokalny playbook z użyciem git checkout

---
- name: Checkout i skonfiguruj konstruktoid.hardening
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Sklonuj repozytorium wzmocnienia
      become: true
      tags:
        - always
      block:
        - name: Zainstaluj git
          ansible.builtin.package:
            name: git
            state: present

        - name: Checkout 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: Usuń git
          ansible.builtin.package:
            name: git
            state: absent

    - name: Włącz rolę wzmocnienia
      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

Uwaga dotycząca reguł UFW

Zamiast resetować ufw przy każdym uruchomieniu, co powodowałoby zakłócenia w ruchu sieciowym, rola usuwa każdą regułę ufw bez parametru i wartości comment: ansible managed.

Rola także ustawia domyślne zasady odmowy, co oznacza, że reguły zapory muszą być utworzone dla dodatkowych portów poza tymi określonymi w zmiennych sshd_ports oraz ufw_outgoing_traffic.

Zobacz ufw(8) po więcej informacji.

Wykonanie zadań i struktura

Zobacz STRUCTURE.md dla struktury roli.

Testowanie roli

Zobacz TESTING.md.

Zmienne roli z domyślnymi wartościami

./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

Jeśli manage_aide: true, wtedy AIDE będzie zainstalowane i skonfigurowane.

aide_checksums modyfikuje zmienną Checksums AIDE. Należy zauważyć, że zmienna Checksums może nie być obecna w zależności od dystrybucji.

aide_dir_exclusions to lista katalogów, które będą wykluczone z bazy danych AIDE.

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

Jeśli manage_auditd: true, wtedy Linux Audit System zostanie skonfigurowany i włączony przy starcie za pomocą GRUB.

Gdy auditd_apply_audit_rules: 'yes', rola stosuje zasady auditd z dołączonego pliku szablonu.

auditd_action_mail_acct powinno być ważnym adresem e-mail lub aliasem.

auditd_admin_space_left_action definiuje, co zrobić, gdy system wykryje, że ma mało miejsca na dysku. suspend spowoduje, że demon audytu przestanie zapisywać rekordy na dysku.

auditd_enable_flag ustawia flagę aktywacji. Jeśli przekazany jest 0, tymczasowo wyłącza audytowanie. 1 włącza audytowanie, a 2 blokuje konfigurację audytu.

auditd_flush: sync poleca demonowi audytu utrzymanie zarówno danych, jak i metadanych w pełnej synchronizacji przy każdorazowym zapisie na dysk.

auditd_max_log_file_action ustawia, co się stanie, gdy system wykryje, że osiągnięto maksymalny rozmiar pliku. Na przykład opcja rotate spowoduje obrót dzienników audytu. Opcja keep_logs jest podobna do rotate, ale nie korzysta z ustawienia num_logs. To zapobiega nadpisywaniu dzienników audytowych.

auditd_space_left_action mówi systemowi, co zrobić, gdy wykryje, że ma mało miejsca na dysku. email oznacza, że wysokie ostrzeżenie zostanie wysłane na adres e-mail podany w action_mail_acct, a także wiadomość zostanie wysłana do syslogu.

auditd_mode ustawia tryb awarii auditd, 0=silent 1=printk 2=panic.

auditd.conf(5)

./defaults/main/automatic_updates.yml

automatic_updates:
  enabled: true
  reboot: false

Jeśli automatic_updates jest włączone, zainstaluje i skonfiguruje dnf-automatic lub unattended-upgrades, w zależności od dystrybucji.

Jeśli opcja reboot jest ustawiona na true, system zostanie uruchomiony ponownie, jeśli zajdzie taka potrzeba, zobacz Unattended-Upgrade::Automatic-Reboot i 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

Jeśli manage_compilers: true, wówczas wymienione kompilatory będą ograniczone do użytkownika root.

./defaults/main/crypto_policies.yml

set_crypto_policy: true
crypto_policy: DEFAULT:NO-SHA1

Ustaw i używaj polityk kryptograficznych jeśli /etc/crypto-policies/config istnieje i set_crypto_policy: true.

./defaults/main/disablewireless.yml

disable_wireless: false

Jeśli true, wyłączy wszystkie interfejsy bezprzewodowe.

./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

Jeśli manage_resolved: true, skonfiguruj systemd-resolved.

Adresy IPv4 i IPv6, które mają być używane jako systemowe i zapasowe serwery DNS. Jeśli dnssec jest ustawione na "allow-downgrade", próba weryfikacji DNSSEC zostanie podjęta, ale jeśli serwer nie obsługuje poprawnie DNSSEC, tryb DNSSEC zostanie automatycznie wyłączony.

Jeśli dns_over_tls jest włączone, wszystkie połączenia do serwera będą szyfrowane, jeśli serwer DNS obsługuje DNS przez TLS i posiada ważny certyfikat.

./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

Jeśli disable_ipv6: true, IPv6 zostanie wyłączone, a odpowiednie ustawienia sysctl zostaną skonfigurowane.

ipv6_sysctl_settings to konfiguracja sysctl, która będzie używana, jeśli host korzysta z IPv6.

sysctl.conf

./defaults/main/journal.yml

rsyslog_filecreatemode: "0640"

journald_compress: true
journald_forwardtosyslog: false
journald_storage: persistent

rsyslog_filecreatemode ustawia tryb tworzenia, z którym rsyslogd tworzy nowe pliki, zobacz rsconf1_filecreatemode.

journald_compress może przyjmować wartość boolean. Jeśli włączone (domyślnie), obiekty danych są kompresowane przed zapisaniem ich na dysku.

journald_storage kontroluje, gdzie przechowywane są dane dziennika. Może to być jedno z: volatile, persistent, auto i none.

journald_forwardtosyslog kontroluje, czy wiadomości dzienkowe otrzymywane przez demon dzienników mają być przesyłane do tradycyjnego demona syslog.

Zobacz journald.conf po więcej informacji.

./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 pozwala na wirtualne wywołania systemowe, gdy true, w przeciwnym razie nie będzie ustawiana żadna mapa vsyscall, zobacz CONFIG_LEGACY_VSYSCALL_NONE.

enable_page_poisoning: true włącza CONFIG_PAGE_POISONING

kernel_lockdown konfiguruje funkcję kernel lockdown. Dopuszczalne wartości to false, true, integrity i confidentiality. Jeśli true, jądro będzie zablokowane w trybie integrity.

page_table_isolation jest środkiem zaradczym przeciwko atakom na wspólną przestrzeń adresową użytkownika/jądra, zobacz CONFIG_PAGE_TABLE_ISOLATION

slub_debugger_poisoning, jeśli ustawione na true, zapobiega wielu typom przepełnienia pamięci i również zapobiega wyciekom danych oraz wykrywaniu uszkodzonej pamięci. Zobacz Krótki przewodnik po SLUB.

./defaults/main/limits.yml

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

Ustala maksymalną liczbę procesów i otwartych plików, zobacz 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

Jeśli reboot_ubuntu: true, węzeł Ubuntu zostanie uruchomiony ponownie, jeśli zajdzie taka potrzeba.

redhat_signing_keys to Klucze podpisywania produktu RedHat.

Klucze epel7_signing_keys, epel8_signing_keys i epel9_signing_keys to klucze podpisywania specyficzne dla wydań Fedora EPEL.

./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

Moduły jądra do bycia zablokowanymi i wyłączonymi przy użyciu fałszywej instalacji.

Uwaga

Wyłączenie modułu usb-storage spowoduje wyłączenie wszystkich urządzeń pamięci USB. Jeśli takie urządzenia są potrzebne, USBGuard lub podobne narzędzie, powinno być skonfigurowane zgodnie z tym.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid ustawia tryb dostępu do /proc/<pid>/.

Ustawienie process_group konfiguruje grupę upoważnioną do poznania informacji o procesach innymi słowy zabronione przez hidepid=.

/proc opcje montowania

./defaults/main/ntp.yml

manage_timesyncd: true

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

Jeśli manage_timesyncd: true, skonfiguruj systemd timesyncd, inaczej zaleca się zainstalowanie klienta NTP.

./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";

Skonfiguruj zestaw narzędzi APT.

./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 uruchomi apt upgrade lub dnf update, jeśli zajdzie taka potrzeba.

Pakiety do zainstalowania, w zależności od dystrybucji i pakiety do usunięcia (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 włączy bibliotekę faillock.

password_remember ustawia rozmiar historii haseł, które użytkownik nie będzie mógł ponownie użyć.

Zmienne faillock, login_defs i pwquality są używane do konfigurowania pam_faillock, login.defs i 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

Jeśli manage_rkhunter: true, wtedy skonfiguruj rkhunter.

./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

Jeśli manage_ssh: true, klient SSH i demon SSH będą skonfigurowane.

Uwaga

CASignatureAlgorithms, Ciphers, HostKeyAlgorithms, KexAlgorithms i MACs będą konfigurowane zgodnie z ustaleniami polityki kryptograficznej, jeśli /etc/crypto-policies/config istnieje i set_crypto_policy: true.

Aby uzyskać wyjaśnienia opcji, które nie zostały opisane poniżej, przeczytaj https://man.openbsd.org/sshd_config.

Tylko sieci zdefiniowane w sshd_admin_net mają dostęp do sshd_ports. Należy pamiętać, że dodatkowe reguły muszą zostać ustawione w celu pozwolenia na dostęp do dodatkowych usług.

Logowanie OpenSSH jest dozwolone tylko dla użytkowników, których główna grupa lub lista grup uzupełniających pasuje do jednego z wzorów w sshd_allow_groups. Logowanie OpenSSH jest również dozwolone dla użytkowników w sshd_allow_users. Aby zrobić odwrotnie i zablokować dostęp, użyj parametrów sshd_deny_groups i sshd_deny_users, które mają pierwszeństwo nad dokonanymi wcześniej parametrami.

sshd_allow_agent_forwarding określa, czy przekazywanie ssh-agent(1) jest dozwolone.

sshd_allow_tcp_forwarding określa, czy dozwolone jest przekazywanie TCP. Dostępne opcje to true lub all, aby zezwolić na przekazywanie TCP, false, aby zapobiec wszystkiemu przekazywaniu TCP, local, aby zezwolić tylko na lokalne (z perspektywy ssh(1)) przekazywanie, lub remote, aby zezwolić tylko na przekazywanie zdalne.

sshd_authentication_methods określa, jakie metody uwierzytelnienia muszą być pomyślnie zakończone, aby przyznać dostęp użytkownikowi.

sshd_log_level określa poziom szczegółowości, używany podczas rejestracji komunikatów.

sshd_max_auth_tries oraz sshd_max_sessions określają maksymalną liczbę prób uwierzytelnienia SSH, jakie są dozwolone na połączenie oraz maksymalną liczbę otwartych powiązań w sesji powłoki, logowania lub podsystemu (np. sftp), dozwolonych na jeden związek sieciowy.

sshd_password_authentication określa, czy dozwolone jest uwierzytelnienie za pomocą hasła.

sshd_ports określa numer portu(y), na które nasłuchuje sshd(8).

sshd_required_rsa_size, RequiredRSASize, zostaną ustawione tylko wtedy, gdy wersja SSH będzie wyższa niż 9.1.

sshd_config_d_force_clear wymusza wyczyszczenie katalogu /etc/ssh/sshd_config.d. Domyślnie: false.

sshd_config_force_replace wymusza zastąpienie pliku konfiguracyjnego /etc/ssh/sshd_config. Domyślnie: false.

Uwaga

Domyślnie rola sprawdza, czy katalog /etc/ssh/sshd_config.d istnieje i czy jest połączony za pomocą parametru Include w pliku /etc/ssh/sshd_config. Jeśli tak, dodatkowy plik konfiguracyjny jest tworzony w /etc/ssh/sshd_config.d, w przeciwnym razie plik /etc/ssh/sshd_config zostaje nadpisany.

Ostrzeżenie

Jeśli jakiekolwiek parametry sshd_match_(users|groups|addresses|local_ports) lub sshd_sftp_only_group zostaną ustawione, wartość true będzie implicit.

sshd_host_keys_files klucze hosta dla sshd. Jeśli puste, użyje ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'], o ile są obsługiwane przez zainstalowaną wersję sshd.

sshd_host_keys_owner ustawia właściciela kluczy hosta dla sshd.

sshd_host_keys_group ustawia grupę kluczy hosta dla sshd.

sshd_host_keys_mode ustawia uprawnienia kluczy hosta dla sshd.

sshd_match_users dodaje blok warunkowy dla użytkowników. Jeśli wszystkie kryteria na linii Match są spełnione, zasady/parametry zdefiniowane w następujących liniach zastępują te ustawione w ogólnym segmentie pliku konfiguracyjnego, aż do innej linii Match lub końca pliku.

Oczekiwana struktura konfiguracji:

sshd_match_users:
  - user: <nazwa_użytkownika>
    rules:
      - <parametr sshd> <wartość>
      - <parametr sshd> <wartość>

Przykład: pozwolenie użytkownikowi ubuntu na dostęp przez uwierzytelnienie hasłem oraz pozwolenie użytkownikowi ansible na dostęp bez banneru:

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

sshd_match_groups dodaje blok warunkowy dla grup. Więcej szczegółów i przykładów w opisie parametru sshd_match_users.

Oczekiwana struktura konfiguracji:

sshd_match_groups:
  - group: <nazwa_grupy>
    rules:
      - <parametr sshd> <wartość>
      - <parametr sshd> <wartość>

sshd_match_addresses dodaje blok warunkowy dla adresów. Więcej szczegółów i przykładów w opisie parametru sshd_match_users.

Oczekiwana struktura konfiguracji:

sshd_match_addresses:
  - address: <ip>
    rules:
      - <parametr sshd> <wartość>
      - <parametr sshd> <wartość>

sshd_match_local_ports dodaje blok warunkowy dla portów. Więcej szczegółów i przykładów w opisie parametru sshd_match_users.

Oczekiwana struktura konfiguracji:

sshd_match_ports:
  - port: <port>
    rules:
      - <parametr sshd> <wartość>
      - <parametr sshd> <wartość>

sshd_print_pam_motd określa, czy drukować MOTD za pomocą pam.

sshd_sftp_enabled określa, czy konfiguracja sftp jest włączona.

sshd_sftp_subsystem ustawia podsystem dla demona transferu plików.

sshd_sftp_only_group określa nazwę grupy, która będzie miała dostęp ograniczony tylko do usługi sftp.

sshd_sftp_only_chroot określa, że dostęp grupy będzie poprzez izolację chroot.

sshd_sftp_only_chroot_dir określa katalog chroot. Przyjmuje tokeny %% (dosłowne %), %h (katalog domowy użytkownika) oraz %u (nazwa użytkownika).

sshd_syslog_facility ustawia kod jednostki, który jest używany do logowania komunikatów od sshd.

sshd_update_moduli, jeśli ustawione na true, pobierze zaktualizowany pliku moduli z repozytorium konstruktoid/ssh-moduli.

./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
  [...]

Jeśli suid_sgid_permissions: true, przeszukuje suid_sgid_blocklist i usuwa wszystkie uprawnienia SUID/SGID.

Cała lista plików jest dostępna w defaults/main/suid_sgid_blocklist.yml i opiera się na pracy @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.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

Jeśli manage_sysctl: true, zaktualizuj konfigurację sysctl.

sysctl_conf_dir to miejsce, gdzie zostanie umieszczona konfiguracja sysctl.

Zobacz sysctl.conf i dokumentację jądra.

./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

Ścieżki w celu wsparcia nadpisania domyślnych szablonów roli.

./defaults/main/ufw.yml

manage_ufw: true

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

ufw_rate_limit: false

Zobacz notatkę dotyczącą koniecznych komentarzy.

manage_ufw: true instaluje i konfiguruje ufw z odpowiednimi regułami. Ustaw na false, aby ręcznie zainstalować i skonfigurować zaporę.

ufw_outgoing_traffic otwiera określone porty ufw, pozwalając na ruch wychodzący.

ufw_rate_limit, jeśli true, ustawi limit szybkości połączeń na wszystkich dostępnych fizycznych interfejsach sieciowych.

./defaults/main/umask.yml

session_timeout: 900
umask_value: "077"

session_timeout ustawia, w sekundach, zmienną TMOUT środowiskową.

umask_value ustawia domyślną wartość umask.

./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 instaluje i konfiguruje USBGuard.

Polityka zostanie wygenerowana, jeśli jakiekolwiek zasady mogą być wymienione, a polityka jeszcze nie istnieje.

Zobacz dokumentację konfiguracyjną odnośnie dostępnych opcji.

./defaults/main/users.yml

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

Użytkownicy do usunięcia.

Zalecana lektura

Porównanie wartości DISA STIG i CIS Benchmark

Center for Internet Security Linux Benchmarks

Common Configuration Enumeration

DISA Security Technical Implementation Guides

SCAP Security Guides

Skoncentrowana na bezpieczeństwie konfiguracja systemd

Współpraca

Chcesz się przyczynić? Świetnie! Wszelkie wkłady są zawsze mile widziane, niezależnie od tego, jak duże czy małe. Jeśli znajdziesz coś niepokojącego, śmiało zgłoś problem, popraw kod tworząc pull request lub wsparcie tego projektu.

Licencja

Licencja Apache, wersja 2.0

Informacje o autorze

https://github.com/konstruktoid

Zainstaluj
ansible-galaxy install konstruktoid.hardening
Licencja
apache-2.0
Pobrania
33.6k
Właściciel