Securizando el directorio /tmp en linux

Todos los sistemas necesitan carpetas temporales donde cualquier usuario pueda leer y escribir, PERO esas carpetas no deberían permitir la ejecución de programas o scripts. Securizando el directorio temporal /tmp evitaremos muchos hacks y ataques que se basan en poder arrancar programas en este directorio. Los “malos” podrán seguir escribiendo archivos en la carpeta, pero no podrán ejecutarlos. Securizar este directorio es probablemente una de las cosas más sencillas pero importantes a realizar en la securización de un servidor.

Este artículo es un remake (con añadidos y reorganizaciones) del realizado en inglés por eth00 en la dirección http://eth0.us

Dos consideraciones:

1. Algunos scripts de automatización de actualizaciones -como UPDATESCRIPT-o la instalación de ciertas aplicaciones pueden depender de que se permita la ejecución en /tmp, así que después de realizar esto, es posible que en el futuro necesites revertir temporalmente los cambios.

2. Conozco y utilizo algunos scripts de “securización automática de /tmp” como ELS de ServerMonkeys. Sin embargo viene muy bien comprender cómo funciona el proceso de securización internamente, porque en servidores con particiones personalizadas y más de un disco duro, estos scripts pueden no funcionar correctamente. A mí me sirvió de mucha ayuda conocer estos pasos porque así puede deshacer un terrible entuerto que me sucedió en un servidor personalizado como el que comentaba.

 

PASO A PASO

1) ¿ Tengo una partición para el directorio /tmp ?

# df -h |grep tmp

Si lo de arriba no muestra nada, entonces NO tienes una partición para /tmp, y puedes saltar al paso 5 para crearla.

Si el comando anterior mostró tu partición para /tmp, entonces necesitas comprobar si está montada con la opción ‘noexec’:

2) Tengo una partición para /tmp, comprobar si es ‘noexec’

# cat /etc/fstab |grep tmp

Si aparece una línea con ‘noexec’ como opción para /tmp, entonces es OK y podemos saltar al paso 6.

Si no, continúa con el paso 3 para editar el archivo /etc/fstab:

3) Editando /etc/fstab para hacer /tmp ‘noexec’

Añadir ‘noexec’ y ‘nosuid’  después de la opción ‘defaults’… Un ejemplo sería:

LABEL=/tmp     /tmp      ext3    defaults,noexec,nosuid,noatime   1 2

4) Aplicando los cambios SIN reiniciar y evitando el error ‘device busy’:

# mount -oremount /tmp

Comprueba que los cambios son efectivos:

# cat /proc/mounts |grep tmp

Ya que SÍ tienes una partición para /tmp, SÁLTATE el paso 5 y ve directamente al paso 6

5) Si NO tienes una partición TMP, crea una:

Esto crea una partición de más o menos 800 MB:

# cd /dev/; dd if=/dev/zero of=tmpMnt bs=1024 count=800000
800000+0 records in
800000+0 records out

Formatear la nueva partición

# mkfs.ext2 /dev/tmpMnt

Cuando pregunte sobre no ser un ‘block special device’, contesta que Sí (pulsar Y).

Hagamos una copia de los datos antiguos en /tmp:

# cp -Rp /tmp /tmp_backup

Montar el filesystem temporal que acabamos de crear:

# mount -o loop,noexec,nosuid,rw /dev/tmpMnt /tmp

Establece los permisos:

# chmod 0777 /tmp

Copiamos de vuelta los viejos archivos que guardamos:

# cp -Rp /tmp_backup/* /tmp/

Una vez que hayas hecho esto, puedes probar de reiniciar la mysql y ver si todo va bien. Hacemos esto porque mysql coloca el archivo mysql.sock en /tmp, el cual tiene que moverse. Si no, mysql puede tener problemas al arrancar.

Añade lo siguiente a /etc/fstab para que se monte automáticamente, al final:

/dev/tmpMnt /tmp ext2 loop,noexec,nosuid,rw 0 0

Comprueba que todo siga funcionando bien. Si es así, podemos eliminar la copia que realizamos en /tmp_backup

# rm -rf /tmp_backup

6) Vamos a securizar /dev/shm

En /etc/fstab, busca la línea de “montaje” para /dev/shm y cámbiala para que sea como la que sigue:

none /dev/shm tmpfs noexec,nosuid 0 0

Finalmente desmonta y monta /dev/shm para que los cambios surtan efecto:

# umount /dev/shm
# mount /dev/shm

7) Vamos a borrar la vieja /var/tmp y crear un link a /tmp

Es decir, de forma que /var/tmp -> apunte a -> /tmp/

# rm -rf /var/tmp/
# ln -s /tmp/ /var/

Así que:

# ls -la /var/

nos muestra:

lrwxrwxrwx   1 root     root         5 Jan 19 13:03 tmp -> /tmp/

Y ya está.

Esta entrada fue publicada en Linux, Servidores y etiquetada , , , . Guarda el enlace permanente.

Deja un comentario