Esiste un modo tipico per passare una password a un file di unità Systemd?


10

Vorrei avviare un servizio utilizzando un file di unità systemd. Questo servizio richiede una password per l'avvio. Non voglio memorizzare la password in testo semplice nel file di unità di systemd, perché è leggibile in tutto il mondo. Inoltre, non voglio fornire questa password in modo interattivo.

Se stavo scrivendo uno script normale per questo, memorizzerei le credenziali in un file di proprietà di root con autorizzazioni limitate (400 o 600) e quindi leggerei il file come parte dello script. Esiste un modo particolare in stile systemd per farlo, o dovrei semplicemente seguire lo stesso processo che farei in un normale script di shell?


Risposte:


11

Ci sono due possibili approcci qui, a seconda delle tue esigenze. Se non si desidera che venga richiesta la password quando il servizio è attivato, utilizzare la EnvironmentFiledirettiva. Da man systemd.exec:

Simile a Environment = ma legge le variabili di ambiente da un file di testo. Il file di testo deve contenere assegnazioni di variabili separate da nuova riga.

Se non desidera che venga chiesto, si può usare una delle systemd-ask-passworddirettive. Da man systemd-ask-password:

systemd-ask-password può essere utilizzato per richiedere una password di sistema o passphrase dall'utente, usando un messaggio di domanda specificato nella riga di comando. Quando eseguito da un TTY, interrogherà una password sul TTY e la stamperà sull'output standard. Se eseguito senza TTY o con --no-tty, utilizzerà il meccanismo di query a livello di sistema, che consente agli utenti attivi di rispondere tramite diversi agenti


2
Si noti che vi sono carenze nel passaggio delle password nelle variabili di ambiente (anche se il file in cui sono impostate le variabili è protetto), poiché di solito è possibile spostarsi tra le variabili di ambiente dei processi appartenenti ad altri utenti (ad esempio l'utilizzo ps ajxewww) in modo che qualcuno possa essere in grado di raccoglilo da lì.
filbranden,

Grazie! EnvironmentFilela voce con un percorso assoluto per un file con 400 autorizzazioni funziona bene.
levibostiano,

@filbranden Non è possibile leggere le variabili di ambiente dei processi appartenenti ad altri utenti.
Woky

1

Sono in grado di offrire un'alternativa aggiuntiva che può soddisfare le tue esigenze ma richiede che siano soddisfatte diverse condizioni preliminari:

I prossimi passi sono i seguenti:

Utilizzare secret-toolda libsecretper memorizzare la password. Per esempio:

$ secret-tool store --label=myProgram myService password
Password: <type it here>

Se il tuo eseguibile supporta la lettura della password da una variabile ambientale, è meglio:

[Service]
ExecStart=/usr/bin/sh -c 'env SECRET=$(secret-tool lookup myService password) /usr/bin/script'

Se il tuo eseguibile accetta la password come argomento, puoi comunque usare secret-toolcosì:

[Service]
ExecStart=/usr/bin/sh -c '/usr/bin/script --secret=$(secret-tool lookup myService password)'

Attenzione : la password sarà chiaramente visibile quando verrà eseguita systemctl --user status myUnit.servicepoiché mostra l'argomento come eseguito sulla riga di comando. Ciò significa che questo sarà visibile anche per gli utenti che eseguono topo ps -aux.


1

C'è una terza alternativa a questo così come il 2 suggerimento di @jasonwryan.

estratto dalla risposta di Michael Hampton a ServerFault - Come impostare la variabile d'ambiente nel servizio systemd?

La corrente modo migliore per farlo è quello di eseguire systemctl edit myservice, che creerà un file di override per te o lasciare che si modifica uno esistente.

Nelle installazioni normali ciò creerà una directory /etc/systemd/system/myservice.service.de all'interno di quella directory creerà un file il cui nome termina in .conf(in genere override.conf) e in questo file è possibile aggiungere o sovrascrivere qualsiasi parte dell'unità spedita dalla distribuzione.

Ad esempio, in un file /etc/systemd/system/myservice.service.d/myenv.conf:

[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"

Nota anche che se la directory esiste ed è vuota, il tuo servizio sarà disabilitato! Se non si intende inserire qualcosa nella directory, assicurarsi che non esista.

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.