¿Por qué sudo -i no establece XDG_RUNTIME_DIR para el usuario objetivo?


14

XDG_RUNTIME_DIREs necesario para systemctl --usertrabajar.

He configurado el servidor ubuntu 16.04 para ejecutar sesiones de usuario systemd. Ahora, cuando trato de administrarlos, encuentro que al cambiar a un usuario a través de sudo -u $user -io incluso su - $user, el entorno no se ha XDG_RUNTIME_DIRconfigurado, evitando que systemctl --userfuncione. Sin embargo, cuando entro sshdirectamente en ese usuario, está configurado correctamente.

Si entiendo la documentación correctamente, esto debería establecerse libpam-systemdal crear la sesión del usuario. El segmento de usuario se inicia correctamente, ya que existe el directorio al que XDG_RUNTIME_DIRdebe apuntar ( /run/users/$uid). Dudo en codificarlo, por ejemplo, .bash_profileporque eso parece hacky (aunque funciona), cuando pam debería encargarse de eso.

Puedo, por supuesto, añadir XDG_RUNTIME_DIRa env_keepen sudoers, pero eso sería simplemente preservar el entorno del usuario sudoing, que no es lo que quiero. Quiero el entorno del usuario objetivo .

Sin embargo, lo que realmente me pregunto es cómo se configura correctamente la sesión ssh, pero no con suo sudo -i.

Respuestas:


9

He replicado este problema en mi sistema Fedora 25.

Encontré una condición muy sospechosa en el código fuente. https://github.com/systemd/systemd/blob/f97b34a/src/login/pam_systemd.c#L439 Parece que fue escrito con normalidad sudoen mente pero no sudo -u non-root-user.

machinectl shell --uid=non-root-user Trabajó como lo solicitó.

systemd-run no parecía funcionar como se deseaba, a pesar de la referencia a este en la documentación de machinectl.

Algunos comandos de machinectl no funcionan si ha habilitado SELinux en este momento, y estos comandos específicos no funcionaron para mí hasta que lo hice setenforce 0. Sin embargo, estoy en el medio de intentar soluciones para que machinectl funcione, ya que quiero que sea SELinux, por lo que es posible que mi violín sea lo que causa, por ejemplo, el machinectl shelltiempo de espera.

EDITAR: Creo que este código se introdujo después de esta discusión . Y aparentemente su -/ sudo -ipodría hacerse funcionar, pero nadie lo ha implementado (todavía).


En otras palabras, el PAM no establecerá XDG_RUNTIME_DIRpara sudolas sesiones de diseño? Supongo que instalarlo no ~/.profilees tan hacky como pensaba.
mkaito

3
No quiero decir "por diseño" porque no puedo entender cuál es el diseño. Al buscar sudo nuevamente, veo que al menos algunas compilaciones / distribuciones conservan suficientes variables de entorno, que los programas que se ejecutan como root pueden causar problemas de permisos al usuario original. Sin embargo, esta no es una razón para no establecer XDG_RUNTIME_DIR correspondiente al usuario objetivo .
sourcejedi

1
Un Q&A relacionado es unix.stackexchange.com/questions/423632 .
JdeBP

3

Sin embargo, lo que realmente me pregunto es ¿cómo es que la sesión se configura correctamente con ssh, pero no con su o sudo -i?

https://github.com/systemd/systemd/issues/7451#issuecomment-346787237

Lo sentimos, pero "su" es una herramienta para cambiar las identidades de los usuarios y muy pocas otras credenciales de proceso temporalmente. No es una herramienta para abrir una sesión de inicio de sesión completamente nueva. Una nueva sesión de inicio de sesión tiene una configuración impecable y muy bien definida, que no hereda nada de ninguna otra sesión, pero este no es realmente el caso para los cambios "su" uid: la mayoría del entorno de ejecución se hereda, en numerosas y no obvias formas, por ejemplo, contextos MAC, contextos de auditoría, contextos cgroup, contextos de espacio de nombres, programación, granularidad de temporizador, ...

si desea una nueva sesión completa, use algo como "inicio de sesión de machinectl" o "shell de machinectl", que en realidad le proporcionará un entorno de limpieza completamente independiente e independiente, sin que se filtren propiedades ocultas del proceso desde donde lo llama.

las sesiones de inicio de sesión están principalmente vinculadas al concepto de sesión de auditoría, y las sesiones de auditoría no se ven afectadas por "su", de hecho, se definen como "selladas", es decir, si un proceso ingresó a una sesión una vez, siempre permanecerá con él, y también lo harán sus hijos, es decir, la única forma de obtener una nueva sesión es bifurcando algo del PID 1 (o algo similar) que nunca ha sido parte de una sesión.

O para decirlo de otra manera: las cosas que invocas a través de "su" se mostrarán perfectamente en "loginctl", sin embargo, sigue siendo parte de tu sesión original, iniciaste sesión originalmente. Puede verificar eso invocando "estado de loginctl" en el ID de la sesión original (que puede ver a través de echo $ XDG_SESSION_ID)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.