PAM: ¿Ejecutar un comando antes de pam_mkhomedir?

8

Cuando un usuario inicia sesión en un sistema y no hay un directorio de inicio, nos gustaría crear el directorio de inicio del usuario utilizando pam_mkhomedir . Esta es una práctica común. Aquí hay una descripción rápida de pam_mkhomedir:

El módulo PAM pam_mkhomedir creará un directorio de inicio de usuarios si no existe cuando comienza la sesión. Esto permite a los usuarios estar presentes en la base de datos central (como NIS, kerberos o LDAP) sin usar un sistema de archivos distribuido o crear previamente una gran cantidad de directorios. El directorio de esqueleto (generalmente / etc / skel /) se usa para copiar archivos predeterminados y también establece una umask para la creación.

Sin embargo, este es un sistema FreeBSD 8.2 que ejecuta ZFS. Primero debemos ejecutar un comando ZFS, porque queremos un sistema de archivos ZFS por usuario . pam_mkhomedirpodemos hacer un mkdir, pero necesitamos hacer algo como eso zfs create /zpool/home/$USER.

¿Alguien sabe si es posible usar PAM para ejecutar comandos durante la primera sesión de inicio de sesión de un usuario?

Stefan Lasiewski
fuente
Reemplacé el enlace solarisinternals.com con una versión archivada de archive.org, porque la primera está ocupada por un okupador de dominio. Gracias a @ Norman Gray por señalarlo.
Stefan Lasiewski

Respuestas:

9

Hay un módulo PAM llamado pam_exec: si escribe una secuencia de comandos que comprueba y / o crea el volumen ZFS, puede encadenar esto en sus reglas PAM existentes y mantener las cosas bien sin asumir un inicio de sesión interactivo, shells predeterminados y directorios de esqueleto, etc. ejemplo, podrías tener

session required pam_unix.so
session required pam_exec.so check_zfs.sh $PAM_USER

o lo que se adapte a su configuración específica.

(Como Tom Shaw señaló en los comentarios, tener session required pam_mkhomedir.sosería redundante).

Andrés
fuente
Bueno, excepto que tienes un error tipográfico en la línea pam_mkhomedir.so - ¡los errores tipográficos en pam.conf no son buenos! - y no creo que esa línea sea necesaria si el script check_zfs.sh hace todo el trabajo sucio.
Tom Shaw
@ Tom ¿Por qué reinventar la rueda cuando el módulo PAM lo hace por usted?
Andrew
2
El punto de la pregunta es que quiere que el directorio de inicio se cree con "zfs create" en lugar de "mkdir". Esto se logra utilizando pam_exec. ¡El directorio existe en este punto, por lo que el subsiguiente pam_mkhomedir no hará nada!
Tom Shaw
@TomShaw de hecho.
Andrew
3

Vale la pena señalar, como se le preguntó, su pregunta contiene una suposición inválida: incluso PAM no tiene idea si es el primer inicio de sesión del usuario; solo sabe si el usuario tiene un directorio de inicio o no.

Entonces, con esa advertencia en mente, no es PAM lo que lo hace, pero podría ejecutar fácilmente algo /etc/bashrc, con el comando precedido por una verificación y seguido de un archivo de puntos en el directorio de inicio del usuario. ¿Necesitas root privs? Es sudoprobable que un binario bloqueado adecuadamente o un setuid funcione mejor para usted. Ambas opciones también le dan la opción de colocar el archivo de puntos en algún lugar donde el usuario no pueda modificarlo o eliminarlo (si le importa ese tipo de cosas).

BMDan
fuente
Estoy confundido. ¿No está pam_mkhomedir creando estos directorios principales, copiando el contenido de / etc / skel, etc.? Eché un vistazo al código C (en FreeBSD), y pensé que podía ver dónde copiaba los archivos de esqueleto al homedir recién creado.
Stefan Lasiewski
El hecho de que un usuario no tenga un directorio de inicio no significa que no haya iniciado sesión en ese sistema antes. El directorio de inicio podría haberse eliminado, por ejemplo. Sin embargo, esto es principalmente pelos semánticos y divididos.
Red Tux
@red: Entendido. Actualicé mi pregunta.
Stefan Lasiewski
1

Entonces tienes dos opciones aquí:

1) modifique la fuente para pam_mkhomedir para crear el sistema de archivos zfs primero antes de crear el directorio. 2) deje que pam_mkhomedir se ejecute como lo haría normalmente, luego agregue un script para verificar y ver cuándo hay carpetas que no están en su propio sistema de archivos zfs donde el usuario se ha desconectado. Cuando detecte esos casos, mueva el directorio / home, cree el sistema de archivos y luego vuelva a mover los archivos al directorio.

Sospecho que dejar a un usuario en la página principal / principal durante un día inicial no causará demasiados problemas, por lo que elegiría la última opción, es más simple.

n8whnp
fuente