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.