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.
./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=
.
./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
.
./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
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
AlmaLinux, Debian and Ubuntu hardening. systemd edition.
ansible-galaxy install thechip911.hardening