Systemd e i file temporanei

imageDa qualche tempo, alcune distribuzioni hanno cominciato ad utilizzare Systemd per la gestione dei servizi di sistema. Non tutti si sono trovati d’accordo con l’introduzione di questo sistema e in alcuni casi ha portato alla scissione del team in alcune distribuzioni principali, come è successo ad esempio per Debian con Devuan.
Preferenze personali a parte, una grande novità introdotta con Systemd riguarda la gestione dei file temporanei. Infatti, è possibile assegnare una directory temporanea privata ad un servizio, il vantaggio è che in questo modo si riducono le possibilità di sovrascrivere un file temporaneo generato da altre aplicazioni. Inoltre, il fatto che la directory temporanea sia incapsulata in un chroot fa si che diminuiscano le possibilità di utilizzarla come punto di partenza per una escalation al sistema.
Ad esempio, ipotizziamo di creare un file temporaneo in PHP:

<?php 
$tmpfname = tempnam("/tmp", "FOO"); 
$handle = fopen($tmpfname, "w"); 
fwrite($handle, "writing to tempfile"); 
fclose($handle); 
        // do here something 
unlink($tmpfname); 
?>

Se il processo relativo a questo codice, ad esempio il web server Apache, è configurato per la gestione privata dei file temporanei, questo file sarà in realtà creato in una directory del tipo: /tmp/systemd-private-XXXXXXX/tmp
Ogni processo per il quale è stata richiesta la funzionalità avrà un direcotry separata. Occorre fare attenzione al fatto che, per il processo Apache, la directory sarà sempre /tmp e quindi dobbiamo fare attenzione a non gestire questo percorso al di fuori del processo in esecuzione, in quanto non sarà accessibile diversamente.
Le configurazioni dei servizi si trovano nella cartella /usr/lib/systemd/system, ad esempio per il servizio HTTPD:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

La direttiva che ci interessa è PrivateTmp, in questo caso è impostata a True e quindi il processo Apache utilizzerà la struttura per i file temporanei privati. Ovviamente è possibile disabilitare questa funzione impostando a False il valore della direttiva.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...