martes, 30 de agosto de 2011

Securizando servidores (V)

Hoy descansamos un poco del DirectAdmin y volvemos con algunos consejos de seguridad. Una de las rutas de acceso más vulnerables a nuestro servidor es el /tmp y /var/tmp. ¿Y porqué? Porque aprovechan aplicaciones web mal programadas, php o perl, que les permite ejecutar código remotamente. Y desgraciadamente es uno de los problemas que más adolecen los servidores. ¿Se puede solucionar esto? Lo más efectivo sería programando bien, pero todos sabemos que eso es más dificil ya que la mayoría de las veces no hacemos el codigo, generalmente por usar wordpress, joomla, osCommerce, etc... Esto no quiere decir que no se use, simplemente que hay que tenerlo actualizado para corregir errores de éste tipo. Pero tranquilos, con este pequeño tip nos quitaremos de encima a los "hackers"*, pero si es un hacker** de verdad encontrará otra forma de entrar.

Como he comentado antes, cuando usan las vulnerabilidades del php la carpeta a la que tienen acceso es la de los temporales, que en una instalación normal es igual a las demás carpetas y pueden ejecutar lo que suban, consiguiendo por ejemplo una shell remota con la que sí tendrán acceso completo. Así que lo que tenemos que hacer es quitar los permisos de ejecución a la carpeta. Si tienes esto en consideración a la hora de instalar el servidor, puedes crear una partición de 1GB por ejemplo para asignarla a /tmp y luego quitarle los permisos en el el fstab (luego veremos cómo). Pero claro, si tenemos el servidor ya montado desde hace años (o días o horas) no podemos volver a reinstalar todo, menuda pereza. ¿Se puede hacer algo? Venga, que es Linux, que preguntas...

Por si te lo preguntabas, la respuesta es sí. Podemos crear un archivo especial y hacer que sea un disco duro (esto por ejemplo se usa también en algunas máquinas virtuales), y luego montarlo para que albergue el /tmp protegiendolo. Es bien sencillo el proceso, primero creamos el archivo:
#dd if=/dev/zero of=/tmp_partition bs=1024 count=500000
Con esto crearemos un archivo lleno de ceros y que ocupe 500MB, podemos hacerlo del tamaño que necesitemos, pero con esto suele bastar.

Lo siguiente es darle formato para poder usarlo como disco duro, en este caso usaré ext3, pero puedes usar el que prefieras:
#mkfs.ext3 /tmp_partition
Con "tune2fs -c 200 -i 200 /tmp_partition" cambiaremos la frecuencia del chequeo del disco, en este caso cada 200 días.

Para probar que está correcto, podemos montar el archivo en una carpeta cualquiera:
#mkdir dd
#mount -o loop /tmp_partition dd ***
#ls dd
Nos tendría que salir sólo la carpeta de "Lost+Found", si es así está todo correcto.Desmontamos el la carpeta con "umount dd" y listo, ya lo tenemos casi hecho, sólo nos falta editar el archivo /etc/fstab con nuestro editor favorito y añadir:
/tmp_partition /tmp ext3 loop,noexec,nosuid,rw 0 2

Para poder montar /tmp nos tenemos que asegurar de que todos los servicios que escriben en /tmp están parados. Lo normal es parar Apache, Oracle, Vmware, etc. Podemos ver si hay más ficheros en uso con "lsof -n | grep tmp". Una vez esté libre /tmp, hacemos:
#mount /tmp
#chmod 1777 /tmp
#mv /var/tmp/* /tmp
#rmdir /var/tmp
#ln -s /tmp /var/tmp

Y ya lo tenemos todo listo. Si queremos probarlo creamos un archivo en /tmp, le damos permisos de ejecución y probamos a ejecutarlo: nos dira que nones.

Me dejo para el final si teniais una partición hecha para /tmp, sería añadir (o editar la linea) en el fstab:
/dev/hdaX /tmp ext3 nosuid,noexec,nodev,rw 0 2
Y poner estos comandos:
#cd /var
#mv /var/tmp/* /tmp
#rmdir tmp
#ln -s /tmp /var/tmp

Como éxtra, vamos a quitar permisos de ejecución a algunos binarios que son los que más usan, como el wget para descargar archivos o el gcc para compilar, entre otros. Simplemente tendremos que dejar que el root los ejecute:
#chmod 0700 /usr/bin/make
#chmod 0700 /usr/bin/gcc*
#chmod 0700 /usr/bin/as86
#chmod 0700 /usr/bin/lynx
#chmod 0700 /usr/bin/wget
#chmod 0700 /usr/bin/curl
#chmod 0700 /usr/bin/nc
Hay que tener cuidado si algun script de algun usuario utiliza esos comandos, ya que no se lo permitirá. Si fuese necesario dar permisos a ese usuario para que utilice sólo los binarios necesarios.

Con esto podremos dormir un poco más tranquilos. ¡Hasta la próxima!

* Entrecomillado porque me refiero a los niños de copian el código de la web hacker de turno.
** Sin comillas porque me refiero a los que se lo ganan.
*** Si nos da error posiblemente no esté cargado el modulo loop en el kernel, toca o cargarlo con modprobe loop y si no funciona, recompilar el kernel.

Fuente de la información: http://www.ran.es

No hay comentarios:

Publicar un comentario