thechip911.hardening
Endurecimiento - el rol de Ansible
Un rol de Ansible para hacer que un servidor AlmaLinux, Debian o Ubuntu sea un poco más seguro. edición de systemd.
Requiere Ansible >= 2.12.
Disponible en Ansible Galaxy.
Se soportan AlmaLinux 8, Debian 11, Ubuntu 20.04 LTS (Focal Fossa) y 22.04 LTS (Jammy Jellyfish).
Nota
No utilices este rol sin primero probarlo en un entorno no operativo.
Nota
Hay un artefacto de SLSA presente en el flujo de trabajo de acciones de slsa para verificación.
Dependencias
Ninguna.
Ejemplos
Playbook
---
- hosts: localhost
any_errors_fatal: true
tasks:
- name: Incluir el rol de endurecimiento
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 con git checkout
---
- hosts: localhost
any_errors_fatal: true
tasks:
- name: Instalar git
become: true
ansible.builtin.package:
name: git
state: present
- name: Hacer checkout de thechip911.hardening
become: true
ansible.builtin.git:
repo: 'https://github.com/thechip911/ansible-role-hardening'
dest: /etc/ansible/roles/thechip911.hardening
version: master
- name: Incluir el rol de endurecimiento
ansible.builtin.include_role:
name: thechip911.hardening
vars:
block_blacklisted: true
sshd_admin_net:
- 10.0.2.0/16
suid_sgid_permissions: false
...
Nota sobre las reglas del cortafuegos UFW
En lugar de reiniciar ufw
en cada ejecución y así causar interrupciones en el tráfico de red, el rol elimina cada regla de ufw
sin el parámetro y valor de tarea comment: ansible managed
.
El rol también establece políticas de denegación por defecto, lo que significa que se necesitan crear reglas de cortafuegos para cualquier puerto adicional, excepto los especificados en las variables sshd_port
y ufw_outgoing_traffic
.
Ejecución y Estructura de Tareas
Consulta STRUCTURE.md para ver la estructura del rol.
Pruebas del Rol
Consulta TESTING.md.
Variables del Rol con valores por defecto
./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
Habilita auditd
al inicio usando Grub.
Cuando auditd_apply_audit_rules: 'yes'
, el rol aplica las reglas de auditd del archivo de plantilla incluido.
auditd_action_mail_acct
debe ser una dirección de correo electrónico o alias válido.
auditd_admin_space_left_action
define qué acción tomar cuando el sistema ha detectado que tiene poco espacio en disco. suspend
hará que el demonio de auditoría deje de escribir registros en el disco.
auditd_max_log_file_action
establece qué acción tomar cuando el sistema ha detectado que se ha alcanzado el límite máximo de tamaño de archivo. Por ejemplo, la opción rotate
hará que el demonio de auditoría rote los registros. La opción keep_logs
es similar a rotate
excepto que no utiliza la configuración num_logs
. Esto evita que los registros de auditoría sean sobrescritos.
auditd_space_left_action
indica al sistema qué acción tomar cuando el sistema ha detectado que tiene poco espacio en disco. email
significa que enviará una advertencia a la cuenta de correo electrónico especificada en action_mail_acct
además de enviar el mensaje a syslog.
auditd_mode
establece el modo de fallo de auditd
, 0=silencioso 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 de compiladores que estarán restringidos al usuario root.
./defaults/main/disablewireless.yml
disable_wireless: false
Si true
, desactiva todas las interfaces inalámbricas.
./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
Direcciones IPv4 e IPv6 a utilizar como servidores DNS del sistema y de respaldo. Si dnssec
está configurado como "allow-downgrade", se intentará la validación de DNSSEC, pero si el servidor no admite DNSSEC adecuadamente, el modo DNSSEC se desactiva automáticamente.
Si dns_over_tls
es verdadero, todas las conexiones al servidor estarán cifradas si el servidor DNS admite DNS-over-TLS y tiene un certificado válido.
./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
Si disable_ipv6: true
, IPv6 estará deshabilitado.
./defaults/main/limits.yml
limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512
Número máximo de procesos y archivos abiertos.
./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
Si install_aide: true
, entonces AIDE será instalado y configurado.
Si reboot_ubuntu: true
, se reiniciará un nodo de Ubuntu si es necesario.
redhat_signing_keys
son Claves de Firma de Productos de RedHat.
Las epel7_signing_keys
, epel8_signing_keys
y epel9_signing_keys
son claves de firma específicas de versiones de 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
Módulos del kernel bloqueados.
Establecer block_blacklisted: true
bloqueará, o deshabilitará, cualquier carga automática de módulos del kernel que estén en la lista negra. La razón de esto es que un módulo en la lista negra aún puede ser cargado manualmente con modprobe nombre_del_módulo
. Usar install nombre_del_módulo /bin/true
previene esto.
./defaults/main/mount.yml
hide_pid: 2
process_group: root
hide_pid
establece el modo de acceso de /proc/<pid>/
.
La configuración de process_group
autoriza al grupo a conocer la información de los procesos que de otro modo estarían prohibidos por 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
Nombres de host o direcciones IP del servidor NTP. opción de 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'
ejecutará apt upgrade
o dnf update
si es necesario.
Paquetes a instalar dependiendo de la distribución y paquetes a eliminar (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
Establecer políticas criptográficas si existe /etc/crypto-policies/config
.
Configurar la biblioteca 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'
Para una explicación de las opciones no descritas a continuación, consulta https://man.openbsd.org/sshd_config.
Solo se permite que las redes definidas en sshd_admin_net
se conecten al sshd_port
. Ten en cuenta que se deben establecer reglas adicionales para permitir el acceso a otros servicios.
El inicio de sesión de OpenSSH solo está permitido para usuarios cuyo grupo principal o lista de grupos suplementarios coincidan con uno de los patrones en sshd_allow_groups
.
sshd_allow_agent_forwarding
especifica si se permite el reenvío de ssh-agent(1).
sshd_allow_tcp_forwarding
especifica si se permite el reenvío TCP. Las opciones disponibles son yes
o todas para permitir el reenvío TCP, no
para prevenir todo el reenvío TCP, local
para permitir solo el reenvío local (desde la perspectiva de ssh(1)) o remote
para permitir solo el reenvío remoto.
sshd_authentication_methods
especifica los métodos de autenticación que deben completarse exitosamente para otorgar acceso a un usuario.
sshd_log_level
establece el nivel de verbosidad que se usa al registrar mensajes.
sshd_max_auth_tries
y sshd_max_sessions
especifican el número máximo de intentos de autenticación SSH permitidos por conexión y el número máximo de sesiones de shell, inicio de sesión o subsistemas (por ejemplo, sftp) permitidos por conexión de red.
sshd_password_authentication
especifica si se permite la autenticación por contraseña.
sshd_port
especifica el número de puerto en el que escucha sshd(8).
sshd_required_rsa_size
, RequiredRSASize, solo se establecerá si la versión de SSH es superior a 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
[...]
Si suid_sgid_permissions: true
, recorrerá suid_sgid_blocklist
y eliminará
cualquier permiso SUID/SGID.
Una lista completa de archivos está disponible en
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
Configuración de sysctl
.
./defaults/main/ufw.yml
ufw_enable: true
ufw_outgoing_traffic:
- 22
- 53
- 80
- 123
- 443
- 853
ufw_enable: true
instala y configura ufw
con las reglas relacionadas. Establécelo como false
para instalar y configurar un cortafuegos manualmente. ufw_outgoing_traffic
abre los puertos específicos de ufw
, permitiendo el tráfico saliente.
./defaults/main/users.yml
delete_users:
- games
- gnats
- irc
- list
- news
- sync
- uucp
Usuarios que deben ser eliminados.
Lectura Recomendada
Comparando los valores de DISA STIG y CIS Benchmark
Centro para la Seguridad de Internet Linux Benchmarks
Enumeración de Configuración Común
Guías de Implementación Técnica de Seguridad de DISA
Configuración de systemd enfocada en la seguridad
Contribuciones
¿Quieres contribuir? ¡Genial! Las contribuciones son siempre bienvenidas, no importa cuán grandes o pequeñas. Si encontraste algo extraño, siéntete libre de presentar un problema, mejorar el código creando una solicitud de extracción, o patrocinando este proyecto.
Licencia
Licencia Apache Versión 2.0
Información del Autor
AlmaLinux, Debian and Ubuntu hardening. systemd edition.
ansible-galaxy install thechip911.hardening