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.
Die Untersuchung eines solchen Eintrags mit security
liefert 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-helper
ist 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:
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 isencrypted
Befehl 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 -plist
Option verwenden und das XML parsen, wenn es besser zu Ihrem Anwendungsfall passt.
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.keychain
nicht 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.
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 -w
die 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:
expect
, um interaktive Passwortabfragen zu verarbeiten:Da Sie das Passwort nicht direkt weiterleiten können security
, können Sie stattdessen -w
als letzte Option angeben und das Passwort weglassen. Dadurch wird es zur Eingabe eines Kennworts aufgefordert, und Sie können dann verwenden, expect
um 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 expect
Skript, 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.exp
und 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.
export
Sie 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.
Lloeki
Lloeki
Lloeki