thechip911.hardening

Utrwalanie - rola Ansible

Rola Ansible, która ma na celu zwiększenie bezpieczeństwa serwerów AlmaLinux, Debian lub Ubuntu. Wersja systemd jest obsługiwana.

Wymaga Ansible >= 2.12.

Dostępna na Ansible Galaxy.

Obsługiwane są: AlmaLinux 8, Debian 11, Ubuntu 20.04 LTS (Focal Fossa) oraz 22.04 LTS (Jammy Jellyfish).

Uwaga

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

Uwaga

W ramach SLSA dostępny jest artefakt pod workflow akcji slsa do weryfikacji.

Zależności

Brak.

Przykłady

Playbook

---
- hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Dodaj rolę utrwalania
      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 z git checkout

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

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

    - name: Dodaj rolę utrwalania
      ansible.builtin.include_role:
        name: thechip911.hardening
      vars:
        block_blacklisted: true
        sshd_admin_net:
          - 10.0.2.0/16
        suid_sgid_permissions: false
...

Uwaga dotycząca zasad zapory UFW

Zamiast resetować ufw przy każdym uruchomieniu, co powodowałoby zakłócenia w ruchu sieciowym, rola usuwa wszystkie zasady ufw, które nie mają parametru zadania comment: ansible managed.

Rola ustawia również domyślne zasady odmowy, co oznacza, że należy utworzyć zasady zapory dla dodatkowych portów, oprócz tych określonych w zmiennych sshd_port i ufw_outgoing_traffic.

Wykonanie zadań i struktura

Szczegóły na temat struktury roli znajdziesz w pliku STRUCTURE.md.

Testowanie roli

Szczegóły znajdziesz w pliku TESTING.md.

Zmienne roli z wartościami domyślnymi

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

Włącz auditd przy starcie systemu za pomocą Grub.

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

auditd_action_mail_acct powinien być poprawnym adresem e-mail lub aliasem.

auditd_admin_space_left_action definiuje działanie, gdy system wykryje niski poziom miejsca na dysku. suspend spowoduje zatrzymanie demona audytu, który przestanie zapisywać dane na dysku.

auditd_max_log_file_action ustawia działanie, gdy system wykryje, że osiągnięto maksymalny rozmiar pliku. Na przykład opcja rotate spowoduje rotację dzienników audytu. Opcja keep_logs działa jak rotate, ale nie korzysta z ustawienia num_logs, co zapobiega nadpisywaniu dzienników audytu.

auditd_space_left_action informuje system, jakie działanie podjąć, gdy wykryje niski poziom miejsca na dysku. email oznacza, że wyśle ostrzeżenie na adres e-mail określony w action_mail_acct, a także wyśle wiadomość do syslog.

auditd_mode ustawia tryb awaryjny auditd, 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

Lista kompilatorów, które będą dostępne tylko dla użytkownika root.

./defaults/main/disablewireless.yml

disable_wireless: false

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

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

Adresy IPv4 i IPv6 do użycia jako serwery DNS systemowe i zapasowe. Jeśli dnssec jest ustawione na "allow-downgrade", próbuje się wykonać walidację DNSSEC, ale jeśli serwer nie obsługuje poprawnie DNSSEC, tryb DNSSEC jest automatycznie wyłączany.

Jeśli dns_over_tls jest prawdziwe, wszystkie połączenia do serwera będą szyfrowane, jeśli serwer DNS obsługuje DNS-over-TLS i ma ważny certyfikat.

Opcja systemd.

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

Jeśli disable_ipv6: true, IPv6 zostanie wyłączone.

./defaults/main/limits.yml

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

Maksymalna liczba procesów i otwartych plików.

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

Jeśli install_aide: true, to AIDE zostanie zainstalowane i skonfigurowane.

Jeśli reboot_ubuntu: true, węzeł Ubuntu zostanie ponownie uruchomiony w razie potrzeby.

redhat_signing_keys to klucze podpisywania produktów RedHat.

Klucze epel7_signing_keys, epel8_signing_keys i epel9_signing_keys są specyficznymi kluczami podpisywania dla wydań Fedora EPEL.

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

Zablokowane moduły jądra.

Ustawienie block_blacklisted: true zablokuje lub wyłączy automatyczne ładowanie zablokowanych modułów jądra. Uzasadnienie tego działania to, że zablokowany moduł można załadować ręcznie za pomocą modprobe module_name. Użycie install module_name /bin/true zapobiega temu.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

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

Ustawienie process_group konfiguruje grupę uprawnioną do uzyskiwania informacji o procesach, które są w przeciwnym razie zabronione przez hidepid=.

Opcje montowania /proc

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

Nazwa hosta serwera NTP lub adresy IP. Opcja systemd.

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

Pakiety do zainstalowania w zależności od dystrybucji oraz pakiety do usunięcia (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

Ustaw polityki kryptograficzne, jeśli istnieje plik /etc/crypto-policies/config.

Skonfiguruj bibliotekę libpwquality.

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

Aby poznać wyjaśnienia opcji, które nie zostały opisane, zapoznaj się z dokumentacją https://man.openbsd.org/sshd_config.

Tylko sieci określone w sshd_admin_net mają prawo łączyć się z sshd_port. Należy pamiętać, że muszą być ustawione dodatkowe zasady, aby umożliwić dostęp do dodatkowych usług.

Logowanie OpenSSH jest dozwolone tylko dla użytkowników, których grupa główna lub lista grup dodatkowych pasuje do wzorów w sshd_allow_groups.

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 yes, aby zezwolić na przekazywanie TCP; no, aby zapobiec wszystkiemu przekazywaniu TCP; local, aby zezwolić tylko na lokalne (z perspektywy ssh(1)) przekazywanie; lub remote, aby zezwolić na przekazywanie zdalne.

sshd_authentication_methods określa metody uwierzytelniania, które muszą być pomyślnie zakończone w celu przyznania dostępu do użytkownika.

sshd_log_level określa poziom szczegółowości, który jest używany podczas rejestrowania komunikatów.

sshd_max_auth_tries i sshd_max_sessions określają maksymalną liczbę prób uwierzytelnienia SSH dozwolonych na połączenie oraz maksymalną liczbę otwartych sesji powłoki, logowania lub podsystemu (np. sftp) dozwolonych na danym połączeniu sieciowym.

sshd_password_authentication określa, czy uwierzytelnianie hasłem jest dozwolone.

sshd_port określa numer portu, na którym nasłuchuje sshd(8).

sshd_required_rsa_size określa wymagany rozmiar RSA, ustawić tylko, jeśli wersja SSH jest wyższa niż 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
  [...]

Jeżeli suid_sgid_permissions: true, sprawdzi każdą pozycję w suid_sgid_blocklist i usunie wszelkie uprawnienia SUID/SGID.

Pełna lista plików dostępna jest w 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

Konfiguracja sysctl.

sysctl.conf

./defaults/main/ufw.yml

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

ufw_enable: true instaluje i konfiguruje ufw z odpowiednimi zasadami. Ustaw to na false, aby zainstalować i skonfigurować zaporę ręcznie. ufw_outgoing_traffic otwiera określone porty ufw, zezwalając na ruch wychodzący.

./defaults/main/users.yml

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

Użytkownicy do usunięcia.

Zalecane lektury

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

Bezpieczna konfiguracja systemd

Współpraca

Chcesz wnieść swój wkład? Świetnie! Wszelkie wkłady są mile widziane, bez względu na ich rozmiar. Jeśli znalazłeś coś dziwnego, zgłoś problem, popraw kod, tworząc pull request, lub sponsoring ten projekt.

Licencja

Licencja Apache, Wersja 2.0

Informacje o autorze

https://github.com/thechip911

Zainstaluj
ansible-galaxy install thechip911.hardening
Licencja
apache-2.0
Pobrania
109
Właściciel