En su artículo 5 formas de fortalecer un nuevo sistema con Ansible, Enable Sysadmin Sudoer Anthony Critelli explica el proceso de desarrollo de un libro de jugadas de Ansible para asegurar un nuevo servidor Linux. Muestra cómo usar Ansible para parchear sistemas, bloquear el acceso remoto, deshabilitar software y servicios no utilizados y realizar otras tareas útiles.
En este artículo, le mostraré cómo usar Ansible para llevar la administración de su servidor Linux un paso más allá con estrategias y recomendaciones adicionales.
[ Cheat sheet: Get a list of Linux utilities and commands for managing servers and networks. ]
Si bien estas sugerencias son útiles, tenga en cuenta que no garantizan la seguridad absoluta de su servidor. Es poco probable que cualquier servidor expuesto a Internet sea completamente seguro, pero estas políticas adicionales ayudan a hacerlos más seguros y dificultan que alguien ataque o explote su servidor.
Finalmente, antes de aplicar estas recomendaciones, asegúrese de que se ajusten al propósito de su servidor.
La codificación de estas recomendaciones y políticas en los libros de jugadas de Ansible y la automatización de su aplicación le permite aplicarlas de manera uniforme en todos los servidores, verificar el cumplimiento y corregir los servidores de manera regular. He proporcionado un libro de jugadas de ejemplo completo al final de este artículo que incluye todas las sugerencias a continuación.
Tabla de Contenidos
1. Asegúrese de que su firewall esté funcionando
Asegurarse de que su firewall local esté funcionando es una de las cosas más básicas que puede hacer para restringir el acceso a un servidor Linux. Algunas distribuciones de Linux, como Red Hat Enterprise Linux (RHEL), habilitan el firewall de manera predeterminada durante la instalación. Sin embargo, es una buena idea verificar que el firewall esté habilitado en caso de que esté instalando un servidor desde una plantilla corporativa, etc., que no tenga el firewall habilitado de manera predeterminada.
Para asegurarse de que el firewall esté instalado, funcionando y funcionando con Ansible, use ansible.builtin.dnf
y ansible.builtin.service
Módulos con servicios de firewall para tu distribución. Para las distribuciones basadas en Fedora, el servicio de firewall está protegido por firewall.habilitar firewalld
Al agregar dos tareas como esta:
- name: Ensure firewall package is installed
ansible.builtin.dnf:
name: firewalld
state: present
- name: Ensure firewall service is up and running
ansible.builtin.service:
name: firewalld
state: started
enabled: yes
Luego, asegúrese de que el firewall solo permita el acceso a los servicios que necesita, deshabilitando otros. Esta tarea varía según el uso del sistema.Por ejemplo, para deshabilitar el servicio cockpit
y dhcpv6-client
Si no los usa usando módulos ansible.posix.firewalld
Hay un bucle:
- name: Block non-required services
ansible.posix.firewalld:
service: "{{ item }}"
state: disabled
permanent: yes
immediate: yes
loop:
- cockpit
- dhcpv6-client
Finalmente, habilite los servicios requeridos usando los mismos módulos. Por ejemplo, asegúrese de poder acceder a su servidor mediante SSH:
- name: Enable required services
ansible.posix.firewalld:
service: "ssh"
state: enabled
permanent: yes
immediate: yes
También puede usar un bucle si necesita habilitar más servicios, o incluso configurar estas dos configuraciones como una sola tarea iterando a través del diccionario y combinando los servicios con el estado deseado.
Luego, asegúrese de que SELinux esté habilitado.
2. Asegúrese de que SELinux esté habilitado y aplicado
Las distribuciones de Linux de la familia Red Hat, como RHEL y Fedora, implementan un Control de Acceso Obligatorio (MAC) Una solución de seguridad llamada SELinux (Security-Enhanced Linux). SELinux es una de las mejores formas de aumentar la seguridad del sistema al garantizar que los procesos solo puedan acceder a ciertos recursos, como ciertos archivos o puertos de red designados.
No entraré en detalles sobre SELinux aquí. Este es un gran tema, así que te animo a que aprendas más sobre él.Para más información, por favor consulte Documentación de SELinux.
[ Get the SELinux cheat sheet. ]
Para habilitar SELinux y configurarlo en modo de aplicación para permitir la protección proactiva del sistema, use ansible.posix.selinux
módulo:
- name: Ensure SELinux is enabled and enforcing
ansible.posix.selinux:
policy: targeted
state: enforcing
register: selinux_status
Al igual que los firewalls, SELinux debe estar habilitado de forma predeterminada con RHEL y Fedora, pero es una buena verificación y acción en caso de que no lo esté. Cuando cambia el estado de SELinux, es necesario reiniciar. en este caso, selinux
variable de retorno del módulo reboot_required
Sintonizar true
.verifique este valor debug
módulo y uso changed_when
Finalmente notifique al manejador de las condiciones para reiniciar la máquina:
- name: Verify if reboot needed
ansible.builtin.debug:
msg: "Reboot needed: {{ selinux_status.reboot_required }}"
changed_when: "{{ selinux_status.reboot_required | bool }}"
notify: reboot_host
Luego, al final de su script, defina reboot_host
uso de procesamiento ansible.builtin.reboot
El módulo reinicia la máquina:
handlers:
- name: reboot_host
ansible.builtin.reboot:
reboot_timeout: 360
Tenga en cuenta que si habilita SELinux para un servidor existente que contiene muchos archivos, se volverán a etiquetar cuando se reinicie la máquina. Este proceso puede llevar mucho tiempo, por lo que los planes cambiarán en consecuencia. Su mejor apuesta es habilitar SELinux cuando implemente un nuevo servidor para asegurarse de que se beneficie de esta protección desde el principio.
A continuación, habilite algunos parámetros seguros del kernel.
3. Habilite los parámetros de seguridad del kernel
El kernel de Linux es muy flexible y se puede personalizar para adaptarse a diferentes requisitos, cargas de trabajo y propósitos. Puede beneficiarse de esta flexibilidad para mejorar la seguridad de su servidor cambiando algunos parámetros del kernel. Linux expone la mayoría de estos parámetros en el sistema de archivos virtual /proc
Puede establecer el valor directamente en el correspondiente /proc
clave, pero más difícil de manejar.utilidad de línea de comandos sysctl
Haga que esta tarea sea fácil de implementar y administrar.También puede utilizar el módulo Ansible ansible.posix.sysctl
Administrar los parámetros del núcleo.
El kernel de Linux proporciona varios parámetros que se pueden cambiar. Estos parámetros afectan la funcionalidad y la seguridad del sistema de diferentes maneras. Asegúrese de cambiar aquellos que sean compatibles con el propósito y la utilización del servidor.
Primero actualice los parámetros básicos del sistema, tales como:
- Aleatoriza el espacio de direcciones virtuales, lo que dificulta que los atacantes utilicen direcciones de memoria conocidas para atacar.
- Deshabilite el acceso a dmesg por parte de usuarios sin privilegios.
- Deshabilita la creación de perfiles del kernel para usuarios sin privilegios.
Establezca estos parámetros usando ansible.posix.sysctl
Un módulo con un bucle, como este:
- name: Harden kernel parameters
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-kernel.conf
loop:
- name: kernel.randomize_va_space
value: 2
- name: kernel.dmesg_restrict
value: 1
- name: kernel.perf_event_paranoid
value: 2
A continuación, habilite algunas protecciones básicas relacionadas con la red:
- Deshabilite las cookies TCP SYN para evitar ataques de inundación SYN.
- Iniciar sesión paquete marciano Permite la inspección de paquetes de Protocolo de Internet (IP) desde direcciones reservadas.
- Inhabilita la aceptación de paquetes enrutados en origen en IPv4 e IPv6 para evitar la aceptación de cambios de enrutamiento que podrían eludir la seguridad de la red.
- name: Harden network parameters
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-net.conf
loop:
- name: net.ipv4.tcp_syncookies
value: 1
- name: net.ipv4.conf.default.log_martians
value: 1
- name: net.ipv4.conf.all.log_martians
value: 1
- name: net.ipv4.conf.all.accept_source_route
value: 0
- name: net.ipv4.conf.default.accept_source_route
value: 0
- name: net.ipv6.conf.all.accept_source_route
value: 0
- name: net.ipv6.conf.default.accept_source_route
value: 0
Finalmente, a menos que esté utilizando una red en puente para sus máquinas virtuales o contenedores, deshabilite el reenvío de IP:
- name: Disable ip forwarding
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-ip.conf
loop:
- name: net.ipv4.ip_forward
value: 0
- name: net.ipv6.conf.all.forwarding
value: 0
Estas opciones aumentan la seguridad de su servidor al evitar que los atacantes usen su red para eludir otras protecciones. Tenga en cuenta que los valores predeterminados para algunos de estos parámetros pueden ser útiles en otras situaciones, como enrutadores de red. La mayoría de los servidores no los necesitan.
Una vez que haya configurado algunas opciones básicas de seguridad de la red, mejórelas bloqueando algunas solicitudes ICMP.
[ Learn more about server and configuration management by downloading Ansible for DevOps. ]
4. Deshabilitar ICMP
Protocolo de mensajes de control de Internet (ICMP) Es un protocolo de red, utilizado principalmente para administrar y monitorear la red. ICMP tiene muchas aplicaciones útiles, pero los atacantes pueden usar algunas de sus características para explotar su sistema.
Deshabilitar ICMP puede afectar las herramientas de monitoreo de red que dependen de él. Consulte con el equipo administrativo del sistema antes de realizar cambios. Si este es su servidor privado o si su servidor está expuesto a Internet, debe deshabilitar algunas funciones de ICMP para evitar vectores de ataque comunes. Éstos incluyen:
- Ignora las solicitudes de eco de transmisión ICMP para dificultar el mapeo de su host.
- Ignora las solicitudes de «ping» de eco ICMP, lo que dificulta encontrar su servidor.
- Deshabilite la redirección de ICMP en las interfaces IPv4/IPv6 para evitar ataques de intermediarios.
- Deshabilite el envío de redireccionamientos ICMP para evitar la divulgación de información de enrutamiento de red que podría explotarse aún más.
Habilite estas opciones usando el módulo ansible.posix.sysctl
Hay un bucle:
- name: Disable ICMP echo and redirects
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-icmp.conf
loop:
- name: net.ipv4.icmp_echo_ignore_broadcasts
value: 1
- name: net.ipv4.icmp_echo_ignore_all
value: 1
- name: net.ipv4.conf.default.accept_redirects
value: 0
- name: net.ipv4.conf.all.accept_redirects
value: 0
- name: net.ipv6.conf.all.accept_redirects
value: 0
- name: net.ipv6.conf.default.accept_redirects
value: 0
- name: net.ipv4.conf.default.send_redirects
value: 0
- name: net.ipv4.conf.all.send_redirects
value: 0
Al igual que con las opciones de red, los enrutadores, no los servidores, requieren valores predeterminados para estos parámetros. Puede cambiarlos para mayor seguridad.
A continuación, facilite la comprensión de su sistema habilitando la auditoría del sistema.
[ Boost security, flexibility, and scale at the edge with Red Hat Enterprise Linux. ]
5. Habilitar la auditoría del sistema
El paso final para mejorar la seguridad del servidor es habilitar los servicios de auditoría. A diferencia de las acciones de las secciones anteriores de este artículo, habilitar la auditoría del sistema no proporciona una protección proactiva del sistema. No obstante, mejora la seguridad de su sistema al capturar información que se puede usar para rastrear eventos relacionados con la seguridad y obtener una mejor comprensión de la actividad del servidor para implementar políticas adicionales o mejorar las medidas de seguridad.
Use módulos de Ansible para garantizar que la auditoría del sistema funcione ansible.builtin.dnf
y ansible.builtin.service
:
- name: Ensure audit package is installed
ansible.builtin.dnf:
name: audit
state: present
- name: Ensure auditd service is up and running
ansible.builtin.service:
name: auditd
state: started
enabled: yes
Luego, implemente un conjunto básico de reglas que incluyan al menos la opción -e 2
Haga que la configuración de la regla sea inmutable. Esta configuración requiere un reinicio para implementar el cambio, evitando que alguien detenga o manipule accidentalmente el sistema de auditoría:
$ vi audit.rules
## First rule - delete all
-D
## Increase the buffers to survive stress events.
## Make this bigger for busy systems
-b 8192
## This determine how long to wait in burst of events
--backlog_wait_time 60000
## Set failure mode to syslog
-f 1
## Make rules configuration immutable (requires reboot to change)
-e 2
Finalmente, usando Ansible ansible.builtin.copy
El módulo copia el archivo de reglas en la ubicación adecuada. Al servicio de auditoría no le gustan los reinicios porque no puede registrar problemas potenciales. Se recomienda reiniciar la máquina para que estos cambios surtan efecto.Puede hacerlo notificando al mismo reboot_host
Controladores que agrega para las tareas de SELinux:
- name: Add a basic audit config
ansible.builtin.copy:
src: audit.rules
dest: /etc/audit/rules.d/audit.rules
owner: root
group: root
mode: 0600
notify: reboot_host
Las reglas de auditoría predeterminadas proporcionan una buena base para la auditoría del sistema, pero puede agregar más reglas para registrar y realizar un seguimiento de otros eventos relevantes.Para más información, ver Manual de seguridad RHEL.
La seguridad es un viaje
Los temas de este artículo son un buen punto de partida para mejorar la seguridad del servidor. Es posible que no esté haciendo que su servidor sea completamente seguro, pero lo está haciendo más seguro. Asegurarse de que su firewall esté funcionando, se aplique SELinux y el acceso a la red esté reforzado son todas medidas de seguridad básicas. En muchos casos, hacer bien lo básico puede contribuir en gran medida a proteger su sistema.
¡No te detengas aquí! Después de aplicar estas políticas y recomendaciones, continúe observando y monitoreando sus sistemas y realice los ajustes correspondientes. Utilice sistemas de auditoría para comprender las amenazas potenciales y los patrones de uso para mejorar continuamente sus políticas y actualizar sus sistemas.
La seguridad es un viaje, no un destino.
guion completo
Como referencia, aquí está el libro de jugadas completo con todas las sugerencias de este artículo:
- name: Linux hardening
hosts: linux_servers
gather_facts: yes
tasks:
- name: Ensure firewall package is installed
ansible.builtin.dnf:
name: firewalld
state: present
- name: Ensure firewall service is up and running
ansible.builtin.service:
name: firewalld
state: started
enabled: yes
- name: Block non-required services
ansible.posix.firewalld:
service: "{{ item }}"
state: disabled
permanent: yes
immediate: yes
loop:
- cockpit
- dhcpv6-client
- name: Enable required services
ansible.posix.firewalld:
service: "ssh"
state: enabled
permanent: yes
immediate: yes
- name: Ensure SELinux is enabled and enforcing
ansible.posix.selinux:
policy: targeted
state: enforcing
register: selinux_status
- name: Verify if reboot needed
ansible.builtin.debug:
msg: "Reboot needed: {{ selinux_status.reboot_required }}"
changed_when: "{{ selinux_status.reboot_required | bool }}"
notify: reboot_host
- name: Harden kernel parameters
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-kernel.conf
loop:
- name: kernel.randomize_va_space
value: 2
- name: kernel.dmesg_restrict
value: 1
- name: kernel.perf_event_paranoid
value: 2
- name: Harden network parameters
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-net.conf
loop:
- name: net.ipv4.tcp_syncookies
value: 1
- name: net.ipv4.conf.default.log_martians
value: 1
- name: net.ipv4.conf.all.log_martians
value: 1
- name: net.ipv4.conf.all.accept_source_route
value: 0
- name: net.ipv4.conf.default.accept_source_route
value: 0
- name: net.ipv6.conf.all.accept_source_route
value: 0
- name: net.ipv6.conf.default.accept_source_route
value: 0
- name: Disable ip forwarding
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-ip.conf
loop:
- name: net.ipv4.ip_forward
value: 0
- name: net.ipv6.conf.all.forwarding
value: 0
- name: Disable ICMP echo and redirects
ansible.posix.sysctl:
name: "{{ item.name }}"
value: '{{ item.value }}'
sysctl_set: yes
state: present
reload: yes
sysctl_file: /etc/sysctl.d/90-icmp.conf
loop:
- name: net.ipv4.icmp_echo_ignore_broadcasts
value: 1
- name: net.ipv4.icmp_echo_ignore_all
value: 1
- name: net.ipv4.conf.default.accept_redirects
value: 0
- name: net.ipv4.conf.all.accept_redirects
value: 0
- name: net.ipv6.conf.all.accept_redirects
value: 0
- name: net.ipv6.conf.default.accept_redirects
value: 0
- name: net.ipv4.conf.default.send_redirects
value: 0
- name: net.ipv4.conf.all.send_redirects
value: 0
- name: Ensure audit package is installed
ansible.builtin.dnf:
name: audit
state: present
- name: Ensure auditd service is up and running
ansible.builtin.service:
name: auditd
state: started
enabled: yes
- name: Add a basic audit config
ansible.builtin.copy:
src: audit.rules
dest: /etc/audit/rules.d/audit.rules
owner: root
group: root
mode: 0600
notify: reboot_host
handlers:
- name: reboot_host
ansible.builtin.reboot:
reboot_timeout: 360
[ Check out this guide to boosting hybrid cloud security and protecting your business. ]