1 votos

Creación de una frase de contraseña de imagen de disco encriptada en el Llavero, y cuenta GUID extraña

Cuando un usuario persigue una frase de contraseña encriptada en el disco (o imagen de disco) en el Llavero (por ejemplo, a través de la Utilidad de Discos como se muestra aquí, https://apple.stackexchange.com/a/229309/5392 o cuando se configura una copia de seguridad encriptada de Time Machine, posiblemente en un dispositivo remoto), se crea una entrada en los llaveros de inicio de sesión (a través de la Utilidad de Discos) o del Sistema (para Time Machine).

Keychain screenshot

El examen de una entrada de este tipo con security proporciona los siguientes datos:

$ security find-generic-password -D "disk image password" -l "A65D7474-F452-51CB-9BCC-3D594C918978.sparsebundle"
keychain: "/Library/Keychains/System.keychain"
version: 256
class: "genp"
attributes:
    0x00000007 <blob>="A65D7474-F452-51CB-9BCC-3D594C918978.sparsebundle"
    0x00000008 <blob>=<NULL>
    "acct"<blob>="17F24503-E0E2-45B9-86EA-C79D857BA2AC"
    "cdat"<timedate>=0x32303137303131303132333130335A00  "20170110123103Z\000"
    "crtr"<uint32>=<NULL>
    "cusi"<sint32>=<NULL>
    "desc"<blob>="disk image password"
    "gena"<blob>=<NULL>
    "icmt"<blob>=<NULL>
    "invi"<sint32>=<NULL>
    "mdat"<timedate>=0x32303137303131303132333130335A00  "20170110123103Z\000"
    "nega"<sint32>=<NULL>
    "prot"<blob>=<NULL>
    "scrp"<sint32>=<NULL>
    "svce"<blob>="A65D7474-F452-51CB-9BCC-3D594C918978.sparsebundle"
    "type"<uint32>=<NULL>

El GUID de la cuenta no coincide con ninguno de los usuarios que se pueden encontrar a través de:

dscl /Search -list /Users GeneratedUID

El objetivo final es crear de forma no interactiva la entrada necesaria en el Llavero para que Time Machine recoja la contraseña y adjunte una imagen de disco sparsebundle encriptada y de tamaño limitado en una Time Capsule, para lo cual ésta es la pieza que falta.

Por desgracia, diskimages-helper no puede montarlo (observado a través de Console.app ) cuando se utiliza el siguiente comando para crear la entrada:

sudo security add-generic-password -a "$username" -w "${passphrase}" -D "disk image password" -s "${sparsebundle}" -T /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/Resources/diskimages-helper /Library/Keychains/System.keychain

Por cierto, esto es en Sierra.

Referencias adicionales:

3voto

fiverules Puntos 232

Obtención del UUID:

El cuenta en la entrada del llavero corresponde al UUID de la imagen de disco encriptada, que puede recuperarse así:

hdiutil isencrypted example.sparsebundle 2>&1 | grep uuid | cut -f2 -d" "

Tenga en cuenta que el hdiutil isencrypted siempre imprime su salida en stderr por alguna razón, por lo que debemos redirigir stderr a stdout (2>&1) antes de pasarla a grep. Alternativamente, puedes usar el comando -plist y parsear el XML si se ajusta mejor a su caso de uso.


Creación del elemento llavero:

Para que Time Machine realice automáticamente copias de seguridad programadas en una Time Capsule, la contraseña de la imagen de disco debe estar almacenada en el llavero del sistema situado en /Library/Keychains/System.keychain en lugar de su llavero de inicio de sesión de usuario protegido por contraseña.

Para crear de forma no interactiva una entrada en el llavero del sistema, puede hacerlo:

$ security add-generic-password -D "disk image password" \
-T /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/Resources/diskimages-helper \
-a `hdiutil isencrypted /path/to/your/TimeMachine.sparsebundle 2>&1 | grep uuid | cut -f2 -d" "` \
-s "TimeMachine.sparsebundle" \
-w $YOUR_PASSPHRASE \
/Library/Keychains/System.keychain

invocamos el comando uuid del paso anterior en un subshell aquí para usarlo como nombre de cuenta.

Preocupación por la seguridad:

En lugar de una contraseña, el llavero del sistema está protegido mediante un archivo de claves en /private/var/db/SystemKey . Cuando el sistema está funcionando, todos los usuarios administradores tienen permiso para acceder al llavero.

Esto no es un riesgo de seguridad en sí mismo, pero la gente a menudo olvida o pasa por alto al activar Time Machine que es para todo el ordenador y no sólo para su cuenta de usuario. Ten esto en cuenta cuando elijas tu contraseña de Time Machine para no usar una que sea muy personal o privada para ti si compartes la administración (y, obviamente, asegúrate de que has activado el cifrado de disco completo de FileVault para evitar el acceso de terceros).

Otro problema es que al incluir la contraseña en línea como argumento con -w evita la solicitud de contraseña interactiva, también es inseguro ya que se guardará en texto plano en el historial del shell (si no lo suprime) y en la salida de comandos como ps . Y debido a que debe especificar la ruta del llavero del sistema como último argumento, es muy difícil añadir un elemento al llavero del sistema de forma no interactiva sin exponer la contraseña de esta manera.

Pero hay una solución alternativa, aunque más complicada, para añadir elementos al usuario acceso llavero que evita exponer tu contraseña:


Utilizando expect para manejar las solicitudes interactivas de contraseña:

Como no se puede canalizar la contraseña a security directamente, puede especificar en su lugar -w como última opción y omitir la contraseña. Esto hará que te pida una contraseña, y entonces podrás usar expect para manejar los avisos interactivos mediante programación - la advertencia es que no se puede especificar a qué llavero añadir el elemento, por lo que se añadirá al llavero de inicio de sesión por defecto.

No estoy seguro de si esto entra en el ámbito de tu pregunta, pero por si acaso, aquí tienes un resumen rápido expect script que permite proporcionar de forma no interactiva una contraseña al prompt:

#!/usr/bin/env expect -f

# Get passphrase piped through stdin
fconfigure stdin -blocking false
set PASSPHRASE [read stdin]

# get the uuid of the disk image
set IMAGE_PATH [lindex $argv 0]   
spawn bash -c "hdiutil isencrypted $IMAGE_PATH"
expect {
    -re "\[A-F0-9\]{8}(-\[A-F0-9\]{4}){3}-\[A-F0-9\]{12}" { set UUID $expect_out(0,string) }
    -re "hdiutil: isencrypted failed.*" { exit 1 }
    "encrypted: NO" { exit 1 }
}

# add password to keychain
set send_slow {1 .1}
spawn -noecho security add-generic-password -a $UUID -s "[file tail $IMAGE_PATH]" -D "disk image password" -T /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/Resources/diskimages-helper -w
expect "password data for new item:"
send -s -- "$PASSPHRASE\r"
expect "retype password for new item:"
send -s -- "$PASSPHRASE\r"

expect eof

Como ejemplo de cómo ejecutarlo, aquí lo guardo en un archivo hdiutilAddToKeychain.exp y le canaliza una contraseña desde una función imaginaria que puedes sustituir por la forma en que obtienes la contraseña en tu flujo de trabajo:

$ getPassword | ./hdiutilAddToKeychain.exp /path/to/example.sparsebundle

Esto debería crear el elemento apropiado en su llavero de inicio de sesión, pero el sistema operativo todavía puede dar una solicitud de contraseña GUI para permitir el acceso la primera vez que intente abrirlo. No conozco ninguna forma de evitar este aviso de la primera vez.

También puede utilizar el sistema de seguridad export y import para copiar la contraseña de su llavero de inicio de sesión al llavero del sistema una vez que se ha añadido de esta manera.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X