
Este módulo de Puppet proporciona numerosas configuraciones relacionadas con la seguridad, ofreciendo una protección base integral.
Este módulo de Puppet proporciona una configuración segura de tu sistema operativo base con endurecimiento y forma parte del DevSec Hardening Framework.
Después de añadir este módulo, puedes usar la clase:
class { 'os_hardening': }
Todos los parámetros están contenidos dentro de la clase principal os_hardening, por lo que solo tienes que pasarlos así:
class { 'os_hardening':
enable_ipv4_forwarding => true,
}
Si estás usando este módulo en un entorno PE, tienes que establecer pe_environment = true
De lo contrario, Puppet mostrará un error (¡recurso duplicado!).
system_environment = 'default'
define el contexto en el que se ejecuta el sistema. Algunas opciones no funcionan con docker/lxcpe_environment = false
establécelo en true si estás usando Puppet Enterprise IMPORTANTE: ver arribaextra_user_paths = []
añade rutas adicionales a la variable PATH del usuario (por defecto está vacío).umask = undef
umask utilizado para la creación de nuevos directorios de inicio por useradd / newusers (p. ej. '027')maildir = undef
ruta para maildir (p. ej. '/var/mail')usergroups = true
true si quieres grupos separados para cada usuario, false en caso contrariosys_uid_min = undef y sys_gid_min = undef
anula la configuración predeterminada de login.defspassword_max_age = 60
edad máxima de la contraseñapassword_min_age = 7
edad mínima de la contraseña (antes de permitir cualquier otro cambio de contraseña)password_warn_age = 7
días de aviso antes de que venza el cambio de contraseñalogin_retries = 5
el número máximo de reintentos de inicio de sesión si la contraseña es incorrecta (normalmente anulado por PAM / auth_retries)login_timeout = 60
tiempo de espera de autenticación en segundos, por lo que el inicio de sesión saldrá si este tiempo pasachfn_restrict = ''
qué campos pueden ser cambiados por usuarios normales usando chfnallow_login_without_home = false
true para permitir que los usuarios sin directorio de inicio inicien sesiónallow_change_user = false
si un usuario puede usar su para cambiar su inicio de sesiónignore_users = []
matriz de cuentas de usuario del sistema que no deben ser endurecidas (contraseña deshabilitada y shell establecida en /usr/sbin/nologin)folders_to_restrict = ['/usr/local/games','/usr/local/sbin','/usr/local/bin','/usr/bin','/usr/sbin','/sbin','/bin']
carpetas para asegurarse de que el grupo y el resto del mundo no tengan acceso de escritura a ellas ni a ninguno de sus contenidosignore_max_files_warnings = false
true si no quieres que Puppet registre advertencias de max_files y rendimiento en la recursión de carpetas con > 1000 archivos, p. ej. /bin /usr/binrecurselimit = 5
profundidad del directorio para la comprobación recursiva de permisospasswdqc_enabled = true
true si quieres usar una comprobación de contraseñas seguras en PAM usando passwdqcauth_retries = 5
el número máximo de intentos de autenticación, antes de que la cuenta se bloquee durante un tiempoauth_lockout_time = 600
tiempo en segundos que debe pasar si la cuenta se bloqueó debido a demasiados intentos de autenticación fallidospasswdqc_options = 'min=disabled,disabled,16,12,8'
establécelo en cualquier línea de opciones (como cadena) que quieras pasar a passwdqcmanage_pam_unix = false
true si quieres que pam_unix sea gestionado por este móduloenable_pw_history = true
true si quieres que pam_unix recuerde el historial de contraseñas para evitar la reutilización de contraseñas (requiere manage_pam_unix = true)pw_remember_last = 5
el número de últimas contraseñas (p. ej. 5 evitará que el usuario reutilice cualquiera de sus últimas 5 contraseñas)only_root_may_su = false
true cuando solo root y los miembros del grupo wheel pueden usar su; debe ser true para el cumplimiento del CIS Benchmarkroot_ttys = ['console','tty1','tty2','tty3','tty4','tty5','tty6']
TTY registrados para rootwhitelist = []
todos los archivos que deben conservar sus bits SUID/SGID si están establecidos (se combinarán con la lista blanca predefinida de archivos)blacklist = []
todos los archivos a los que se les deben eliminar los bits SUID/SGID si están establecidos (se combinarán con la lista negra predefinida de archivos)remove_from_unknown = false
true si quieres eliminar los bits SUID/SGID de cualquier archivo que no esté configurado explícitamente en una blacklist. Esto hará que cada ejecución de Puppet busque en los sistemas de archivos montados bits SUID/SGID que no estén configurados en la lista negra predeterminada y de usuario. Si encuentra un bit SUID/SGID, se eliminará, a menos que este archivo esté en tu whitelist.dry_run_on_unknown = false
como remove_from_unknown anterior, solo que los bits SUID/SGID no se eliminan. Aún así buscará en los sistemas de archivos bits SUID/SGID, pero solo los imprimirá en tu registro. Esta opción solo se recomienda cuando configuras por primera vez remove_from_unknown para bits SUID/SGID, para que puedas ver los archivos que se están cambiando y hacer ajustes a tu whitelist y blacklist.enable_module_loading = true
true si quieres permitir cambiar los módulos del kernel una vez que el sistema está en ejecución (p. ej. modprobe, rmmod)load_modules = []
carga estos módulos a través de initramfs si enable_module_loading es falsedisable_filesystems = ['cramfs','freevxfs','jffs2','hfs','hfsplus','squashfs','udf']
matriz de sistemas de archivos (módulos del kernel) que deben deshabilitarsecpu_vendor = 'intel'
solo se requiere si enable_module_loading = false: establece el proveedor de CPU para los módulos a cargaricmp_ratelimit = '100'
valor predeterminado '100', permite sobrescribir, necesita Stringdesktop_enabled = false
true si este es un sistema de escritorio, es decir, Xorg, KDE/GNOME/Unity/etcenable_ipv4_forwarding = false
true si este sistema requiere reenvío de paquetes en IPv4 (p. ej. Router), false en caso contrariomanage_ipv6 = true
true para endurecer la configuración de ipv6, false para ignorar ipv6 por completoenable_ipv6 = false
false para deshabilitar ipv6 en este sistema, true para habilitarloenable_ipv6_forwarding = false
true si este sistema requiere reenvío de paquetes en IPv6 (p. ej. Router), false en caso contrarioarp_restricted = true
true si quieres que el comportamiento de anunciar y responder a ARP esté restringido, false en caso contrarioarp_ignore_samenet = false
true descartará los paquetes que no sean de la misma subred (arp_ignore = 2), false solo comprobará la IP de destino (arp_ignore = 1)enable_sysrq = false
true para habilitar la tecla mágica sysrq, false en caso contrarioenable_core_dump = false
false para evitar la creación de volcados de núcleo, true en caso contrarioenable_stack_protection = true
para la aleatorización del diseño del espacio de direcciones. ASLR puede ayudar a derrotar ciertos tipos de ataques de desbordamiento de búfer. ASLR puede ubicar la base, las bibliotecas, el montón y la pila en posiciones aleatorias en el espacio de direcciones de un proceso, lo que dificulta que un programa atacante prediga la dirección de memoria de la siguiente instrucción.enable_rpfilter = true
true para habilitar el filtrado de ruta inversa (descartar paquetes falsos), false en caso contrariorpfilter_loose = false
(solo si enable_rpfilter es true) modo flexible (rp_filter = 2) si es true, modo estricto en caso contrarioenable_log_martians = true
true para habilitar el registro de paquetes de red sospechosos / no enrutables, false en caso contrario ADVERTENCIA: ¡esto podría generar archivos de registro enormes!unwanted_packages = []
paquetes que deben eliminarse del sistemawanted_packages = []
paquetes que deben añadirse al sistemadisabled_services = []
servicios que no deben estar habilitadosenable_grub_hardening = false
establécelo en true para habilitar algunas reglas de endurecimiento de grubgrub_user = 'root'
el nombre de usuario de grub que debe proporcionarse al cambiar la configuración en el prompt de grubgrub_password_hash = ''
un hash de contraseña creado con grub-mkpasswd-pbkdf2 que está asociado con el grub_userboot_without_password = true
configura Grub para que solo requiera una contraseña al cambiar una entrada, no al arrancar una entrada existentesystem_umask = undef
si esta variable está establecida, configura el umask para todos los usuarios del sistema (p. ej. '027')manage_home_permissions = false
establécelo en true para gestionar los permisos de archivos y directorios de los usuarios locales (g-w,o-rwx)ignore_home_users = []
matriz de usuarios que no deben ser restringidos por manage_home_permissionsmanage_log_permissions = false
establécelo en true para gestionar los permisos de archivos de registro (g-wx,o-rwx)restrict_log_dir = ['/var/log/']
establece el directorio de registro principalignore_restrict_log_dir = []
matriz para excluir directorios de registro bajo el directorio de registro principalignore_files_in_folder_to_restrict = []
matriz para ignorar archivos a endurecer en directorios bajo la matriz folder_to_restrictmanage_cron_permissions = false
establécelo en true para gestionar los permisos de archivos cron (og-rwx)enable_sysctl_config = true
establécelo en false para deshabilitar la configuración de sysctlmanage_system_users = true
establécelo en false para deshabilitar la gestión de usuarios del sistema (contraseña vacía y establecimiento del shell nologin)shadow_group = undef
anula la propiedad del grupo de /etc/shadowshadow_mode = undef
anula los permisos de archivo de /etc/shadowTambién es posible establecer los parámetros en Hiera así:
os_hardening::password_max_age: 90
os_hardening::password_min_age: 0
os_hardening::password_warn_age: 14
os_hardening::unwanted_packages: ['telnet']
os_hardening::ignore_users: ['git','githook','ansible','apache','puppetboard']
Como el CIS Distribution Independent Linux Benchmark es un buen punto de partida en cuanto al endurecimiento de sistemas, se consideró apropiado implementar una forma fácil de tratar con casos puntuales para los que no se quiere escribir un módulo completo.
Por ejemplo, para aumentar el cumplimiento de CIS DIL en un sistema Debian, se debería establecer lo siguiente:
wanted_packages => ['ntp'],
unwanted_packages => ['telnet'],
disabled_services => ['rsync'],
La configuración predeterminada de NTP es en realidad bastante buena para la mayoría de las situaciones, por lo que no es inmediatamente necesario implementar un módulo. Sin embargo, si usas un módulo para controlar estos servicios, eso es por supuesto preferible.
Este módulo ha sido probado y debería ejecutarse en la mayoría de las distribuciones de Linux. Para una lista extensa de sistemas operativos compatibles, consulta metadata.json
Si quieres contribuir, sigue nuestra guía de contribución.
Deberías tener el intérprete de Ruby instalado en tu sistema. Podría ser una buena idea usar rvm para ese propósito. Además de eso, tienes que instalar el Puppet Development Kit PDK y Docker Community Edition, ya que las pruebas de integración se ejecutan en contenedores Docker.
Para todas nuestras pruebas de integración usamos test-kitchen. Si no estás familiarizado con test-kitchen, consulta su guía.
# Pruebas de sintaxis y lint
pdk validate
# Pruebas unitarias
pdk test unit
De forma predeterminada, las pruebas de integración se ejecutarán en contenedores Docker; desafortunadamente, no todas las pruebas pueden ejecutarse en entornos de contenedores (p. ej. configuraciones de sysctl).
# Instalar dependencias
gem install bundler
bundle install
# listar todas las instancias de prueba
bundle exec kitchen list
# prueba rápida en una máquina
bundle exec kitchen test ubuntu-16-04-puppet5
# prueba en todas las máquinas
bundle exec kitchen test
Para pruebas de integración completas con DigitalOcean, tienes que obtener una cuenta allí y configurar algunas variables de entorno:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - token de acceso para DigitalOceanDIGITALOCEAN_SSH_KEY_IDS - ID en DigitalOcean de tu clave ssh, consulta esto para más informaciónLa clave ssh tiene que llamarse ~/.ssh/do_ci y añadirse a tu perfil en DigitalOcean.
Después de esto, estás listo para ejecutar las pruebas como se describe en Pruebas de integración (Docker).
Si quieres ejecutar las pruebas de integración completas con Github Actions en tu fork, tendrás que añadir estas variables de entorno en la configuración de tu fork:
KITCHEN_LOCAL_YAML=kitchen.do.ymlDIGITALOCEAN_ACCESS_TOKEN - token de acceso para DigitalOceanCI_SSH_KEY - parte privada de una clave ssh, disponible en DigitalOcean para tus instancias, en forma codificada en base64 (p. ej. cat id_rsa | base64 -w0 ; echo)DIGITALOCEAN_SSH_KEY_IDS - ID en DigitalOcean de CI_SSH_KEY, consulta esto para más informaciónTus parches se probarán automáticamente a través de Github Actions. El resumen de pruebas es visible en Github en tu PR; los detalles se pueden encontrar en las pruebas vinculadas.
Puedes contactarnos de varias maneras:
Por el port original de chef-os-hardening a puppet:
¡¡Gracias a todos!!
Licenciado bajo la Apache License, Versión 2.0 (la "Licencia"); no puedes usar este archivo excepto en cumplimiento con la Licencia. Puedes obtener una copia de la Licencia en
http://www.apache.org/licenses/LICENSE-2.0
Salvo que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulta la Licencia para conocer el idioma específico que rige los permisos y las limitaciones bajo la Licencia.