Tengo varios volúmenes APFS encriptados, algunos de los cuales tienen sus frases de paso almacenadas sólo en los llaveros de usuarios específicos para que puedan desbloquearse y montarse automáticamente para esos usuarios.
Sin embargo, cuando el usuario cierra la sesión, el volumen sigue montado. Aunque esto no es estrictamente un problema (ya que establezco puntos de montaje dentro de la carpeta de inicio del usuario, y tengo habilitada la propiedad del volumen), preferiría que el volumen se desmontara y se bloqueara de nuevo automáticamente.
Este comportamiento difiere en comparación con el montaje de una imagen de disco cifrada, que se monta como un usuario específico (al ver la salida de mount
) y que luego (normalmente*) se desmonta cuando el usuario cierra la sesión.
¿Es posible replicar el mismo comportamiento con los volúmenes APFS, es decir, montar automáticamente para el usuario con la frase de contraseña en su llavero cuando se conecta, y luego desmontar (y bloquear) automáticamente cuando se desconecta?
*Digo normalmente, ya que MacOS Catalina parece tener errores relacionados con la limpieza de los procesos de usuario cuando un usuario cierra la sesión, lo que hace que muchos procesos sigan funcionando para los usuarios que han cerrado la sesión. Esto incluye actualmente a disk-image-helper, por lo que ya no se desmonta automáticamente como lo hacía en Mojave. Estoy feliz de aceptar cualquier respuesta que replique el comportamiento de montaje/desmontaje de imágenes de disco con la advertencia de que esto actualmente no siempre funciona para Catalina, sobre la base de que debería funcionar si Apple alguna vez corrige estos errores.
Actualización : He intentado hacer lo siguiente en un script disparado por launchd, pero la señal de kill de launchd no parece llegar:
#!/bin/bash
VOLUME=12345678-9012-3456-7890-123456789012
MOUNT_POINT=/Users/haravikk/Desktop/Foo
[ ! -e "${MOUNT_POINT}" ] && { mkdir "${MOUNT_POINT}" || exit 1; }
if echo -e "$(security find-generic-password -wa "${VOLUME}" | sed 's/../\\x&/g')" | diskutil apfs unlockVolume "${VOLUME}" -stdinpassphrase; then
cleanup() {
echo 'Unmounting'
attempts=5
while [[ ${attempts} -gt 0 ]]; do
diskutil apfs lockVolume "${VOLUME}" && break
[[ -n "${MOUNT_POINT}" ]] && umount "${MOUNT_POINT}" && break
attempts=$((${attempts} - 1))
sleep 5
done
if [[ ${attempts} = 0 ]]; then
if ! diskutil unmount force "${VOLUME}"; then
if [[ -z "${MOUNT_POINT}" ]] || ! umount -f "${MOUNT_POINT}"; then
echo 'All attempts to unmount failed' >&2
fi
fi
fi
}
trap 'cleanup' SIGINT SIGHUP SIGTERM EXIT
while true; do
sleep 86400 &
wait $!
done
fi
La idea era que cuando el usuario se desconectara, launchd
deben enviar a sus procesos una señal de muerte ( SIGINT
) que activará la trampa del script y le permitirá desmontar el volumen. Pero esto nunca parece suceder; la trampa no se dispara en absoluto.
Si alguien está interesado en utilizar los fundamentos de este script, tenga en cuenta que necesitará tener una entrada en su llavero para el volumen (puede hacerlo montando con la Utilidad de Discos y eligiendo guardar cuando se le pida la contraseña), y debe asegurarse de que security
tiene permiso para acceder a ella.