Seguridad básica en servidores Linux

Lo simple es lo que funciona y la seguridad de un servidor no tiene que ser complicada. Mis costumbres son sencillas y protegen de los vectores de ataques más frecuentes.

Cambia la contraseña de root

Cuando pedimos un nuevo servidor a nuestro proveedor nos envían por mail los datos del mismo junto con la contraseña en claro. ¡Cámbiala!

passwd

Actualiza el sistema

Básico en cualquier sistema operativo. ¡Actualiza!

apt-get update
apt-get upgrade

Instalación de fail2ban

Se encarga de banear IPs si se detectan actividades anómalas en accesos al server.

apt-get install fail2ban

sudo, nuevo usuario y deshabilitar el acceso ssh a root

Importante dejar al usuario root fuera de la ecuación. Trabajar con un usuario no privilegiado nos evitará sustos. Para casos en los que necesitemos privilegios elevados utilizaremos sudo (necesario añadir nuestro usuario al grupo de sudoers).

apt-get install sudo

adduser your_username
usermod -a -G sudo your_username
logout

ssh [email protected]

sudo vi /etc/ssh/sshd_config

En el archivo de configuración del servicio ssh deshabilitamos el acceso a root.

PermitRootLogin no

Usar una clave de autenticación ssh

Las SSH Key son un método más seguro de acceder al servidor. Primero hay que crear el SSH Key en la máquina desde la que queramos acceder al server.

ssh-keygen

Por defecto crea dos claves una privada y una pública.

~/.ssh/id_rsa # privada
~/.ssh/id_rsa.pub # pública

Tenemos que copiar la clave pública en nuestro servidor.

scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/id_rsa.pub

En el server verificar los permisos de la carpeta .ssh y en caso necesario modificarlos.

chown -R your_username:your_username .ssh
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

Configuración del Firewall

Importante dejar cerrar las puertas que no sean necesarias. Me gusta dejar el archivo con las reglas en /etc/.

sudo vi /etc/iptables.rules

Aquí os dejo un buen filtro de partida.

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Terminada la edición es necesario restablecer iptables con las nuevas reglas.

sudo iptables-restore < /etc/iptables.rules
sudo iptables -L # para verificar que se han cargado las reglas

Visto que iptables no conserva las reglas tras un reboot del server, es necesario crear un script que se ejecute en el arranque. Se puede editar /etc/network/interfaces o crear un nuevo script en /etc/network/if-pre-up.d/.

sudo vi /etc/network/if-pre-up.d/iptables
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules

Importante dar permisos de ejecución al script.

sudo chmod +x /etc/network/if-pre-up.d/iptables

Con estos pasos tenemos una buena base de seguridad en el servidor.