¿Hay una forma típica de pasar una contraseña a un archivo de unidad Systemd?

10

Me gustaría iniciar un servicio utilizando un archivo de unidad systemd. Este servicio requiere una contraseña para comenzar. No quiero almacenar la contraseña en texto sin formato en el archivo de la unidad systemd, porque es legible en todo el mundo. Tampoco quiero proporcionar esta contraseña de forma interactiva.

Si escribiera un script normal para esto, almacenaría las credenciales en un archivo propiedad de root con permisos restringidos (400 o 600), y luego leería el archivo como parte del script. ¿Hay alguna forma particular de hacer esto, o debería seguir el mismo proceso que seguiría en un script de shell normal?

SauceCode
fuente

Respuestas:

11

Aquí hay dos enfoques posibles, según sus requisitos. Si no desea que se le solicite la contraseña cuando se activa el servicio, use la EnvironmentFiledirectiva. De man systemd.exec:

Similar a Environment = pero lee las variables de entorno de un archivo de texto. El archivo de texto debe contener asignaciones de variables separadas por una nueva línea.

Si no desea que se le pregunte, se utilizaría una de las systemd-ask-passworddirectivas. De man systemd-ask-password:

systemd-ask-password se puede usar para consultar una contraseña del sistema o una frase de contraseña del usuario, usando un mensaje de pregunta especificado en la línea de comando. Cuando se ejecuta desde un TTY, consultará una contraseña en el TTY y la imprimirá en la salida estándar. Cuando se ejecuta sin TTY o con --no-tty, utilizará el mecanismo de consulta de todo el sistema, que permite a los usuarios activos responder a través de varios agentes

jasonwryan
fuente
2
Tenga en cuenta que existen deficiencias para pasar contraseñas en las variables de entorno (incluso si el archivo donde se establecen las variables está protegido), ya que generalmente es posible espiar las variables de entorno de los procesos que pertenecen a otros usuarios (por ejemplo, el uso ps ajxewww) para que alguien pueda recógelo desde allí.
filbranden
¡Gracias! EnvironmentFileLa entrada con una ruta absoluta a un archivo con 400 permisos funciona bien.
levibostian
@filbranden No puede leer las variables de entorno de los procesos que pertenecen a otros usuarios.
woky
1

Puedo ofrecer una alternativa adicional que se adapte a sus necesidades, pero requiere varias condiciones previas que se deben cumplir:

Los siguientes pasos son los siguientes:

Use secret-tooldesde libsecretpara almacenar su contraseña. Por ejemplo:

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

Si su ejecutable admite la lectura de la contraseña de una variable ambiental, es mejor:

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

Si su ejecutable acepta la contraseña como argumento, aún puede usarla secret-toolasí:

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

Precaución : la contraseña será claramente visible cuando la ejecute, systemctl --user status myUnit.serviceya que muestra el argumento como ejecutado en la línea de comando. Esto significa que esto también será visible para los usuarios que ejecutan topo ps -aux.

Doron Behar
fuente
1

Hay una tercera alternativa a esto, así como la sugerencia 2 de @jasonwryan.

Extracto de la respuesta de Michael Hampton en ServerFault: ¿Cómo configurar la variable de entorno en el servicio systemd?

La mejor forma actual de hacerlo es ejecutar systemctl edit myservice, lo que creará un archivo de anulación para usted o le permitirá editar uno existente.

En instalaciones normales, esto creará un directorio /etc/systemd/system/myservice.service.d, y dentro de ese directorio creará un archivo cuyo nombre termina en .conf(típicamente override.conf), y en este archivo puede agregar o anular cualquier parte de la unidad enviada por la distribución.

Por ejemplo, en un archivo /etc/systemd/system/myservice.service.d/myenv.conf:

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

También tenga en cuenta que si el directorio existe y está vacío, ¡su servicio estará deshabilitado! Si no tiene la intención de poner algo en el directorio, asegúrese de que no exista.

slm
fuente