La seguridad es uno de los puntos a los que debemos prestar mucha atención cuando ponemos un servidor en producción (es decir accesible a través de Internet), aunque no existe una receta mágina que vuelva invulnerable nuestro servidor, existen una serie de medidas básicas de seguridad que deberíamos tener en nuestro servidor para evitar los ataques más comunes y detectar algún intento de intrusión. En este post detallo una serie de medidas básicas para asegurar un servidor Ubuntu 12.04 independientemente de cual será la apliación a la cual lo destinaremos y de cual es el lugar donde lo hostearemos. Es posible tener configuraciones más seguras basados en el tipo de uso que le daremos al servidor (webapp, mail server, irc, etc.) y el data center o el servicio de nube que usemos, pero dado que las posibilidades serían infinitas, es que he decidido escribir este compendio de reglas mínimas.
Las medidas mínimas de seguridad que debemos tener en nuestro servidor son las siguientes:
- Deshabiliatar el acceso de "root" a través del protocolo SSH y cambiar el puerto por defecto.
- Instalar y configurar un Firewall (ufw es el más simple)
- Asegurar la memoria compartida. Restringir los accesos al shared memory en el /etc/fstab.
- Protegernos contra ataques de fuerza bruta.
- Permitir que el comando su sólo pueda ser usado por el grupo de administradores.
- Asegurar los parámetros de red por defecto en el sysctl.
- Instalar un software para búsqueda de rootkits.
Cómo conseguir cada uno de estos siete puntos está explicado a continuación:
Deshabiliatar el acceso de "root".
Para deshabilitar el acceso de root debemos editar el archivo "/etc/ssh/sshd_config", buscamos la línea:
PermitRootLogin yes
Y la reemplazamos por:
PermitRootLogin no
Ahora para cambiar el puerto debemos buscar esta línea:
Port 22
Y reemplazarla por esta otra línea:
Port 2233
El nuevo puerto puede ser cualquiera en principio pero debemos asegurarnos de no elegir otro que este en uso por nuestro sistema. En este caso en particual he colocado el valor "2233", pero ya queda a elección del lector escoger un puerto.
Una vez guardados los cambios, debemos reiniciar el daemon del ssh con este comando:
/etc/init.d/ssh restart
Instalar y configurar un Firewall.
El más simple y obvio de usar en Ubuntu es ufw (Uncomplicated FireWall), por defecto no está instalado asi que lo primero que debemos hacer es instalarlo:
apt-get update apt-get instal ufw
Una vez instalado debemos indicarle que puertos debe permitir acceder a las conexiones externas, para ello debemos ejecutar estos comandos:
ufw enable ufw allow 2233 ufw allow 80 ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 2233/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere (v6) 2233/tcp ALLOW Anywhere (v6)
Con nuestro Firewall habilitado y sólo permitiendo accesos a nuestro servidor web y al ssh en el puerto modificado estamos hemos concluido esta parte. Si deseamos aceptar conexiones entrantes a través de otros puestos sólo debemos hacerlo usando este comando:
ufw allow <port-number>
Donde <port-number> es el número del puerto en el cual aceptaremos conexiones.
Asegurar la memoria compartida.
Básicamente lo que debemos hacer es editar el archivo "/etc/fstab" y agregar esta línea al final del archivo:
tmpfs /dev/shm tmpfs defaults,noexec,nosuid 0 0
Protegernos contra ataques de fuerza bruta.
Para ello podemos usar ya sea denyhosts que bloquea específicamente los ataques de fuerza bruta contra ssh/telnet o fail2ban que es mucho más flexible y permite bloquer ataques de fuerza bruta contra cualquier servicio ofrecido por nuestro servidor, dado que explicar todos las opciones de configuración de fail2ban tomaría muchas líneas sólo lo mencionamos, aunque recomendamos su instalación especialmente en los casos de servidores de correo con protocolos POP3 o IMAP.
Para instalar denyhosts sólo debemos seguir estos sencillos pasos:
apt-get install denyhosts /etc/init.d/denyhosts restart
Todos los IPs usados para intentar loguearse en el servidor que no han provisto un password válido en tres intentos son listados en /etc/hosts.deny y son baneados permanentemente de acceder al puerto del ssh.
Restringir el comando "su" al grupo de administradores.
Ya nuestro servidor no permite accesos usando el usuario "root", pero si alguien adivina o roba la credencial de un usuario y accede al sistema en teoría podría ejecutar un "su -" para ganar privilegios de administrador. Es por ello que siempre es una buena práctica, especialmente cuando hay varios "usuarios" con acceso a un servidor el restringir el uso del comando "su" sólo para aquellos usuarios que pertenecen al grupo de administadores. Esto lo conseguimos a través de estos comandos:
groupadd admin usermod -a -G admindpkg-statoverride --update --add root admin 4750 /bin/su
Reemplaza
# ls -lh /bin/su -rwsr-x--- 1 root admin 31K 2010-01-26 17:09 /bin/su
Asegurar los parámetros de red por defecto.
Para hacer esto debemos editar el archivo "/etc/sysctl.conf" y agregar estas líneas:
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.conf.all.log_martians = 1
Luego de ello, debemos reiniciar los valores por defecto de las conección de red, ejecutando este comando:
sysctl -p
Básicamente lo que hemos hecho es prohibir redirección de paquetes originados fuera y bloquear el protocolo ICPM (ping). Si vamos a usar este servidor como una VPN, pues entonces no debemos aplicar las dos primeras líneas que deshabilitan el source route.
Instalar software de búsqueda de rootkits.
Las dos opciones más conocidas que tenemos aquín son rkhunter y Chkrootkit. En lo personal recomiendo rkhunter, pero se puede usar cualquiera de los dos. Lo importante es tener al menos uno de ellos y ejecutarlo con regularidad para detectar alguna intrusión en nuestro sistema. Para intalar rkhunter en Ubuntu sólo debemos ejecutar este comando:
apt-get install rkhunter
Para usar rkhunter, primero debemos actualizar su DB de vulnerabilidades conocidas con este comando:
rkhunter –update
Luego ya podemos ejecutar una búsqueda en nuestro sistema con este comando:
rkhunter –check
Espero que esta breve tutorial de las normas de seguridad básicas a tener en cuenta en un servidor de producción les haya servido y permita mejorar la seguridad de su red y de Internet como un todo.