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:
- AlmaLinux 8
- AlmaLinux 9
- Debian 11 (Bullseye)
- Debian 12 (Bookworm)
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 24.04 (Noble Numbat)
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.
./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.
./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.
./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-storagespowoduje 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=.
./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,KexAlgorithmsiMACsbędą konfigurowane zgodnie z ustaleniami polityki kryptograficznej, jeśli/etc/crypto-policies/configistnieje iset_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.distnieje i czy jest połączony za pomocą parametruIncludew 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_configzostaje nadpisany.
Ostrzeżenie
Jeśli jakiekolwiek parametry
sshd_match_(users|groups|addresses|local_ports)lubsshd_sftp_only_groupzostaną ustawione, wartośćtruebę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
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
AlmaLinux, Debian and Ubuntu hardening. systemd edition.
ansible-galaxy install konstruktoid.hardening