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:
- AlmaLinux 8
- AlmaLinux 9
- Debian 11 (Bullseye)
- Debian 12 (Bookworm)
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 24.04 (Noble Numbat)
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.
./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.
./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.
./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=
.
./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
yMACs
se configurarán según lo definido por las políticas criptográficas si/etc/crypto-policies/config
existe yset_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ámetroInclude
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)
osshd_sftp_only_group
, el valortrue
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
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
AlmaLinux, Debian and Ubuntu hardening. systemd edition.
ansible-galaxy install konstruktoid.hardening