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-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=
.
./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
iMACs
będą konfigurowane zgodnie z ustaleniami polityki kryptograficznej, jeśli/etc/crypto-policies/config
istnieje 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.d
istnieje i czy jest połączony za pomocą parametruInclude
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)
lubsshd_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
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