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 SÍ 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á.