Creazione di passphrase di immagine disco crittografata in Keychain e strano account GUID

1

Quando un utente persiste nella frase chiave del disco crittografato (o dell'immagine del disco) nel portachiavi (ad esempio tramite Utility Disco come mostrato qui, collegamento o durante l'impostazione di un backup di Time Machine crittografato, possibilmente su un dispositivo remoto), viene creata una voce nei portachiavi di accesso (tramite Utility Disco o Sistema (per Time Machine).

Esaminandotalevoceconsecurityvengonofornitiiseguentidati:

$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>

Il GUID dell'account non corrisponde a nessuno degli utenti che possono essere trovati tramite:

$ 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>

L'obiettivo finale è creare in modo non interattivo la voce necessaria nel Keychain per Time Machine per raccogliere la password e allegare un'immagine disco di sparsebundle crittografata, con dimensioni limitate, su Time Capsule, per cui questo è il pezzo mancante.

Purtroppo diskimages-helper non è autorizzato a montarlo (osservato tramite Console.app ) quando si utilizza il seguente comando per creare la voce:

%pre%

BTW questo è su Sierra.

Ulteriori riferimenti:

posta Lloeki 10.01.2017 - 13:54
fonte

1 risposta

1

Ottenere l'UUID:

Il campo account nella voce portachiavi corrisponde all'UUID dell'immagine disco crittografata che può essere recuperata in questo modo:

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

Si noti che il comando hdiutil isencrypted stampa sempre il suo output su stderr per qualche motivo, motivo per cui dobbiamo reindirizzare stderr su stdout (2 > & 1) prima di inviarlo a grep. In alternativa, puoi utilizzare l'opzione -plist e analizzare l'XML se questo si adatta meglio al tuo caso d'uso.

Creazione dell'elemento Portachiavi:

Per far sì che Time Machine esegua automaticamente backup programmati su Time Capsule, la password dell'immagine del disco deve essere memorizzata nel portachiavi a livello di sistema situato in /Library/Keychains/System.keychain anziché nel portachiavi di accesso utente protetto da password.

Per creare in modo non interattivo una voce nel portachiavi di sistema, puoi fare:

$ 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

invochiamo il comando uuid dal passaggio precedente in una subshell qui da usare come nome dell'account.

Problemi di sicurezza:

Invece di una password, il portachiavi del sistema è protetto utilizzando un file chiave in /private/var/db/SystemKey . Quando il sistema è in esecuzione, tutti gli utenti amministratori hanno il permesso di accedere al portachiavi.

Questo non è un rischio per la sicurezza di per sé, ma le persone spesso dimenticano / trascurano quando abilitano Time Machine che è per l'intero computer e non solo il loro account utente. Tieni questo a mente quando scegli la tua password di Time Machine per non usarne una molto personale o privata se condividi l'amministrazione (e, ovviamente, assicurati di aver abilitato la crittografia completa del disco di FileVault per impedire l'accesso a terze parti).

Un'altra preoccupazione è che mentre includi la tua password come argomento con -w evita il prompt interattivo della password, è anche non sicuro come verrà salvata in testo semplice alla cronologia della shell (se non lo si sopprime) e all'output di comandi come ps . E poiché devi specificare il percorso del portachiavi di sistema come ultimo argomento, è molto complicato aggiungere un elemento al portachiavi del sistema in modo non interattivo senza esporre la password in questo modo.

Ma c'è una soluzione alternativa, anche se più coinvolgente, per aggiungere elementi al portachiavi utente login che evita di esporre la tua password:

Uso di expect per gestire i prompt della password interattiva:

Poiché non è possibile reindirizzare la password a security direttamente, puoi invece specificare -w come ultima opzione e omettere la password. In questo modo verrà richiesta una password, quindi sarà possibile utilizzare expect per gestire le richieste interattive a livello di codice. L'avvertenza è che non è possibile specificare a quale portachiavi aggiungere l'elemento, quindi verrà aggiunto al portachiavi di accesso predefinito. / p>

Non sono sicuro se questo rientra nella portata della tua domanda, ma nel caso, ecco uno script di expect veloce e sporco che ti consente di fornire una password non interattiva 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

Ad esempio su come eseguirlo, qui lo salverò in un file hdiutilAddToKeychain.exp e lo inserirò in una password da una funzione immaginaria che puoi sostituire, ma ottieni la password nel tuo flusso di lavoro:

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

Questo dovrebbe creare l'elemento appropriato nel tuo portachiavi di accesso, ma il sistema operativo potrebbe comunque fornirti una richiesta della password della GUI per consentire l'accesso la prima volta che provi ad aprirlo. Non sono a conoscenza di un modo per aggirare questo primo prompt.

Potresti anche essere in grado di utilizzare i comandi secondari export e import della sicurezza per copiare la password dal tuo portachiavi di accesso al portachiavi di sistema una volta che è stata aggiunta in questo modo.

    
risposta data 14.09.2017 - 16:53
fonte

Leggi altre domande sui tag