Category Archives: seguridad

Iptables: Seguridad en servidores linux

Ser el administrador de un servidor conectado a Internet de forma permanente, ya sea sirviendo páginas web u ofreciendo cualquier otro servicio requiere de un mantenimiento continuo.  Es habitual que usuarios desde lugares remotos en la red intenten acceder a nuestro servidor ya sea por un simple reto personal como “hacker” aficionado, como forma de acceder a información restringida, bien como puerta que nos de acceso a otros sistemas, hacer que un determinado servicio deje de funcionar, etc.

Sea cual sea el motivo, lo cierto es que un administrador de sistemas debería comprobar si hay algún intento de acceso por alguna de las puertas abiertas en nuestro sistema.

Si nuestro sistema es un servidor Web, es posible que hayamos configurado el firewall para que quede abierto el puerto 80 tcp a todos los usuarios y el puerto 22 tcp (ssh) para poder acceder de forma remota. Una de las formas de comprobar si alguien está intentando entrar por alguna de estas puertas consiste en comprobar el fichero dónde se guardan los avisos de seguridad.

door_unsafe

/var/log/secure

Jun 15 03:31:08 simple sshd[22236]: Received disconnect from xxx.xxx.xxx.xxx: 11: Normal Shutdown, Thank you for playing
Jun 15 03:31:39 simple unix_chkpwd[22248]: password check failed for user (root)
Jun 15 03:31:39 simple sshd[22246]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=xxx.xxx.xxx.xxx user=root
Jun 15 03:31:41 simple sshd[22246]: Failed password for root from xxx.xxx.xxx.xxx port 16418 ssh2
Jun 15 03:31:41 simple sshd[22247]: Received disconnect from xxx.xxx.xxx.xxx: 11: Normal Shutdown, Thank you for playing
Jun 15 03:32:12 simple unix_chkpwd[22251]: password check failed for user (root)

Los mensajes indican un intento de acceso desde una máquina remota con el usuario “root”. Veamos como prevenir estos accesos de dos modos distintos: 1) impidiendo que el usuario root acceda mediante ssh y 2) añadiendo reglas al firewall que impidan accesos desde determinadas IPs.

1) Impedir que el usuario root acceda mediante ssh tiene diferentes ventajas desde el punto de vista de la seguridad. El usuario root lo encontramos en casi todos los sistema unix/linux. Si permitimos el acceso mediante ssh al usuario root estamos facilitando el trabajo a nuestros potenciales atacantes. Esto sería similar a que las puertas de todos las casas fuesen del mismo fabricante. Los ladrones ya tendrían información sobre los puntos débiles de nuestra cerradura. Pues bien, pues denegando el acceso a nuestro sistema del usuario root, el atacante tendrá que averiguar además del password, el nombre del usuario para poder acceder al sistema, lo que hará que atacantes poco expertos puedan desistir y busquen algún servidor más fácil de atacar.

[root@localhost root]# adduser pepe
[root@localhost root]# passwd pepe
Changing password for user pepe.
New password:

Una vez introducido el password dos veces debemos permitir que el nuevo usuario pueda adquirir privelegios de super usuario. En otro caso no podremos realizar tareas como administrador en el servidor. Para permitirlo editaremos el fichero /etc/sudoers. Este fichero tiene un formato especial y para su edición utilizaremos el comando visudo.

[root@localhost root]# visudo

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
pepe ALL=(ALL) ALL

Añadiremos a continuación de la linea root ALL=(ALL) ALL otra con el nombre del usuario que hará las funciones de administrador. Una vez completada la edición el sistema debería permitir ejecutar sudo su una vez que nos autentifiquemos como el usuario pepe.

Para terminar con la limitación del acceso al usuario root mediante ssh editaremos el fichero /etc/ssh/sshd_config y añadiremos la siguiente linea:

PermitRootLogin no

Reiniciamos el servidor ssh con el siguiente comando:

[root@localhost root]#  service sshd restart

2) Añadir reglas al firewall con iptables que impidan accesos desde determinadas IPs.

Para gestionar las reglas de seguridad encontramos herramientas gráficas y herramientas en modo texto como system-config-firewall-tui. Estas utilidades pueden ser de utilidad en muchos casos, pero es habitual que estar herramientas gráficas no permitan todas las opciones de edición que permite iptables. Iptables es el comando que permite gestionar todas las reglas de un firewall en los sistemas unix/linux.

system_hacked

En nuestro caso debemos poder acceder al servidor desde diferentes IPs con lo que no nos bastará con una regla que solo permita el acceso desde una IP. En cambio, una forma de proteger el sistema es crear reglas que impidan el acceso a IPs potencialmente peligrosas. Podemos añadir las Ips de aquellas máquinas que se muestran en el fichero /var/log/secure con reiterados intentos de acceso no autorizado. A continuación se muestran algunos de los comandos más comunes para añadir reglas de seguridad con iptables.

Listar las reglas definidas en iptables

iptables -L

Bloquear una IP por completo

iptables -A INPUT -s xx.xx.xx.xx -j DROP
service iptables save

Bloquear un determinado puerto a una ip

iptables -A INPUT -s xx.xx.xx.xx -p tcp --destination-port yy -j DROP

Bloquear un rango de Ips

iptables -A INPUT -s xx.xx.xx.xx/n -j DROP

En este caso n se refiere a la máscara que determina el rango de ips y podrá ser 8/16/24. En [5] encontramos una herramienta para calcular la máscara para un determinado rango.

Desbloquear una IP

iptables -D INPUT -s xx.xxx.xx.xx -j DROP
service iptables save

Por último, para eliminar todas las reglas escribiremos el comando

iptables -F

bank door

Resumiendo:

Hemos aprendido como denegar el acceso mediante ssh al usuario root y como permitir que un usuario adquiera privilegios de administrador modificando el fichero sudoers. Además hemos mostrado como añadir reglas de seguridad con el comando iptables. A modo de resumen citaremos algunas prácticas recomendables para mantener nuestro sistema seguro:

1) Comprobar con frecuencia los ficheros de log /var/log/secure y ejecutar el comando last que muestra los lugares desde dónde se produjeron los últimos accesos

2) Realizar copias de seguridad de los ficheros importantes y del sistema completo con frecuencia.

3) Comprobar que nuestro firewall está activo y que sólo deja acceso a los puertos estrictamente necesarios.

4) Comprobar que el usuario root no tiene permitido el acceso mediante ssh.

5) Realizar las actualizaciones de seguridad, preferiblemente en un servidor gemelo de forma que nos permita comprobar que las actualizaciones no afectan de forma negativa a los servicios activos.

6) Guardar las copias de seguridad en distintas localizaciones. Para esto nos puede servir, además de disponer de un disco duro de seguridad, subir una copia a servicios de alojamiento de ficheros en la nube como Amazon S3 o Dropbox.

Como conclusión, simplemente recordar que no hay sistema cien por cien seguro, sin embargo, seguir ciertas hábitos sencillos hará que nuestro sistema tenga una nivel de seguridad aceptable.

Referencias

[1] How To Edit the Sudoers File on Ubuntu and CentOS
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file-on-ubuntu-and-centos

[2] Asegurando SSH en su sistema
http://wiki.centos.org/es/HowTos/Network/SecuringSSH

[3] Linux Tutorial: Blocking IP Addresses From Your Server
http://jadendreamer.wordpress.com/2013/04/18/linux-tutorial-blocking-ip-addresses-from-your-server/

[4] How do I find a geographical location from an IP Address
http://www.iplocation.net/index.php

[5] Ip calculator
http://jodies.de/ipcalc?host=192.168.0.0&mask1=16&mask2=

[6] How to edit iptables rules
http://fedoraproject.org/wiki/How_to_edit_iptables_rules