Erstellen einer verschlüsselten Disk-Image-Passphrase im Schlüsselbund und eines seltsamen GUID-Kontos

Wenn ein Benutzer eine verschlüsselte Festplatten- (oder Festplatten-Image-) Passphrase im Schlüsselbund speichert (z. B. über das Festplattendienstprogramm, wie hier gezeigt, https://apple.stackexchange.com/a/229309/5392 oder beim Einrichten einer verschlüsselten Time Machine-Sicherung, möglicherweise auf einem Remote-Gerät), wird ein Eintrag entweder im Anmelde- (über das Festplatten-Dienstprogramm) oder im System-Schlüsselbund (für Time Machine) erstellt.

Schlüsselbund-Screenshot

Die Untersuchung eines solchen Eintrags mit securityliefert folgende Daten:

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

Die GUID des Kontos stimmt mit keinem der Benutzer überein, die gefunden werden können über:

dscl /Search -list /Users GeneratedUID

Das ultimative Ziel besteht darin, den erforderlichen Eintrag im Schlüsselbund für Time Machine nicht interaktiv zu erstellen, um das Kennwort abzurufen und ein verschlüsseltes, größenbegrenztes Sparsebundle-Disk-Image an eine Time Capsule anzuhängen, für die dies das fehlende Teil ist.

Leider diskimages-helperist es nicht erlaubt, es zu mounten (beobachtet über Console.app), wenn Sie den folgenden Befehl verwenden, um den Eintrag zu erstellen:

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

Übrigens ist dies auf Sierra.

Weitere Referenzen:

Antworten (1)

Abrufen der UUID:

Das Kontofeld im Schlüsselbundeintrag entspricht der UUID des verschlüsselten Disk-Images, das wie folgt abgerufen werden kann:

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

Beachten Sie, dass der hdiutil isencryptedBefehl seine Ausgabe aus irgendeinem Grund immer auf stderr ausgibt, weshalb wir stderr auf stdout (2>&1) umleiten müssen, bevor wir ihn an grep weiterleiten. Alternativ können Sie die -plistOption verwenden und das XML parsen, wenn es besser zu Ihrem Anwendungsfall passt.


Erstellen des Schlüsselbundelements:

Damit Time Machine automatisch geplante Sicherungen auf einer Time Capsule durchführt, muss das Disk-Image-Passwort im systemweiten Schlüsselbund gespeichert werden und /Library/Keychains/System.keychainnicht in Ihrem passwortgeschützten Schlüsselbund für die Benutzeranmeldung.

Um nicht interaktiv einen Eintrag im System-Schlüsselbund zu erstellen, können Sie Folgendes tun:

$ 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

Wir rufen hier den uuid-Befehl aus dem vorherigen Schritt in einer Subshell auf, um ihn als Kontonamen zu verwenden.

Sicherheitsbedenken:

Anstelle eines Passworts wird der System-Schlüsselbund mit einer Schlüsseldatei unter gesichert /private/var/db/SystemKey. Wenn das System läuft, haben alle Admin-Benutzer die Berechtigung, auf den Schlüsselbund zuzugreifen.

Dies ist an sich kein Sicherheitsrisiko, aber die Leute vergessen / übersehen oft, wenn sie Time Machine aktivieren, dass es für den gesamten Computer und nicht nur für ihr Benutzerkonto gilt. Denken Sie daran, wenn Sie Ihr Time Machine-Passwort auswählen, um kein sehr persönliches oder privates Passwort zu verwenden, wenn Sie die Administratorrechte teilen (und stellen Sie natürlich sicher, dass Sie die FileVault-Festplattenverschlüsselung aktiviert haben, um den Zugriff Dritter zu verhindern).

Ein weiteres Problem ist, dass Ihr Passwort zwar inline als Argument eingefügt wird, um -wdie interaktive Passwortabfrage zu vermeiden, es aber auch unsicher ist , da es im Klartext in Ihrem Shell-Verlauf gespeichert wird (wenn Sie es nicht unterdrücken) und in der Ausgabe von Befehlen wie ps. Und da Sie den Systemschlüsselbundpfad als letztes Argument angeben müssen, ist es sehr schwierig, dem Systemschlüsselbund ein Element nicht interaktiv hinzuzufügen, ohne das Kennwort auf diese Weise preiszugeben.

Es gibt jedoch eine alternative, wenn auch kompliziertere Lösung zum Hinzufügen von Elementen zum Schlüsselbund für die Benutzeranmeldung, die es vermeidet, Ihr Passwort preiszugeben:


Verwenden expect, um interaktive Passwortabfragen zu verarbeiten:

Da Sie das Passwort nicht direkt weiterleiten können security, können Sie stattdessen -wals letzte Option angeben und das Passwort weglassen. Dadurch wird es zur Eingabe eines Kennworts aufgefordert, und Sie können dann verwenden, expectum die interaktiven Eingabeaufforderungen programmgesteuert zu verarbeiten. Der Vorbehalt besteht darin, dass Sie nicht angeben können, zu welchem ​​​​Schlüsselbund das Element hinzugefügt werden soll, sodass es dem standardmäßigen Login-Schlüsselbund hinzugefügt wird.

Ich bin mir nicht sicher, ob dies im Rahmen Ihrer Frage liegt, aber nur für den Fall, hier ist ein schnelles und schmutziges expectSkript, mit dem Sie der Eingabeaufforderung nicht interaktiv ein Passwort zuweisen können:

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

Zum Beispiel, wie man es ausführt, speichere ich es hier in einer Datei hdiutilAddToKeychain.expund leite ihm ein Passwort aus einer imaginären Funktion zu, das Sie ersetzen können, wie auch immer Sie das Passwort in Ihrem Workflow erhalten:

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

Dies sollte das entsprechende Element in Ihrem Login-Schlüsselbund erstellen, aber das Betriebssystem gibt Ihnen möglicherweise immer noch eine GUI-Passwort-Eingabeaufforderung, um den Zugriff zu erlauben, wenn Sie zum ersten Mal versuchen, es zu öffnen. Mir ist keine Möglichkeit bekannt, diese Aufforderung zum ersten Mal zu umgehen.

exportSie können möglicherweise auch Sicherheits- und Unterbefehle verwenden import, um das Kennwort von Ihrem Login-Schlüsselbund in den System-Schlüsselbund zu kopieren, sobald es auf diese Weise hinzugefügt wurde.

Das sieht aus wie das, was ich suche. Obwohl ich mir der Punkte, die Sie als Sicherheitsbedenken angesprochen haben, bewusst bin, mich aber entschieden habe, sie wegzulassen, um das Problem nicht zu verschleiern, schätze ich den Hinweis, insbesondere für Leute, die später auf diese Antwort landen würden.
Ich werde mir einige Zeit nehmen, um all dies auf High Sierra zu überprüfen, und werde die Antwort höchstwahrscheinlich später akzeptieren.
Bestätigt, an High Sierra zu arbeiten