¿Y tú, ya ejecutas en tu Ubuntu Server sólo los servicios que necesitas?

Imagínate que administras un Ubuntu Server 12.04 que sólo sirve documentos HTML dinámicos con la ayuda de un servidor MySQL. Tu perfil es el de un desarrollador web que no quiere complicarse la vida administrando otros servicios, por lo que delegas en un tercero el correo electrónico, el correo electrónico seguro y el DNS.

Centro de datos, servidores

En este escenario solamente necesitas un servidor web (Apache, puerto 80), un servidor de bases de datos (MySQL, puerto local 3306) y un servidor SSH (puerto 22); ¡todo lo demás va a hacer que tu máquina sea menos segura!

La instalación fresca de Ubuntu Server sin ningún panel de administración tipo Parallels Plesk suele venir sólo con SSH:

22/tcp open  ssh

Por cierto, esa es la salida de un escáner de puertos realizado con nmap:

nmap -sT localhost

Ubuntu Server 12.04 viene sin la pila LAMP, tienes que instalarla con estos comandos:

El servidor y la consola MySQL:

apt-get install mysql-server mysql-client

El servidor web Apache:

apt-get install apache2

PHP:

apt-get install php5 libapache2-mod-php5

Ten en cuenta que como se trata de una instalación fresca hay que instalar a mano las extensiones PHP que vayas a necesitar en tus proyectos.

Por ejemplo, si tu app web trabaja con imágenes y necesita la librería GD, y si se comunica con una base de datos MySQL, tienes que instalar estas extensiones manualmente:

apt-get install php5-gd php5-mysql

Recuerda que el esquema de arranque y detención de los sistemas GNU/Linux basados en Debian es del tipo System V. Los archivos de inicio se almacenan en /etc/init.d y se enlazan simbólicamente en /etc/rcX.d. Por favor, echa un vistazo a este enlace si necesitas saber más sobre este tema.

Después de instalar la pila LAMP no tienes que preocuparte de poner los symlinks de Apache en los directorios /etc/rcX.d. Cuando reinicias el sistema ya se ponen solos. Nunca está, por eso, de más, comprobar esto manualmente; puedes asegurarte de lo que digo haciendo algo así como:

ls -l /etc/rc?.d/*apache*
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc0.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc1.d/K09apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc2.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc3.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc4.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc5.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 Jun  2 10:34 /etc/rc6.d/K09apache2 -> ../init.d/apache2

Si echas un vistazo a esta salida observarás que efectivamente el sistema mata el servicio apache2 en los niveles 0, 1 y 6, y lo ejecuta en los niveles 2, 3, 4 y 5. Fíjate que en los niveles de ejecución 016 hay una K (kill) al comienzo del enlace simbólico y en los niveles de ejecución 2345 hay una S (start).

Bien, pues todo esto es para decir que cuando instalas Apache así como digo ya se va a ejecutar luego él solito cuando reinices el sistema. Esto es importante, quiero decir que está bien tener en cuenta cómo se gestiona el arranque de los nuevos servicios que instalas.

Si hubiéramos partido de un Ubuntu Server 12.04 + Parallels Plesk, habiendo seguido un camino diferente a este, donde solo instalamos lo que necesitamos, entonces hubieras tenido que quitar a mano los servicios que no necesitas con comandos de este estilo:

update-rc.d -f xinetd remove
 Removing any system startup links for /etc/init.d/xinetd ...
   /etc/rc0.d/K20xinetd
   /etc/rc1.d/K20xinetd
   /etc/rc2.d/S20xinetd
   /etc/rc3.d/S20xinetd
   /etc/rc4.d/S20xinetd
   /etc/rc5.d/S20xinetd
   /etc/rc6.d/K20xinetd

Lo anterior quita el servicio xinetd. El demonio xinetd es un súper servicio envoltorio de TCP (TCP wrapper) que controla el arranque y acceso a varios servicios de red, por ejemplo, FTP, IMAP y Telnet.

En vez de iniciarse todos esos servicios por separado durante el arranque y de estar dormidos mientras esperan solicitudes, sólo hay un demonio que los envuelve, xinetd, escuchando los puertos TCP/UDP de los servicios de red configurados en el archivo /etc/xinetd.conf.

Bueno, pues ya estamos. Espero que este post sirva para ver que siempre es importante para la seguridad de un sistema informático ejecutar sólo aquello que dicho sistema informático utiliza.

En lo que a conexiones TCP se refiere, hemos planteado un escenario donde solo hay que abrir el puerto 80 y el puerto 22; el primero es para atender las peticiones HTTP de los clientes y servir los documentos HTML correspondientes, y el segundo para poder conectarnos al servidor de forma remota, y segura, mediante SSH.

Así las cosas, dicho todo lo anterior, si ahora hacemos un escáner de puertos desde otra máquina vamos a obtener lo siguiente:

22/tcp open  ssh
80/tcp open  http

Esta salida no tiene nada que ver con su contraparte Ubuntu Server + Parallels Plesk:

21/tcp   open  ftp
22/tcp   open  ssh
25/tcp   open  smtp
53/tcp   open  domain
80/tcp   open  http
106/tcp  open  pop3pw
110/tcp  open  pop3
143/tcp  open  imap
443/tcp  open  https
465/tcp  open  smtps
993/tcp  open  imaps
995/tcp  open  pop3s
3306/tcp open  mysql
8443/tcp open  https-alt

En próximas entregas explicaré cómo añadir otra capa de seguridad a tu máquina por medio del cortafuegos iptables para permitir sólo el tráfico SSH (puerto 22) y el tráfico HTTP (puerto 80). Ten en cuenta que ahora mismo tu Ubuntu Server 12.04 no tiene definidas reglas de filtrado de paquetes:

iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination