Dove si suppone che i programmi userspace salvino i loro registri?


23

Sto scrivendo una sceneggiatura che voglio eseguire senza privilegi. Voglio che gli errori rilevati dallo script vengano registrati in alcuni file di registro. Non ho i privilegi per scriverne uno /var/log. E non voglio averne uno nella mia home directory.

Esiste una posizione in cui gli script di userspace possono registrare le informazioni di runtime? Qual è la migliore pratica per avere le informazioni del mio registro degli script /var/logsenza creare potenziali problemi di sicurezza? Sono titubante a impostare uid / gid sulla sceneggiatura.

Risposte:


8

Non puoi scrivere su / var / log come un normale utente, ma il demone syslog lo farà per te se lo chiedi. Se desideri registrare i messaggi nei registri di sistema standard (ad es. /var/log/syslog), L'utilità 4.4BSD loggerpotrebbe essere disponibile sul tuo sistema. È installato di default su Debian ed è nel bsdutilspacchetto su derivati ​​Debian.

Avrai il vantaggio di strumenti di rotazione, manutenzione e monitoraggio dei log preesistenti, con lo svantaggio di avere bisogno dei privilegi per leggere i log di sistema e di mescolare i messaggi del tuo script con quelli di altri programmi.

$ 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

Sono disponibili diverse opzioni di configurazione; puoi leggere di più in man logger.


ci sono collegamenti linguistici per questa utility? Preferirei non generare sottoprocessi per ogni riga di stdout in-app.
ThorSummoner,

@ThorSummoner: come dice la risposta di Gilles, syslogè una routine di libreria C e C ++ può chiamare qualsiasi C usando extern "C". Altre lingue spesso forniscono un legame generico a qualsiasi cosa C, o collegamenti a cose specifiche, ma dipende dalla lingua.
dave_thompson_085,

12

Se l'utente normale decide di eseguire un programma, il luogo naturale per i suoi registri si trova nella directory home. La tua home directory è pensata per te per archiviare tutti i tuoi file, siano essi registri di un programma che esegui o altro.

Se il programma viene eseguito come parte del sistema, in esecuzione come utente di sistema in genere dedicato, si trova il luogo naturale per i suoi registri /var/log. Crea una sottodirectory /var/log/myappe assegnagli le autorizzazioni appropriate in modo che la tua applicazione possa scrivere lì.

Se pertinente e il sistema operativo lo consente, contrassegnare il file di registro come solo append. Solo root può farlo. Questo ha il vantaggio che se l'applicazione è compromessa, non sarà in grado di cancellare i registri passati, il che può essere molto utile per l'analisi forense del compromesso. Sarà necessario l'intervento di root per ruotare il registro: in chownmodo che il file di registro non possa più essere aperto dall'applicazione, renameil file di registro, creare un nuovo file di sola aggiunta con proprietà appropriata, quindi notificare all'applicazione di aprire il nuovo file vuoto .

È possibile effettuare qualsiasi registro dell'applicazione nei registri di sistema chiamando logger(1)o syslog(3).


4

Generalmente per un demone il file di registro viene creato da rootallora le autorizzazioni vengono modificate in modo che l'utente non privilegiato possa scrivergli. logrotateviene quindi impostato per conservare le autorizzazioni durante la rotazione.

Se è un comando, non un demone, accedi a /tmp(preferibilmente usando mktemp) e informa l'utente tramite STDOUTdove è andato il registro.


Buona idea. Ho alcune righe nel mio ~ / .profile che controlla se il demone dropbox è in esecuzione e lo avvia se non lo è. Stavo pensando di aggiungere un &per evitare di trattenere il prompt, ma l'avvio di dropbox scrive sulla console. Attualmente sto reindirizzando il suo output su /dev/null, ma vorrei avere un modo per eseguire il debug se dropbox non si avvia.
Lord Loh.

1
Partenza daemonize.
Bahamat,

Giusto per sapere "le autorizzazioni vengono modificate in modo che l'utente non privilegiato possa scrivergli". questo è fatto semplicemente da chmod 666? o devo aggiungere un utente a un gruppo o qualcosa del genere?
Lord Loh.

Meglio in / var / tmp, / tmp non è garantito per sopravvivere a uno stivale.
vonbrand,

@LordLoh .: Sì, con chmod. Di solito 0644o 0664e la proprietà dell'utente / del gruppo viene anche cambiata in quella del demone che si prevede scriverà su di esso.
bahamat,

3

Ho l'impressione che i programmi di userspace debbano scartare i registri per impostazione predefinita. Ho visto vari programmi scaricare i log ovunque si sentano, e non è mai particolarmente gradito sui miei sistemi; tende ad accumularsi in una posizione che non viene mai notata a meno che / finché non diventa enorme.

Preferirei se ci fosse un posto preciso per loro, sto giocando sul mio sistema cercando di trovare un posto stabile per loro.

La mia prima idea è stata quella di usarla /var/run/user/$UID/log, ma ho scoperto che sul mio sistema si trattava di un innesto TMPFS, non abbastanza grande o davvero buono per l'uso con i log.

Crea un posto per loro

Dato che non capisco / var / run / user abbastanza bene da integrarmi con esso, ho scelto di emularlo a mano, per l'utente 1000.

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

Consiglierei di attenersi a FHS / var / log spc per la struttura all'interno di questa cartella, ma la specifica in formato libero quindi non c'è molto da rispettare.

Logrotate Config

Non esiste una rotazione del registro esistente in questa directory fornita dal sistema, ti consiglio di crearne una per il tuo sistema:

# /etc/logrotate.d/userlogs

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

Di seguito è riportato il mio precedente post / var / run / user / 1000 / log, non posso raccomandarlo a meno che tu non sappia davvero cosa stai facendo (E se lo fai, dimmi anche tu come fare!)

forse come segue, ma l'ho appena inventato perché aveva senso per me.

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

Integrazione con / 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.