Es importante asegurar lo mejor posible nuestros servidores para proteger nuestros datos de cualquier atacante. En este post explicaremos algunas medidas para aumentar un poco más la seguridad en servidores Linux.

Actualizar software y kernel periódicamente

Uno de los aspectos fundamentales para proteger cualquier sistema informático consiste en tener el software siempre actualizado, la última versión del Kernel (estable) y parches de seguridad de esta forma logramos minimizar las posibles intrusiones a través de vulnerabilidades conocidas y/o exploits públicos.

La mayoría de las distribuciones Linux cuentan con algún tipo de gestor de paquetes que simplifica esta tarea.

Advanced Packaging Tool (APT)

Gestor de paquetes que simplifica en gran medida la instalación, actualización y eliminación de programas, disponible en distribuciones Linux como Debian y Ubuntu.

Se puede realizar una actualización de todo el software instalado de esta forma:

apt-get update && apt-get upgrade

Yellow dog Updater, Modified (YUM)

Este otro gestor de paquetes está basado en RPM, originado en la distro YellowDog, y está disponible en distribuciones como Fedora, CentOS, Red Hat

Para realizar una actualización de todo el software se puede hacer de la siguiente forma:

yum updates && yum check-update


Desinstalar software y deshabilitar servicios innecesarios

Seguramente no se utilizarán todos los servicios que están funcionando en el sistema por ello es recomendable deshabilitar los servicios innecesarios ya que de esta forma reduce fácilmente la probabilidad de acceder a través de un servicio o software vulnerable.

Servicios basados en /etc/init.d

  • Iniciar servicio: /etc/init.d/NOMBRE_SERVICIO start
  • Detener servicio: /etc/init.d/NOMBRE_SERVICIO stop
  • Habilitar servicio: update-rc.d NOMBRE_SERVICIO enable
  • Deshabilitar servicio: update-rc.d NOMBRE_SERVICIO disable
  • Estado del servicio: /etc/init.d/NOMBRE_SERVICIO status

*Si se detiene un servicio pero no se deshabilita, este servicio se volverá a ejecutar al reiniciar el servidor, para evitar esto es necesario deshabilitarlo completamente.

Servicios basados en UpStart

  • Iniciar servicio: service NOMBRE_SERVICIO start
  • Detener servicio: service NOMBRE_SERVICIO stop
  • Estado del servicio: status NOMBRE_SERVICIO

*Para deshabilitar un servicio basado en UpStart, de forma que no se vuelva a ejecutar al reiniciar el sistema, es necesario editar el archivo ‘/etc/init/NOMBRE_SERVICIO’ y borrar o comentar (con #) la línea que comienza con la palabra ‘start’.


Cifrar las comunicaciones

Si nuestro servidor recoge datos de usuarios o visitantes es recomendable usar algún tipo de certificado SSL para cifrar la comunicación entre cliente y servidor.

Cerrar y bloquear puertos no usados

Al igual que los servicios, no necesitamos la mayoría de los puertos por eso se recomienda cerrar los que no se vayan a usar y filtrar los puertos abiertos a través de algún cortafuegos.

Podemos ver los puertos a la escucha con netstat o usando un escáner de puertos como nmap.

netstat -tulpn

Para bloquear un puerto se podría usar el firewall de Linux (iptables) y denegar el acceso al puerto o desactivar el servicio que lo está usando sino es necesario.

Configurar software

Secure Shell (SSH)

SSH es un protocolo seguro que utiliza cifrado en todas las comunicaciones entre equipos. SSH es seguro pero podemos configurarlo para que lo sea aún más.

El archivo de configuración de SSH normalmente se encuentra en: ‘/etc/ssh/sshd_config’. Este archivo contiene varias opciones de configuración pero nos centraremos en las más importantes.

  • Port: El puerto por defecto del servicio es el 22, es recomendable cambiarlo por otro puerto con lo que evitaríamos ataques de bots automatizados intentando acceder por fuerza bruta o mediante algún tipo de vulnerabilidad. Aunque existen herramientas que permiten escanear puertos y se podría localizar el puerto usado pero al menos se le complicará un poco más al atacante y se evitarán escaneos automatizados.
  • Protocol 2: Existen dos versiones del protocolo de SSH. La versión 1 está en desuso pero todavía se utiliza por temas de compatibilidad y contiene varias vulnerabilidades conocidas con lo cual está totalmente desaconsejada. Se recomienda usar sólo la versión 2 del protocolo.
  • PermitRootLogin no: Practicamente todos los sistemas crean por defecto al usuario root y muchos atacantes intentan acceder usando este usuario y crackeando la contraseña por fuerza bruta o de alguna otra forma. Al desactivar el inicio root, este usuario no podrá iniciar sesión en SSH. Es recomendable crear otro usuario sin permisos root para permitirle acceso vía SSH y si necesitamos realizar alguna tarea como root se puede usar ‘su’ o ‘sudo’ para obtener premisos root.
  • MaxAuthTries 5: Es recomendable limitar la cantidad de veces que se puede ingresar un usuario y/o contraseña incorrecta. Al exceder el número de veces permitidas la conexión se cerrará, aunque podemos volver a intentarlo volviendo a conectar, y con esta medida se evitarán ataques persistentes y el ataque será mucho más lento.
  • LoginGraceTime 30: Podemos configurar los segundos disponibles para ingresar el usuario y contraseña, si se excede el tiempo la conexión se cerrará.
  • MaxStartups 3: Limitamos la cantidad de conexiones simultáneas de intento de acceso (login) por dirección IP. Existen ataques divididos en varios equipos con el objetivo de acelerar el ataque y de esta forma evitaríamos esto.

*Para que los cambios tengan efecto es necesario reiniciar el servicio con ‘/etc/init.d/ssh restart’ ó ‘service ssh restart’.

File Transfer Protocol (FTP)

Uno de los servidores FTP más utilizados es ‘proFTPd’ y por defecto dispone de varias opciones nada recomendadas como mostrar la versión utilizada ya que con esta información un atacante podría buscar algún exploit conocido para la versión usada.

El archivo de configuración normalmente se encuentra en: ‘/etc/proftpd.conf’. Mejoraremos algunas opciones de configuración.

  • ServerName “NOMBRE”: Podemos personalizar el nombre que el servidor FTP mostrará al conectarnos, por defecto seria “proFTPdD Server”. Es recomendable cambiar el nombre para dificultar, a un posible atacante, la búsqueda de vulnerabilidades.
  • ServerIdent Off: Por defecto al conectar a un sevidor proftpd nos muestra la versión usada. Se recomienda desactivar esta directiva para ocultar esta información.

*Para que los cambios tengan efecto es necesario reiniciar el servicio con ‘/etc/init.d/proftpd restart’ ó ‘service proftpd restart’ (si usamos Parallels Plesk sería ‘/etc/init.d/xinetd restart’ ó ‘service xinetd restart’).

Apache

Apache es uno de los servidores web más utilizados en todo el mundo y por tanto el más atacado. Se pueden configurar varias directivas en su archivo de configuración para protegerlo. El archivo de configuración se encuentra en: ‘/etc/httpd/conf/httpd.conf’.

  • ServerTokens Prod: Usando esta directiva evitamos que Apache muestre información innesesaria como su versión o la versión de PHP. Por defecto estaría establecida en ‘Full’ y mostraría algo así en las cabeceras HTTP:
  • Server: Apache/2.2.15 (Unix) PHP/4.2.2 Mod/1.2

  • ServerSignature Off: Esta opción está activada por defecto y muestra el nombre del servidor, la versión, el host virtual, el mail del administrador en los mensajes de error producidos. Es recomendable desactivar esta opción para ocultar está información ya que un atacante podría usarla a su favor para por ejemplo búscando vulnerabilidades en la versión de Apache usada o enviando archivos maliciosos al administrador por correo electrónico.

*Para que los cambios tengan efecto es necesario reiniciar el servicio con ‘/etc/init.d/apache2 restart’ ó ‘service apache2 restart’.

MySQL

MySQL es un potente motor de bases de datos que suele usarse en conjunto con páginas web desarrolladas en PHP.

  • skip-networking: Por defecto MySQL permite conexiones desde fuera usando el puerto 3306, pero en la gran mayoría de sistemas sólo se necesita conectar desde dentro del servidor con lo cual es un gran agujero de seguridad permitir que se pueda acceder a la base de datos desde conexiones remotas ya que se podría realizar un ataque por fuerza bruta hasta lograr acceder a la base de datos. Estableciendo esta directiva se desactiva el puerto para las conexiones remotas.

*Para que los cambios tengan efecto es necesario reiniciar el servicio con ‘/etc/init.d/mysql restart’ ó ‘service mysql restart’.

Bind

La mayoría de los servidores Linux usan Bind como servidor DNS, por defecto es bastante seguro pero podemos mejorarlo. Su archivo de configuración se encuentra aquí: ‘/etc/named.conf’.

  • version “BIND”: Dentro del archivo de configuración podemos configurar la versión que se mostrará, podemos indicar ‘none’ o el valor que queramos, es recomendable no mostrar la versión de Bind al igual que cualquier otro software.

*Para que los cambios tengan efecto es necesario reiniciar el servicio con ‘/etc/init.d/bind9 restart’ ó ‘service bind9 restart’ (también se puede llamar named en lugar de bind9).


Registros de accesos

Una de las tareas más importantes para mantener la seguridad de un servidor consiste en revisar los registros (logs) con cierta frecuencia para detectar si se intentó acceder o explotar algún servicio activo. Si disponemos de otro servidor se recomendaría enviar los registros a través SysLog ya que si se llegará a comprometer un servidor y el atacante elimina los registros podríamos revisarlos igualmente en el otro servidor que no fue comprometido.

Archivos de registros, ubicados en ‘/var/log/’:

  • messages: Registro del sistema.
  • kern.log: Registro del kernel.
  • cron.log: Registro del demonio crond.
  • maillog: Registro del servidor de correo del sistema.
  • boot.log: Registro del arranque del sistema.
  • mysqld.log: Registro de la bases de datos MySQL.
  • secure: Registro de autenticación (Red Hat, Fedora, CentOS).
  • auth.log: Registro de autenticación (Debian, Ubuntu, Linux Mint).
  • utmp ó wtmp: Registro de inicio de sesión.

Otras medidas de seguridad

Desactivar .bash_history

rm ~/.bash_history   # Eliminar historial del disco duro
history -c   # Borrar el historial almacenado en la memoria RAM
export HISTFILESIZE=0
export HISTSIZE=0
unset HISTFILE

Otra opción posible es:

rm ~/.bash_history   # Eliminar historial del disco duro
ln /dev/null ~/.bash_history -sf   # Crear enlace simbólico del archivo de historial hacia NULL

*Es necesario cerrar la sesión y volver a iniciar sesión para que los cambios tengan efecto.