Creando una frase de contraseña de imagen de disco cifrada en Keychain y una cuenta GUID extraña

1

Cuando un usuario persiste una frase de contraseña de disco (o imagen de disco) cifrada en el Llavero (por ejemplo, a través de la Utilidad de Disco como se muestra aquí, enlace o al configurar una copia de seguridad cifrada de Time Machine, posiblemente en un dispositivo remoto), se crea una entrada en los llaveros de inicio de sesión (a través de Disk Utility) o en System (para Time Machine).

Elexamendedichaentradaconsecurityproporcionalossiguientesdatos:

$securityfind-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
dscl /Search -list /Users GeneratedUID
0" "crtr"<uint32>=<NULL> "cusi"<sint32>=<NULL> "desc"<blob>="disk image password" "gena"<blob>=<NULL> "icmt"<blob>=<NULL> "invi"<sint32>=<NULL> "mdat"<timedate>=0x32303137303131303132333130335A00 "20170110123103Z
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
0" "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:

$ 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
dscl /Search -list /Users GeneratedUID
0" "crtr"<uint32>=<NULL> "cusi"<sint32>=<NULL> "desc"<blob>="disk image password" "gena"<blob>=<NULL> "icmt"<blob>=<NULL> "invi"<sint32>=<NULL> "mdat"<timedate>=0x32303137303131303132333130335A00 "20170110123103Z
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
0" "nega"<sint32>=<NULL> "prot"<blob>=<NULL> "scrp"<sint32>=<NULL> "svce"<blob>="A65D7474-F452-51CB-9BCC-3D594C918978.sparsebundle" "type"<uint32>=<NULL>

El objetivo final es crear de manera no interactiva la entrada necesaria en Keychain para Time Machine para recoger la contraseña y adjuntar una imagen de disco enredada de tamaño limitado en una Time Capsule, para la cual esta es la pieza que falta.

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

%pre%

Por cierto, esto está en Sierra.

Referencias adicionales:

pregunta Lloeki 10.01.2017 - 13:54

1 respuesta

1

Obteniendo el UUID:

El campo cuenta en la entrada del llavero corresponde al UUID de la imagen de disco cifrada que se puede recuperar de esta manera:

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

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

Creando el elemento Llavero:

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

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

$ 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 una subshell aquí para usarlo como nombre de cuenta.

Preocupaciones de seguridad:

En lugar de una contraseña, el llavero del sistema se protege mediante un archivo de clave en /private/var/db/SystemKey . Cuando el sistema se está ejecutando, todos los usuarios administrativos tienen permiso para acceder al llavero.

Esto no es un riesgo de seguridad en sí mismo, pero las personas a menudo se olvidan o pasan por alto cuando habilitan Time Machine para todo el equipo y no solo su cuenta de usuario. Tenga en cuenta esto cuando elija su contraseña de Time Machine para no usar una que sea muy personal o privada si comparte el administrador (y, obviamente, asegúrese de haber habilitado el cifrado de disco completo de FileVault para evitar el acceso de terceros).

Otra preocupación es que al incluir su contraseña en línea como un argumento con -w evita la solicitud de contraseña interactiva, también es inseguro ya que se guardará en texto sin formato a su historial de 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 agregar un elemento de forma no interactiva al llavero del sistema sin exponer la contraseña de esta manera.

Pero hay una solución alternativa, aunque más complicada, para agregar elementos al llavero login del usuario que evita exponer su contraseña:

Usar expect para manejar solicitudes de contraseña interactivas:

Ya que no puede canalizar la contraseña a security directamente, en su lugar puede especificar -w como la última opción y omitir la contraseña. Esto hará que se solicite una contraseña y, a continuación, puede usar expect para manejar las solicitudes interactivas mediante programación. La advertencia es que no puede especificar a qué llavero agregar el elemento, por lo que se agregará al llavero de inicio de sesión predeterminado.

No estoy seguro de si esto está dentro del alcance de su pregunta, pero por si acaso, aquí hay una secuencia de comandos expect rápida y sucia que le permite proporcionar una contraseña de forma no interactiva al mensaje:

#!/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

Por ejemplo, sobre cómo ejecutarlo, aquí lo guardo en un archivo hdiutilAddToKeychain.exp y canalizo una contraseña desde una función imaginaria que puede sustituir, pero puede obtener la contraseña en su 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 aún puede proporcionarle una solicitud de contraseña GUI para permitir el acceso la primera vez que intente abrirlo. No soy consciente de ninguna manera alrededor de este primer mensaje de tiempo.

También puede usar los subcomandos export y import de seguridad para copiar la contraseña de su llavero de inicio de sesión al llavero del sistema una vez que se haya agregado de esta manera.

    
respondido por el bowmasters 14.09.2017 - 16:53

Lea otras preguntas en las etiquetas