Asegurando nuestro servidor

  1. Firewall: Un buen firewall es esencial para proteger nuestro equipo, tanto si tenemos un router como primera barrera como si no, dado que el router solo filtrará puertos, pero no nos protegerá frente a ataques.

    Podemos configurar un firewall manualmente o recurrir a alguna solución de las disponibles para nuestra distribución. En caso de configurarlo a mano podemos tener en cuenta lo siguiente, ajustando las variables según nuestro sistema:

    1. Iptables funciona ordenadamente, de modo que no nos podemos olvidar de aceptar en primer lugar nuestros propios paquetes, antes de cualquier filtrado:

      
iptables -A INPUT -s $LOOPBACK -j ACCEPT
      iptables -A INPUT -s $NUESTRA_IP -j ACCEPT
      	  
    2. Aceptar paquetes de conexiones ya establecidas, de modo que las conexiones que se hayan establecido correctamente desde la máquina tengan vía libre:

      
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
      	  
    3. Realizar el filtrado de puertos, aceptando lo que consideremos necesario y bloqueando todo lo demás:

      
iptables -A INPUT -m multiport -p tcp --dports 22,80,443 -j ACCEPT
      iptables -A INPUT -p tcp -j LOG --log-prefix "Rechazamos el resto: "
      iptables -A INPUT -p udp -j LOG --log-prefix "Rechazamos el resto: "
      iptables -A INPUT -p tcp -j DROP
      iptables -A INPUT -p udp -j DROP
      	  
    4. Log packets with impossible addresses to kernel log

      
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
      	  
    5. Anti-flooding.

      
iptables -N syn-flood
      iptables -A INPUT -i $INETIF -p tcp --syn -j syn-flood
      iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
      iptables -A syn-flood -j DROP
      	  
    6. Guardar los accesos con paquetes fragmentados, recurso utilizado para tirar servidores y otras maldades (bugs en Apache por ejemplo)

      
iptables -A INPUT -i $INETIF -f -j LOG --log-prefix "Fragmento! "
      iptables -A INPUT -i $INETIF -f -j DROP
      	  
  2. Snort es un sistema de detección de intrusos. Detecta ataques en tiempo real y actúa en consecuencia según las reglas programadas.

  3. RootKit hunter (rkhunter) es un programa que monitoriza cambios en los ficheros del sistema en busca de alguna alteración que pueda indicar la presencia de un rootkit. En caso positivo envia un e-mail para alertar al administrador

  4. Algunos rootkit son capaces de ocultarse evitando aparecer en los resultados de comandos como ps, top, etc. Para ello es interesante integrar Unhide en rkhhunter. Unhide comprueba que los procesos listados en procfs y la información obtenida de syscalls coincidan con los listados por el comando ps. También comprueba por fuerza bruta que todos los puertos en uso coincidan con la salida del comando netstat. Es altamente recomendable compilar esta herramienta estáticamente para que sea inmune en caso de tener una biblioteca infectada. Tras compilarla, movemos unhide-linux26 y unhide-tcp a /usr/local/bin. Finalmente ejecutamos rkhunter --propupd.

  5. Adoptar una política de copias de seguridad. Esencial si nuestro servidor contiene información importante. Para más información ver el howto de Copias de seguridad

  6. Proteger nuestro servidor web. En caso de utilizar apache podemos consultar la sección Asegurar apache del howto de Apache

  7. Proteger nuestro servidor DNS, en caso de utilizarlo. En esencia se trata de impedir que un atacante obtenga información acerca de la composición de nuestra red interna. Para más información, consultar la sección Asegurando Bind del howto de Bind

  8. Comprobar vulnerabilidades

    Tras realizar todos los pasos anteriores, sólo nos queda comprobar mediante un software de auditoría si nuestro equipo es vulnerable a algún ataque

    Para ello podremos utilizar:

    1. Nessus es una magnífica aplicación para auditorías de seguridad. Tiene una versión gratuita para uso no comercial. Se basa en cliente/servidor, de modo que podemos instalar el servidor en cualquier equipo y realizar auditorías remotamente con el cliente via web que incorpora.

      Cabe mencionar que las auditorías debemos realizarlas poniéndonos en el lugar de un posible atacante. Esto es, si nuestro servidor solo funciona en una intranet, haremos la auditoría con el servidor nessus instalado en un equipo de la intranet. Si por el contrario queremos auditar nuestro equipo frente a ataques externos, el servidor nessus debe estar instalado en un equipo externo a nuestra red.

    2. OpenVAS es un fork de Nessus que se mantiene 100% libre.

    3. Seccubus automatiza los escaneos de Nessus/OpenVAS y nos informa de las diferencias respecto a escaneos anteriores. Muy útil para no tener que analizar pormenorizadamente cada nueva auditoría.

    4. Nikto es un escáner de vulnerabilidades para servidores web.

  9. La seguridad de los datos. SMART y copias de seguridad

    Nuestros datos pueden ser perdidos por un borrado accidental, por un fallo en el disco o por otras causas. Para prevenirlo nos puede ayudar SMART, pero en caso de desastre es imprescindible tener un buen sistema de copias de seguridad. Un ejemplo se puede ver en el enlace Copias de seguridad

    Monitorizar el estado del disco duro también es recomendable como seguridad preventiva. De un fallo repentino en la electrónica del disco sólo nos salva un RAID, bien hardware o por software, pero los errores en la superficie del disco suelen ser hasta cierto punto predecibles, y para ello debemos monitorizar los datos que reporta el disco duro mediante SMART.

    • Instalamos smartmontools, posteriormente lo activamos en /etc/default/smartmontools y configuramos en /etc/smartd.conf, comentando la línea que comienza con DEVICESCAN y especificando manualmente qué disco duro queremos monitorizar. En mi caso utilicé la siguiente configuración:

      
# Monitor all attributes except normalized Temperature (usually 194),
      # but track Temperature changes >= 4 Celsius, report Temperatures
      # >= 50 Celsius and changes in Raw value of Reallocated_Sector_Ct (5).
      # Send mail on SMART failures or when Temperature is >= 55 Celsius.
      # Enable automatic online data collection, automatic Attribute autosave,
      # and start a short self-test every day between 2-3am, and a long self
      # test Saturdays between 3-4am.
      /dev/sda -a -I 194 -W 5,50,55 -R 5 -o on -S on -s (S/../.././02|L/../../6/03) -m correo@midominio.com