konstruktoid.hardening

Rol de Ansible para Endurecimiento de Servidores

Esta es una rol de Ansible diseñada para mejorar la seguridad de los servidores que funcionan con AlmaLinux, Debian o Ubuntu.

Está enfocada en systemd y requiere Ansible versión 2.15 o superior.

La rol soporta los siguientes sistemas operativos:

Para aquellos que utilizan AWS o Azure, también hay imágenes de máquina (AMIs) de Ubuntu en versión segura y disponibles.

Estas están disponibles en el repositorio konstruktoid/hardened-images. Estas imágenes se construyen utilizando Packer y se usa esta rol de Ansible para la configuración.

Nota No utilice esta rol sin probarla primero en un entorno no operativo.

Nota Hay un artefacto SLSA presente bajo el flujo de trabajo de acción SLSA para verificación.

Dependencias

Ninguna.

Ejemplos

Requisitos

---
roles:
  - name: konstruktoid.hardening
    version: v2.1.0
    src: https://github.com/konstruktoid/ansible-role-hardening.git
    scm: git

Playbook

---
- name: Importar y usar la rol de endurecimiento
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Importar la rol de endurecimiento
      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

Playbook local usando git checkout

---
- name: Clonar y configurar konstruktoid.hardening
  hosts: localhost
  any_errors_fatal: true
  tasks:
    - name: Clonar el repositorio de endurecimiento
      become: true
      tags:
        - always
      block:
        - name: Instalar git
          ansible.builtin.package:
            name: git
            state: present

        - name: Clonar 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: Eliminar git
          ansible.builtin.package:
            name: git
            state: absent

    - name: Incluir la rol de endurecimiento
      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

Nota sobre las reglas de UFW

En lugar de reiniciar ufw en cada ejecución y causar una interrupción del tráfico de red, la rol elimina todas las reglas de ufw que no tienen el parámetro de tarea comment: ansible managed.

La rol también establece políticas de denegación por defecto, lo que significa que deben crearse reglas de firewall para cualquier puerto adicional, excepto los especificados en las variables sshd_ports y ufw_outgoing_traffic.

Vea ufw(8) para más información.

Ejecución de tareas y estructura

Vea STRUCTURE.md para el árbol de la estructura de la rol.

Pruebas de la rol

Vea TESTING.md.

Variables de la rol con valores por defecto

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

Si manage_aide: true, entonces se instalará y configurará AIDE.

aide_checksums modifica la variable Checksums de AIDE. Tenga en cuenta que la variable Checksums podría no estar presente dependiendo de la distribución.

aide_dir_exclusions es una lista de directorios que se excluirán de la base de datos de AIDE.

aide.conf(5)

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

Si manage_auditd: true, entonces se configurará y habilitará el Sistema de Auditoría de Linux en el arranque usando GRUB.

Cuando auditd_apply_audit_rules: 'yes', la rol aplica las reglas de auditd desde el 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 está bajo espacio en disco. suspend hará que el daemon de auditoría deje de escribir registros en el disco.

auditd_enable_flag establece la bandera de habilitación. Si se pasa 0, desactiva temporalmente la auditoría. 1 habilitará la auditoría y 2 bloqueará la configuración de auditoría.

auditd_flush: sync le dice al daemon de auditoría que mantenga tanto los datos como los metadatos completamente sincronizados con cada escritura en el disco.

auditd_max_log_file_action establece la acción a tomar cuando el sistema detecte que se ha alcanzado el límite de tamaño máximo de archivo. Por ejemplo, la opción rotate hará que el daemon de auditoría rote los registros. La opción keep_logs es similar a rotate, excepto que no usa la configuración num_logs. Esto evita que los registros de auditoría sean sobrescritos.

auditd_space_left_action le indica al sistema qué acción tomar cuando se ha detectado que está bajo espacio en disco. email significa que enviará una advertencia a la cuenta de correo electrónico especificada en action_mail_acct así como enviando el mensaje al syslog.

auditd_mode establece el modo de falla de auditd, 0=silencioso 1=imprimir 2=pánico.

auditd.conf(5)

./defaults/main/automatic_updates.yml

automatic_updates:
  enabled: true
  reboot: false

Si automatic_updates está habilitado, instalará y configurará dnf-automatic o unattended-upgrades, dependiendo de la distribución.

Si la opción reboot está configurada como true, reiniciará el sistema si es necesario, vea Unattended-Upgrade::Automatic-Reboot y 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

Si manage_compilers: true, entonces los compiladores listados estarán restringidos al usuario root.

./defaults/main/crypto_policies.yml

set_crypto_policy: true
crypto_policy: DEFAULT:NO-SHA1

Establezca y use políticas criptográficas si existe /etc/crypto-policies/config y set_crypto_policy: true.

./defaults/main/disablewireless.yml

disable_wireless: false

Si true, desactiva todas las interfaces inalámbricas.

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

Si manage_resolved: true, configura systemd-resolved.

Direcciones IPv4 e IPv6 para usar 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 desactivará automáticamente.

Si dns_over_tls es true, todas las conexiones al servidor estarán encriptadas si el servidor DNS admite DNS sobre TLS y tiene un certificado válido.

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

Si disable_ipv6: true, se desactivará IPv6 y se configurarán las configuraciones Sysctl relacionadas.

ipv6_sysctl_settings es la configuración sysctl utilizada si el host está utilizando IPv6.

sysctl.conf

./defaults/main/journal.yml

rsyslog_filecreatemode: "0640"

journald_compress: true
journald_forwardtosyslog: false
journald_storage: persistent

rsyslog_filecreatemode establece el modo de creación con el que rsyslogd crea nuevos archivos, vea rsconf1_filecreatemode.

journald_compress puede tomar un valor booleano. Si está habilitado (por defecto), los objetos de datos se comprimen antes de ser escritos en el sistema de archivos.

journald_storage controla dónde almacenar los datos del diario. Uno de volatile, persistent, auto y none.

journald_forwardtosyslog controla si los mensajes de registro recibidos por el daemon del diario deben ser enviados a un daemon syslog tradicional.

Vea journald.conf para más información.

./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 permitirá llamadas al sistema virtual si es true, de lo contrario, no se establecerá el mapeo vsyscall, vea CONFIG_LEGACY_VSYSCALL_NONE.

enable_page_poisoning: true habilitará CONFIG_PAGE_POISONING.

kernel_lockdown configura la característica de bloqueo del kernel. Los valores válidos son false, true, integrity y confidentiality. Si es true, el kernel se bloqueará en modo integrity.

page_table_isolation es una contramedida contra ataques al espacio de direcciones compartido usuario/kernel, vea CONFIG_PAGE_TABLE_ISOLATION.

slub_debugger_poisoning, si se establece como true, previene muchos tipos de vulnerabilidades de uso después de liberar y también evita el escape de datos y la detección de memoria corrompida. Vea Guía de usuario corta para SLUB.

./defaults/main/limits.yml

limit_nofile_hard: 1024
limit_nofile_soft: 512
limit_nproc_hard: 1024
limit_nproc_soft: 512

Establezca el número máximo de procesos y archivos abiertos, vea 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

Si reboot_ubuntu: true, se reiniciará un nodo de Ubuntu si es necesario.

redhat_signing_keys son las 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 la release 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

Módulos del kernel que serán bloqueados y desactivados usando una instalación falsa.

Nota

Desactivar el módulo usb-storage desactivará todos los dispositivos de almacenamiento USB. Si se necesitan tales dispositivos, debe configurarse USBGuard, o una herramienta similar, en consecuencia.

./defaults/main/mount.yml

hide_pid: 2
process_group: root

hide_pid establece el modo de acceso a /proc/<pid>/.

La configuración process_group configura el grupo autorizado para conocer la información de los procesos de lo contrario prohibido por hidepid=.

/proc opciones de montaje

./defaults/main/ntp.yml

manage_timesyncd: true

fallback_ntp:
  - ntp.netnod.se
  - ntp.ubuntu.com
ntp:
  - 2.pool.ntp.org
  - time.nist.gov

Si manage_timesyncd: true, entonces configura systemd timesyncd, de lo contrario, se recomienda instalar un cliente 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";

Configura las herramientas del 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 ejecutará apt upgrade o dnf update si es necesario.

Paquetes que deben instalarse dependiendo de la distribución y paquetes que se deben eliminar (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 habilitará la biblioteca faillock.

password_remember establece el tamaño del historial de contraseñas que el usuario no podrá reutilizar.

Las variables faillock, login_defs y pwquality se utilizan para configurar pam_faillock, login.defs y 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

Si manage_rkhunter: true, entonces se configurará 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

Si manage_ssh: true, se configurará el cliente SSH y el daemon SSH.

Nota

CASignatureAlgorithms, Ciphers, HostKeyAlgorithms, KexAlgorithms y MACs se configurarán según lo definido por las políticas criptográficas si /etc/crypto-policies/config existe y set_crypto_policy: true.

Para obtener una explicación de las opciones no descritas a continuación, lea https://man.openbsd.org/sshd_config.

Solo se permitirá la conexión a sshd_ports para las redes definidas en sshd_admin_net. Tenga en cuenta que deben configurarse reglas adicionales para permitir acceso a servicios adicionales.

El inicio de sesión de OpenSSH solo está permitido para usuarios cuyo grupo primario o lista de grupos suplementarios coincida con uno de los patrones en sshd_allow_groups. También se permite el inicio de sesión de OpenSSH para usuarios en sshd_allow_users. Para hacer lo contrario y denegar el acceso, use los parámetros sshd_deny_groups y sshd_deny_users, que a su vez tienen prioridad sobre los parámetros anteriores.

sshd_allow_agent_forwarding especifica si se permite el reenvío ssh-agent(1).

sshd_allow_tcp_forwarding especifica si se permite el reenvío TCP. Las opciones disponibles son true o all para permitir el reenvío TCP, false para prevenir todo reenvío TCP, local para permitir solo el reenvío local (desde el punto de vista 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 con éxito para otorgar acceso a un usuario.

sshd_log_level da 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 abiertas de shell, inicio de sesión o subsistema (por ejemplo, sftp) permitidos por conexión de red.

sshd_password_authentication especifica si se permite la autenticación por contraseña.

sshd_ports especifica el número de puerto(s) en los que el sshd(8) escucha.

sshd_required_rsa_size, RequiredRSASize, solo se establecerá si la versión de SSH es mayor que 9.1.

sshd_config_d_force_clear obliga a limpiar el directorio /etc/ssh/sshd_config.d. Por defecto: false.

sshd_config_force_replace obliga a reemplazar el archivo de configuración /etc/ssh/sshd_config. Por defecto: false.

Nota

Por defecto, la rol verifica si el directorio /etc/ssh/sshd_config.d existe y si está vinculado a través del parámetro Include en el archivo /etc/ssh/sshd_config. Si es así, se crea un archivo de configuración adicional en /etc/ssh/sshd_config.d; de lo contrario, se sobrescribe el archivo /etc/ssh/sshd_config.

Advertencia

Si se establece algún parámetro sshd_match_(users|groups|addresses|local_ports) o sshd_sftp_only_group, el valor true será implícito.

sshd_host_keys_files claves host para sshd. Si está vacío, se usarán ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'], siempre que sea compatible con la versión de sshd instalada.

sshd_host_keys_owner establece el propietario de las claves host para sshd.

sshd_host_keys_group establece el grupo de claves host para sshd.

sshd_host_keys_mode establece los permisos de las claves host para sshd.

sshd_match_users agrega un bloque condicional para usuarios. Si se cumplen todos los criterios en la línea Match, las reglas/parámetros definidos en las siguientes líneas anulan los establecidos en la sección global del archivo de configuración, hasta que se encuentre otra línea Match o el fin del archivo.

Estructura de configuración esperada:

sshd_match_users:
  - user: <nombre_de_usuario>
    rules:
      - <parámetro sshd> <valor>
      - <parámetro sshd> <valor>

Ejemplo, permitir que el usuario ubuntu acceda mediante autenticación por contraseña y permitir que el usuario ansible acceda sin un banner:

sshd_match_users:
  - user: ubuntu
    rules:
      - AllowUsers ubuntu
      - AuthenticationMethods password
      - PasswordAuthentication yes
  - user: ansible
    rules:
      - AllowUsers ansible
      - Banner none

sshd_match_groups agrega un bloque condicional para grupos. Más detalles y ejemplos en la descripción del parámetro sshd_match_users.

Estructura de configuración esperada:

sshd_match_groups:
  - group: <nombre_del_grupo>
    rules:
      - <parámetro sshd> <valor>
      - <parámetro sshd> <valor>

sshd_match_addresses agrega un bloque condicional para direcciones. Más detalles y ejemplos en la descripción del parámetro sshd_match_users.

Estructura de configuración esperada:

sshd_match_addresses:
  - address: <ip>
    rules:
      - <parámetro sshd> <valor>
      - <parámetro sshd> <valor>

sshd_match_local_ports agrega un bloque condicional para puertos. Más detalles y ejemplos en la descripción del parámetro sshd_match_users.

Estructura de configuración esperada:

sshd_match_ports:
  - port: <puerto>
    rules:
      - <parámetro sshd> <valor>
      - <parámetro sshd> <valor>

sshd_print_pam_motd especifica si se imprime el MOTD a través de pam.

sshd_sftp_enabled especifica si está habilitada la configuración sftp.

sshd_sftp_subsystem establece el subsistema para el daemon de transferencia de archivos.

sshd_sftp_only_group especifica el nombre del grupo que tendrá acceso restringido solo al servicio sftp.

sshd_sftp_only_chroot especifica que el acceso al grupo se realizará a través de aislamiento chroot.

sshd_sftp_only_chroot_dir especifica el directorio chroot. Acepta los tokens %% (un literal %), %h (directorio de inicio del usuario) y %u (nombre de usuario).

sshd_syslog_facility establece el código de instalación que se usarán al registrar mensajes de sshd.

sshd_update_moduli, si se establece como true, descargará un archivo moduli actualizado del repositorio 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
  [...]

Si suid_sgid_permissions: true itera a través de suid_sgid_blocklist y elimina cualquier permiso SUID/SGID.

Una lista completa de archivos está disponible en defaults/main/suid_sgid_blocklist.yml y está basada en el trabajo de @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.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

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

Si manage_sysctl: true, actualiza la configuración de sysctl.

sysctl_conf_dir es donde se colocará la configuración de sysctl.

Vea sysctl.conf y la documentación del kernel.

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

Rutas para soportar la sobrescritura de las plantillas por defecto de la rol.

./defaults/main/ufw.yml

manage_ufw: true

ufw_outgoing_traffic:
  - 22
  - 53
  - 80
  - 123
  - 443
  - 853

ufw_rate_limit: false

Vea la nota sobre comentarios requeridos.

manage_ufw: true instala y configura ufw con las reglas relacionadas. Establezca en false para instalar y configurar un firewall manualmente.

ufw_outgoing_traffic abre los puertos específicos de ufw, permitiendo el tráfico saliente.

ufw_rate_limit, si es true, establecerá un límite de tasa de conexión en todas las interfaces de red físicas disponibles.

./defaults/main/umask.yml

session_timeout: 900
umask_value: "077"

session_timeout establece, en segundos, la TMOUT variable de entorno.

umask_value establece el valor por defecto 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 instala y configura USBGuard.

Se generará una política si se pueden listar reglas y aún no existe una política.

Vea la documentación de configuración sobre las opciones disponibles.

./defaults/main/users.yml

delete_users:
  - games
  - gnats
  - irc
  - list
  - news
  - sync
  - uucp

Usuarios que se eliminarán.

Lectura recomendada

Comparando los valores DISA STIG y CIS Benchmark

Center for Internet Security Linux Benchmarks

Common Configuration Enumeration

DISA Security Technical Implementation Guides

SCAP Security Guides

Configuración del sistema enfocada en la seguridad de systemd

Contribuir

¿Quieres contribuir? ¡Genial! Las contribuciones siempre son bienvenidas, sin importar cuán grandes o pequeñas. Si encontraste algo extraño, siéntete libre de presentar un issue, mejorar el código creando un pull request, o patrocinando este proyecto.

Licencia

Licencia Apache Versión 2.0

Información del autor

https://github.com/konstruktoid

Acerca del proyecto

AlmaLinux, Debian and Ubuntu hardening. systemd edition.

Instalar
ansible-galaxy install konstruktoid.hardening
Licencia
apache-2.0
Descargas
33.6k
Propietario