Securizando un VPS

Hace ya tiempo que busqué y alquilé el VPS (Virtual Private Server) más barato que pude encontrar, animado por dabo, que mantenía (y con razón) que por unos euros al mes tienes un juguete con el mantenerte bastante en forma en esto del sysadmining. Tras darle muchos usos, alguno incluso para el que no estaba preparado y no podía con ellos, se quedó con un apache2 y un par de blogs en wordpress durante el último año. Pero he decidio hacer de él un servidor de provecho y eso pasa por una reinstalación (aka limpieza) y configuración.

Ésta es una guía no exhaustiva de los pasos que sigo para dejar el servidor un poco más seguro tras la instalación.

1. Reinstalar el VPS

Desde el panel de control del VPS (al menos en mi caso), elijo una Debian GNU/Linux 8 de 64 bits y le digo que si, que estoy seguro de que se puede cargar el servidor y reinstalar. Al cabo de unos minutos asigno una nueva contraseña de root y me conecto por ssh.

2. Cerrar puertos abiertos (de más)

Ejecuto netstat -pta y detengo todos aquellos servicios que no sean ssh. En este caso, apache2 y postfix. En alguna ocasión me he encontrado con un montón de servicios instalados y funcionando, algunos de ellos inseguros por definición, así que antes de seguir, cerrojo.

3. Borrado de paquetes

Igual que con los servicios funcionando (o precisamente por eso), hay bastantes paquetes que a mi juicio sobran y que desinstalo por real decreto. Y si, algunos de los paquetes que elimino los instalaré más tarde pero será bajo demanda, porque decido instalar el servicio y configurarlo y no porque tenga que venir preinstalado. Llamadme exagerao pero, en un VPS donde no puedes instalar un escritorio, ¿para qué hacen falta fuentes truetype?

En esta ocasión, partí de una lista total de 380 paquetes y los reduje hasta los 290. La lista la genero mediante el comando:

dpkg -l | grep ^ii > lista_paqs

Normalmente, en otra pestaña del terminal abro otra sesión ssh y creo un alias para que sólo sea copiar y pegar nombres de paquetes.

alias k='aptitude purge'

La lista de paquetes eliminados es:

apache2 apache2-data apache2-mpm-prefork apache2-utils apache2 apache2-data apache2-mpm-prefork apache2-utils apache2-bin apache2-doc bind9 bind9-host bind9utils postfix bsd-mailx bsdmainutils man-db cifs-utils cpio ed expat fetchmail finger fontconfig-config fontconfig ftp info install-info isc-dhcp-client isc-dhcp-common ldap-utils lynx lynx-cur m4 make makedev man-db manpages memtester mime-support mlocate net-tools odbcinst odbcinst1debian2:amd64 unixodbc patch postfix python quota samba samba-common samba-common-bin samba-dsdb-modules samba-libs:amd64 python-samba sasl2-bin sharutils wide-dhcpv6-client snmp syslinux tcpdump tcsh telnet tdb-tools tofrodos traceroute xinetd

Y para eliminar varios paquetes que empiezan por el mismo nombre, como las fuentes, unas cuantas tuberías y listo.

dpkg -l fonts* | grep ^ii | awk '{print $2}' | xargs aptitude purge -y
dpkg -l ttf* | grep ^ii | awk '{print $2}' | xargs aptitude purge -y
dpkg -l gcc* | grep ^ii | awk '{print $2}' | xargs aptitude purge -y

4. Creación y configuración de un usuario

Lo de conectarse como rootnunca ha sido una opción así que una de las primeras acciones es crear un usuario con el que conectarse.

adduser diego

No voy a explicar porqué debe usarse sudo porque, como decía un profe en la universidad «es de sentido común».

aptitude install sudo
adduser diego sudo
chmod -R 700 /home/diego

5. SSH

Si ejecutamos nmap sobre sobre el propio servidor descubriremos que ssh es un chivato de cuidado.

diego@tola:~$ sudo nmap -sS -sV -P0 123.456.789 | grep ssh
22/tcp  open  ssh      OpenSSH 6.7p1 Debian 5+deb8u1 (protocol 2.0)

Así que para vamos a pedirle que de menos información y a evitar que root pueda iniciar sesión a través de este protocolo.

sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
echo 'DebianBanner no' >> /etc/ssh/sshd_config
/etc/init.d/ssh restart

Ahora estará un poco más callado :).

diego@tola:~$ sudo nmap -sS -sV -P0 123.456.789 | grep ssh
22/tcp  open  ssh      OpenSSH 6.7p1 (protocol 2.0)

6. NTP

El VPN que estoy configurando está situado en la costa oeste americana a siete horas de diferencia y eso puede (y lo hace, vaya si lo hace) complicar bastante las cosas. Así que se impone el ajuste de la zona horaria y la instalación de un servidor de hora.

$ date
mar mar 15 18:36:25 EDT 2016
$ sudo dpkg-reconfigure tzdata
$ sudo aptitude install ntp
$ sudo /etc/init.d/ntp restart

7. Securización extra

1. portsentry

No está de más tener un perro guardian que vigile todos los recovecos de la casa y eso precisamente hace portsentry. Audita los puertos inactivos del sistema en busca de actividad e informa si la encuentra donde no debe.

sudo aptitude install portsentry
sudo /etc/init.d/portsentry restart

Si ejecutamos un netstat -pta veremos que hay servicios que antes no estaban y que ni tan siquiera están instalados, como finger.

2. logwatch

Un estupendo servicio que lee los logs del sistema y nos avisa en caso de que algo no le cuadre. Es un poco pesado en la configuración pero merece mucho la pena. Unas excelentes guías para la configuración de logcheck son las de Un pingüino en mi ascensor: Vigilando los logs con logcheck (I) y Vigilando los logs con logcheck (II).

sudo aptitude install logcheck

3. maldet

maldet es un software muy interesante que escanea en busca de malware, se actualiza automáticamente y emite unos informes con todos los cambios que encuentra y que pueden ser de interés. No tiene paquete debian por lo que se descarga e instala.

wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
sudo tar xvfz maldetect-current.tar.gz -C /usr/local
sudo /usr/local/maldetect-1.5/install.sh
sudo rm -r /usr/local/maldetect-1.5

En este punto tenemos un directorio, /usr/local/maldetect con el software instalado, por eso se borra el directorio de instalación en la última línea.

Lo configuramos y ejecutamos.

sudo vi /usr/local/maldetect/conf.maldet
sudo sed -i 's/email_addr="[email protected]"/email_addr="[email protected]"/g' /usr/local/maldetect/conf.maldet
sudo /usr/local/maldetect/maldet -a

4. iptables (o ufw)

A estas alturas un firewall resulta imprescindible, ya estés configurando un servidor en el otro lado del mundo o una raspberry pi para tu red local. De hecho, es más importante en el caso de la raspi porque el servidor está protegido por la empresa que te lo alquila. Haz la prueba, instala ufw en tu raspi y échale un ojo a los logs, te garantizo que querrás llorar. Si iptables te asusta (a mí me pasó durante un tiempo), instala ufw que es su cara amable y de lenguaje llano. Si no te asusta, usálo a discrección porque es uno de esos programas sin los que linux estaría cojo.

Aquí dejo el script con las reglas para ufw que uso en una de mis raspberries.

#!/bin/bash

# script con las reglas del firewall para raspberry pi
# Diego Martínez Castañeda

sudo ufw allow 22           # ssh
sudo ufw allow 53           # dns
#sudo ufw allow 25         # smtp
#sudo ufw allow 110            # pop3
#sudo ufw allow 80/tcp     # http
#sudo ufw allow 443/tcp        # https
sudo ufw allow 9090/tcp     # transmission

# por defecto, denegar
sudo ufw default deny

# listar reglas de forma numerada
sudo ufw status numbered

exit 0

Y hasta aquí, la configuración básica. Obviamente se complica cuando instalamos algún servicio porque hay que habilitarlo en el firewall, configurarlo adecuadamente y ajustar algunas cosas más. Pero esa es la magia de este juego al que es difícil cansarse de jugar.

11 ideas sobre “Securizando un VPS”

Los comentarios están cerrados.

Sentimos molestarte con lo de las Cookies, pero es por imperativo legal. Puedes ver aquí la Política de Cookies, si continúas navegando te informo que la estás aceptando ;)    Ver
Privacidad