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.

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

opción de 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

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

/opciones de montaje de 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

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.

sysctl.conf

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

Guías de Seguridad SCAP

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

https://github.com/thechip911

Acerca del proyecto

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Instalar
ansible-galaxy install thechip911.hardening
Licencia
apache-2.0
Descargas
109
Propietario