Tutoriales

5 formas de fortalecer su servidor Linux usando Ansible

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.

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

LEER  Cómo utilizar el comando buscar para eliminar todos los archivos *.log creados en los últimos 90 días (excepto los últimos 7 días)

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba