No hay razón para tener tanto / run como / tmp
Creo que tienes razón. /tmp
Es esencialmente obsoleto ahora tenemos /run
. Si su programa está en condiciones de hacerlo (lo que requiere que se haya instalado como una operación privilegiada), entonces hoy en día usaría un subdirectorio de /run
. Esto es por razones de seguridad.
Por ejemplo, el demonio de impresión CUPS no se ejecuta como root, pero generalmente se instala desde un paquete del sistema operativo. El paquete se instala /usr/lib/tmpfiles.d/cups.conf
y systemd-tmpfiles
crea un directorio al que puede acceder. Dado que el directorio está debajo /run
, el nombre no puede haber sido reclamado maliciosamente por un usuario sin privilegios, a diferencia de lo /tmp
que se puede escribir en el mundo.
"Programas sin privilegios" que no se pueden usar /run
directamente
La verdadera distinción es si su programa está siendo ejecutado por un usuario arbitrario sin privilegios, bajo su propia identificación de usuario. Pero, en general, aún no desea usarlo /tmp
, ya que otros usuarios sin privilegios pueden acceder a él. Prefieres usar $XDG_RUNTIME_DIR
. Por lo general, esto se implementa como /run/user/$(id -u)
, por lo que resulta ser un subdirectorio /run
también. Sin embargo, la ubicación no está garantizada; Los programas siempre deben usar la variable de entorno.
/tmp
solo sería útil para la cooperación ad-hoc entre diferentes usuarios sin privilegios en el sistema. Dichos sistemas ad-hoc son vulnerables a que un usuario malintencionado se niegue a cooperar y estropee las cosas para todos :). Un ejemplo serían los usuarios no privilegiados que deciden ejecutar una versión del talk
demonio, utilizando un socket Unix.
Tenga en cuenta que la lista de verificación de Poettering a continuación afirmaba que /tmp
sería útil para "archivos pequeños", mientras /run
que solo debería usarse para "primitivas de comunicación". Tampoco creo que esta distinción sea cierta. El chico del cartel /run
es udev
, y estoy bastante seguro de que /run/udev
incluye bases de datos internas. Una vez que tenga un /run
directorio, no creo que nadie quiera seguir la distinción reclamada y crear otro directorio, para desordenar /tmp
. Entonces, en la práctica, solo usamos /run
hoy en día.
El uso de espacios de nombres compartidos en todo el mundo [like / tmp] para fines de comunicación siempre ha sido problemático, ya que para establecer la comunicación se necesitan nombres estables, pero los nombres estables abren las puertas a los ataques DoS. Esto puede corregirse parcialmente, mediante el establecimiento de directorios protegidos por aplicación para ciertos servicios durante el inicio temprano (como lo hacemos para X11), pero esto solo soluciona el problema parcialmente, ya que esto solo funciona correctamente si cada instalación de paquete es seguida por un reinicio.
...
Otra característica de Fedora (para Fedora 17) cambió la semántica de / tmp para muchos servicios del sistema para hacerlos más seguros, al aislar los espacios de nombres / tmp de los diversos servicios
...
Debido a que / tmp ya no es necesariamente un espacio de nombres compartido, generalmente no es adecuado como ubicación para las primitivas de comunicación.
...
[/ run] se garantiza que es un tmpfs y, por lo tanto, se descarga automáticamente en las botas. No se realiza una limpieza automática más allá de eso.
...
Aquí hay una guía aproximada de cómo le sugerimos (un desarrollador de aplicaciones de Linux) que elija el directorio correcto para usar:
- Necesita un lugar para colocar su socket (u otra primitiva de comunicación) y su código se ejecuta con privilegios: use un subdirectorio debajo de / run. (O debajo de / var / run para una compatibilidad adicional).
- Necesita un lugar para colocar su socket (u otra primitiva de comunicación) y su código se ejecuta sin privilegios: use un subdirectorio debajo de $ XDG_RUNTIME_DIR.
- Necesita un lugar para poner sus descargas y descargas más grandes en progreso y ejecutar sin privilegios: use $ XDG_DOWNLOAD_DIR.
- Necesita un lugar para colocar los archivos de caché que deben ser persistentes y ejecutarse sin privilegios: use $ XDG_CACHE_HOME.
- No se aplica nada de lo anterior y debe colocar un archivo pequeño que no necesite persistencia: use $ TMPDIR con un respaldo en / tmp. Y use mkstemp () y mkdtemp () y nada de cosecha propia.
- De lo contrario, use $ TMPDIR con un respaldo en / var / tmp. También use mkstemp () / mkdtemp ().
Tenga en cuenta que estas reglas anteriores solo son sugeridas por nosotros. Estas reglas tienen en cuenta todo lo que sabemos sobre este tema y evitan problemas con las distribuciones actuales y futuras, por lo que podemos ver. Considere actualizar sus proyectos para seguir estas reglas, y téngalos en cuenta si escribe un código nuevo.
Una cosa que nos gustaría enfatizar es que / tmp y / var / tmp en la mayoría de los casos no son la opción correcta para su caso de uso. Hay usos válidos de estos directorios, pero a menudo otro directorio podría ser el mejor lugar. Por lo tanto, tenga cuidado, considere las otras opciones, pero si elige / tmp o / var / tmp, al menos asegúrese de usar mkstemp () / mkdtemp ().
De alguna manera nos salimos con el /tmp
socket heredado utilizado por el sistema de ventanas X, como se describió anteriormente. Yo leí mal tmpfiles.d/x11.conf
. Parece más que depende de la cooperación :). Supongo que el código ha sido auditado, de modo que la denegación de servicio es lo peor que puede suceder.