Où les programmes de l'espace utilisateur sont-ils censés enregistrer leurs journaux?

23

J'écris un script que je veux exécuter sans privilèges. Je veux que les erreurs rencontrées par le script soient enregistrées dans un fichier journal. Je n'ai pas le privilège d'en écrire un /var/log. Et je ne veux pas en avoir un dans mon répertoire personnel.

Existe-t-il un emplacement où les scripts de l'espace utilisateur peuvent enregistrer des informations d'exécution? Quelle est la meilleure pratique pour avoir mes informations de journal de script /var/logsans créer de problèmes de sécurité potentiels? J'hésite à définir uid / gid sur le script.

Lord Loh.
la source

Réponses:

8

Vous ne pouvez pas écrire dans / var / log en tant qu'utilisateur normal, mais le démon syslog le fera pour vous si vous le demandez. Si vous souhaitez enregistrer des messages dans les journaux système standard (par exemple /var/log/syslog), l'utilitaire 4.4BSD loggerpeut être disponible sur votre système. Il est installé par défaut sur Debian et se trouve dans le bsdutilspaquet sur les dérivés Debian.

Vous bénéficierez de tout outil de rotation, de maintenance et de surveillance des journaux préexistant, avec l'inconvénient d'avoir besoin de privilèges pour lire les journaux système et de mélanger les messages de votre script avec les messages d'autres programmes.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Plusieurs options de configuration sont disponibles; vous pouvez en lire plus dans man logger.

Jander
la source
existe-t-il des liaisons linguistiques pour cet utilitaire? Je préfère ne pas générer de sous-processus pour chaque ligne de stdout in-app.
ThorSummoner
@ThorSummoner: Comme le dit la réponse de Gilles, syslogest une routine de bibliothèque C, et C ++ peut appeler n'importe quel C en utilisant extern "C". D'autres langages fournissent souvent soit une liaison générique à quelque chose de C, soit des liaisons à des choses spécifiques, mais cela dépend de la langue.
dave_thompson_085
12

Si vous, en tant qu'utilisateur ordinaire, décidez d'exécuter un programme, l'emplacement naturel de ses journaux se trouve dans votre répertoire personnel. Votre répertoire personnel vous permet de stocker tous vos fichiers, qu'il s'agisse de journaux d'un programme que vous exécutez ou de toute autre chose.

Si le programme est exécuté dans le cadre du système, s'exécutant en tant qu'utilisateur système généralement dédié, alors l'emplacement naturel de ses journaux est /var/log . Créez un sous /var/log/myapp- répertoire et donnez-lui les autorisations appropriées pour que votre application puisse y écrire.

Si cela est pertinent et que votre système d'exploitation le permet, marquez le fichier journal comme ajouté uniquement. Seul root peut le faire. Cela a l'avantage que si votre application est compromise, elle ne pourra pas effacer les journaux précédents, ce qui peut être très utile pour l'analyse judiciaire du compromis. Vous aurez besoin de l'intervention de root pour faire pivoter le journal:chown afin que le fichier journal ne puisse plus être ouvert par l'application, renamele fichier journal, créez un nouveau fichier à ajouter uniquement avec la propriété appropriée, puis informez l'application d'ouvrir le nouveau fichier vide .

Vous pouvez créer n'importe quel journal d'application dans les journaux système en appelant logger(1)ou syslog(3).

Gilles 'SO- arrête d'être méchant'
la source
4

En règle générale, pour un démon, le fichier journal est créé, rootpuis les autorisations sont modifiées afin que l'utilisateur non privilégié puisse y écrire. logrotateest ensuite configuré pour conserver les autorisations lors de la rotation.

S'il s'agit d'une commande, et non d'un démon, connectez-vous à /tmp(en utilisant de préférence mktemp) et informez l'utilisateur par STDOUToù le journal est allé.

bahamat
la source
Bonne idée. J'ai quelques lignes dans mon ~ / .profile qui vérifie si le démon dropbox est en cours d'exécution et le démarre si ce n'est pas le cas. J'envisageais d'ajouter un &pour éviter de retarder l'invite, mais démarrer dropbox écrit sur la console. Je redirige actuellement sa sortie vers /dev/null, mais j'aimerais avoir un moyen de déboguer si dropbox ne démarre pas.
Lord Loh.
1
Découvrez daemonize.
bahamat
Juste pour savoir, "les autorisations sont modifiées afin que l'utilisateur non privilégié puisse y écrire." est-ce fait simplement par chmod 666? ou dois-je ajouter un utilisateur à un groupe ou quelque chose comme ça?
Lord Loh.
Mieux sous / var / tmp, / tmp n'est pas garanti pour survivre à un démarrage.
vonbrand
@LordLoh .: Oui, avec chmod. Habituellement, 0644ou 0664et la propriété de l'utilisateur / groupe est également remplacée par celle du démon qui devrait y écrire.
bahamat
3

J'ai l'impression que les programmes de l'espace utilisateur sont censés supprimer les journaux par défaut. J'ai vu divers programmes vider les journaux où bon leur semble, et ce n'est jamais particulièrement bienvenu sur mes systèmes; tendance à s'accumuler dans un endroit qui n'est jamais remarqué à moins que / jusqu'à ce qu'il devienne énorme.

Je préférerais qu'il y ait une place précise pour eux, je joue sur mon système en essayant de leur trouver une place stable.

Ma première idée a été d'utiliser /var/run/user/$UID/log, mais j'ai trouvé que sur mon système, c'est un montage TMPFS, pas assez grand ou vraiment bon pour une utilisation avec des journaux.

Créez une place pour eux

Comme je ne comprends pas assez bien / var / run / user pour l'intégrer, j'ai choisi de l'émuler à la main, pour l'utilisateur 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Je recommanderais de m'en tenir au SPC FHS / var / log pour la structure dans ce dossier, mais la spécification de forme libre donc il n'y a pas grand-chose à respecter.

Logrotate Config

Il n'y a aucune rotation de journal existante sur ce répertoire fourni par votre système, je recommande d'en créer un pour votre système:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Ci-dessous mon précédent / var / run / user / 1000 / log post, je ne peux pas le recommander à moins que vous sachiez vraiment ce que vous faites (et si vous le faites, dites-moi comment le faire aussi!)

peut-être comme suit, mais je viens de l'inventer parce que cela avait du sens pour moi.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Intégration avec / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

ThorSummoner
la source