Aucune raison d'avoir les deux / run et / tmp
Je pense que tu as raison. /tmp
est essentiellement obsolète maintenant, nous avons /run
. Si votre programme est en mesure de le faire (ce qui nécessite qu'il soit installé en tant qu'opération privilégiée), vous utiliserez alors un sous-répertoire de /run
. C'est pour des raisons de sécurité.
Par exemple, le démon d'impression CUPS ne s'exécute pas en tant que root mais est généralement installé à partir d'un package de système d'exploitation. Le paquet s'installe /usr/lib/tmpfiles.d/cups.conf
et systemd-tmpfiles
crée un répertoire auquel il peut accéder. Étant donné que le répertoire est en dessous /run
, le nom ne peut pas avoir été réclamé de manière malveillante par un utilisateur non privilégié, contrairement à /tmp
ce qui est en écriture pour le monde entier.
"Programmes non privilégiés" qui ne peuvent pas utiliser /run
directement
La vraie différence réside dans le fait que votre programme est exécuté par un utilisateur arbitraire non privilégié, sous son propre ID utilisateur. Mais vous ne voulez généralement pas utiliser /tmp
, car d’autres utilisateurs non privilégiés peuvent y accéder. Vous préférez utiliser $XDG_RUNTIME_DIR
. Généralement, ceci est implémenté comme /run/user/$(id -u)
- il se trouve qu’il s’agit également d’un sous-répertoire /run
. L'emplacement n'est pas garanti cependant; les programmes doivent toujours utiliser la variable d'environnement.
/tmp
ne serait utile que pour une coopération ad hoc entre différents utilisateurs non privilégiés du système. De tels systèmes ad-hoc sont vulnérables au refus d'un utilisateur malveillant de coopérer et de gâter tout le monde :). Un exemple serait les utilisateurs non privilégiés qui décideraient d'exécuter une version du talk
démon, en utilisant un socket Unix.
Notez que la liste de contrôle de Poettering ci-dessous indique que /tmp
cela serait utile pour les "petits fichiers", alors /run
qu'il ne devrait être utilisé que pour les "primitives de communication". Je ne pense pas que cette distinction soit vraie non plus. Le posteur pour /run
est udev
, et je suis à peu près sûr, /run/udev
inclut des bases de données internes. Une fois que vous avez un /run
répertoire, je ne pense pas que quiconque veuille suivre la distinction revendiquée et créer un autre répertoire, pour encombrer /tmp
. Donc, en pratique, nous utilisons simplement de /run
nos jours.
L'utilisation d'espaces de noms partagés en écriture [comme / tmp] à des fins de communication a toujours été problématique, car pour établir une communication, vous avez besoin de noms stables, mais des noms stables ouvrent la porte aux attaques par déni de service. Cela peut être corrigé partiellement en établissant des répertoires protégés par application pour certains services lors du démarrage initial (comme nous le faisons pour X11), mais cela ne résout que partiellement le problème, car cela ne fonctionne correctement que si chaque installation de package est suivie d'un redémarrage.
...
Une autre fonctionnalité de Fedora (pour Fedora 17) a modifié la sémantique de / tmp pour de nombreux services système afin de les rendre plus sécurisés, en isolant les espaces de noms / tmp des différents services.
...
Etant donné que / tmp n'est plus nécessairement un espace de noms partagé, il ne convient généralement pas comme emplacement pour les primitives de communication.
...
[/ run] est garanti d'être un fichier tmpfs et est donc automatiquement vidé lors du démarrage. Aucun nettoyage automatique n'est fait au-delà de cela.
...
Voici un guide approximatif sur la façon dont nous vous suggérons (développeur d'applications Linux) de choisir le bon répertoire à utiliser:
- Vous avez besoin d'un emplacement pour placer votre socket (ou une autre primitive de communication) et votre code est privilégié: utilisez un sous-répertoire sous / run. (Ou sous / var / run pour une compatibilité accrue.)
- Vous avez besoin d'un emplacement pour placer votre socket (ou une autre primitive de communication) et votre code est exécuté sans privilège: utilisez un sous-répertoire situé sous $ XDG_RUNTIME_DIR.
- Vous avez besoin d'un emplacement pour mettre vos téléchargements les plus volumineux et en cours et exécuter sans privilèges: utilisez $ XDG_DOWNLOAD_DIR.
- Vous avez besoin d'un emplacement pour placer les fichiers de cache qui doivent être persistants et s'exécuter sans privilège: utilisez $ XDG_CACHE_HOME.
- Rien de ce qui précède ne s'applique et vous devez placer un petit fichier qui ne nécessite aucune persistance: utilisez $ TMPDIR avec un repli sur / tmp. Et utilisez mkstemp (), et mkdtemp () et rien chez vous.
- Sinon, utilisez $ TMPDIR avec un repli sur / var / tmp. Utilisez également mkstemp () / mkdtemp ().
Notez que ces règles ci-dessus ne sont suggérées que par nous. Ces règles prennent en compte tout ce que nous savons sur ce sujet et évitent les problèmes liés aux distributions actuelles et futures, dans la mesure où nous pouvons les voir. Pensez à mettre à jour vos projets pour suivre ces règles, et gardez-les à l'esprit si vous écrivez un nouveau code.
Une chose sur laquelle nous voudrions insister est que / tmp et / var / tmp ne sont pas le plus souvent le bon choix pour votre cas d'utilisation. Il existe des utilisations valables de ces répertoires, mais très souvent, un autre répertoire peut en fait être le meilleur endroit. Donc, soyez prudent, considérez les autres options, mais si vous choisissez / tmp ou / var / tmp, assurez-vous au moins d’utiliser mkstemp () / mkdtemp ().
Nous nous débrouillons un peu avec le /tmp
socket hérité utilisé par le système X Window, comme décrit ci-dessus. J'ai mal lu tmpfiles.d/x11.conf
. On dirait plus que ça dépend de la coopération :). Je suppose que le code a été vérifié, de sorte que le déni de service est le pire qui puisse arriver.