Android 7.0 und höher unterstützt dateibasierte Verschlüsselung (FBE). FBE ermöglicht die Verschlüsselung verschiedener Dateien mit unterschiedlichen Schlüsseln, die unabhängig voneinander entsperrt werden können. Diese Schlüssel werden verwendet, um sowohl Dateiinhalte als auch Dateinamen zu verschlüsseln. Bei Verwendung von FBE werden andere Informationen wie Verzeichnislayouts, Dateigrößen, Berechtigungen und Erstellungs-/Änderungszeiten nicht verschlüsselt. Zusammen werden diese anderen Informationen als Dateisystem-Metadaten bezeichnet.
Android 9 hat die Unterstützung für die Metadatenverschlüsselung eingeführt. Bei der Metadatenverschlüsselung verschlüsselt ein einzelner Schlüssel, der beim Booten vorhanden ist, alle Inhalte, die nicht von FBE verschlüsselt wurden. Dieser Schlüssel wird durch Keymaster geschützt, der wiederum durch verifiziertes Booten geschützt ist.
Metadaten - Verschlüsselung wird immer aktiviert adoptable Lagerung , wenn FBE aktiviert ist. Die Metadatenverschlüsselung kann auch im internen Speicher aktiviert werden. Bei Geräten, die mit Android 11 oder höher gestartet wurden, muss die Metadatenverschlüsselung im internen Speicher aktiviert sein.
Implementierung auf internem Speicher
Sie können Metadaten - Verschlüsselung auf dem internen Speicher von neuen Geräten durch die Einrichtung des Einrichtung metadata
- Dateisystem, die Änderung der init - Sequenz und ermöglicht Metadaten - Verschlüsselung in den Geräten fstab.
Voraussetzungen
Die Metadatenverschlüsselung kann nur eingerichtet werden, wenn die Datenpartition zum ersten Mal formatiert wird. Daher ist diese Funktion nur für neue Geräte verfügbar; Das sollte ein OTA nicht ändern.
Metadaten - Verschlüsselung erfordert , dass der dm-default-key
- Modul im Kernel aktiviert werden. In Android 11 und höher, dm-default-key
wird durch die Android gemeinsamen Kernel, Version 4.14 und höher unterstützt. Diese Version von dm-default-key
verwendet eine Hardware und herstellerunabhängige Verschlüsselung Rahmen blk-Krypto genannt.
So aktivieren Sie dm-default-key
verwenden:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
Anwendungen Inline - Verschlüsselung Hardware (Hardware , die verschlüsselt / entschlüsselt Daten , während sie auf dem Weg zum / vom Speichergerät ist) , wenn vorhanden. Wenn Sie nicht Inline - Verschlüsselung Hardware verwenden, ist es auch notwendig , einen Rückfall auf den Kernel-Kryptografie - API zu aktivieren:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Wenn keine Inline - Verschlüsselung Hardware verwenden , sollten Sie auch alle verfügbaren CPU-basierte Beschleunigung ermöglichen , wie in der empfohlenen FBE Dokumentation .
In Android 10 und niedriger, dm-default-key
wurde nicht vom Android gemeinsamen Kernel unterstützt werden . Es war daher an Lieferanten bis zu implementieren dm-default-key
.
Metadaten-Dateisystem einrichten
Da nichts in der Benutzerdatenpartition gelesen werden kann, bis der Metadatenverschlüsselungsschlüssel vorhanden ist, muss die Partitionstabelle eine separate Partition namens "Metadatenpartition" zum Speichern der Keymaster-Blobs bereitstellen, die diesen Schlüssel schützen. Die Metadatenpartition sollte 16 MB groß sein.
fstab.hardware
muss einen Eintrag für das Metadaten - Dateisystem enthält , dass Leben auf dieser Partition es bei der Montage /metadata
, einschließlich dem formattable
Flag , um sicherzustellen , es beim Booten formatiert ist. Das Dateisystem f2fs funktioniert nicht auf kleineren Partitionen; wir empfehlen stattdessen ext4 zu verwenden. Zum Beispiel:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Um sicherzustellen , dass die /metadata
- Mount - Punkt existiert, fügen Sie die folgende Zeile in BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Änderungen an der Init-Sequenz
Wenn Metadaten - Verschlüsselung verwendet wird, vold
muss ausgeführt werden , bevor /data
angebracht ist. Um sicherzustellen , dass es früh genug, fügen Sie die folgende Strophe gestartet init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster muss ausgeführt werden , und bereit , bevor init versucht zu montieren /data
.
init.hardware.rc
sollte bereits eine mount_all
Anweisung , die Halterungen /data
selbst in der on late-fs
Strophe. Vor dieser Zeile fügen Sie die Richtlinie den exec wait_for_keymaster
Service:
on late-fs … # Wait for keymaster exec_start wait_for_keymaster # Mount RW partitions which need run fsck mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
Metadatenverschlüsselung einschalten
Schließlich fügen keydirectory=/metadata/vold/metadata_encryption
zum fs_mgr_flags Spalte der fstab
- Eintrag für userdata
. Eine vollständige fstab-Zeile könnte beispielsweise so aussehen:
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable
Der Verschlüsselungsalgorithmus für Metadaten im internen Speicher ist standardmäßig AES-256-XTS. Dies kann durch die Einstellung der außer Kraft gesetzt metadata_encryption
Option, auch in der fs_mgr_flags Spalte:
- Bei Geräten , die AES - Beschleunigung fehlt Adiantum Verschlüsselung kann durch Einstellung aktiviert sein
metadata_encryption=adiantum
. - Auf Geräten , dass die Unterstützung Hardware-wrapped Tasten können der Metadaten - Verschlüsselungsschlüssel Hardware-wrapped , indem gemacht werden
metadata_encryption=aes-256-xts:wrappedkey_v0
(oder äquivalentmetadata_encryption=:wrappedkey_v0
, wieaes-256-xts
ist der Standard - Algorithmus).
Da die Kernel - Schnittstelle zu dm-default-key
in Android geändert 11, müssen Sie auch sicherstellen , dass Sie den korrekten Wert eingestellt haben PRODUCT_SHIPPING_API_LEVEL
in device.mk
. Zum Beispiel, wenn das Gerät startet mit Android 11 (API - Ebene 30), device.mk
sollte enthalten:
PRODUCT_SHIPPING_API_LEVEL := 30
Sie können auch die folgende Systemeigenschaft setzen die Verwendung des neuen zu zwingen , dm-default-key
API unabhängig API - Ebene für den Versand:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Validierung
Führen Sie die unten beschriebenen Tests aus, um zu überprüfen, ob die Metadatenverschlüsselung aktiviert ist und ordnungsgemäß funktioniert. Seien Sie auch darauf achten, die häufig gestellten Fragen im Folgenden beschrieben.
Tests
Führen Sie zunächst den folgenden Befehl aus, um zu überprüfen, ob die Metadatenverschlüsselung im internen Speicher aktiviert ist:
adb root
adb shell dmctl table userdata
Die Ausgabe sollte ähnlich sein wie:
Targets in the device-mapper table for userdata: 0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors
Wenn Sie die Standardverschlüsselungseinstellungen overrode durch die Einstellung metadata_encryption
Option in den Geräten fstab
, dann wird der Ausgang leicht von der oben abweichen. Zum Beispiel, wenn Sie aktiviert Adiantum Verschlüsselung , dann wird das dritte Feld seiner xchacha12,aes-adiantum-plain64
statt aes-xts-plain64
.
Als nächstes führen vts_kernel_encryption_test die Richtigkeit der Metadaten - Verschlüsselung und FBE zu überprüfen:
atest vts_kernel_encryption_test
oder:
vts-tradefed run vts -m vts_kernel_encryption_test
Häufige Probleme
Während des Gesprächs mount_all
, die die Metadaten verschlüsselt besteigt /data
init
führt die vdc - Tool. Die Verbindungen vdc Werkzeug vold
über binder
, die Metadaten verschlüsselt Gerät einzurichten und die Trennwand zu montieren. Für die Dauer dieser Aufforderung, init
blockiert ist , und versucht, Lese- oder Satz init
Eigenschaften wird blockiert , bis mount_all
beendet. Wenn zu diesem Zeitpunkt ein Teil vold
‚Werk direkt oder indirekt blockiert beim Lesen oder Festlegen einer Eigenschaft wird Deadlock führen. Es ist wichtig , dass , um sicherzustellen , vold
kann die Arbeit des Lesens der Schlüssel komplett, mit Keymaster Interaktion und das Datenverzeichnis Montage ohne weitere mit zusammenwirkenden init
.
Wenn Keymaster nicht vollständig gestartet , wenn mount_all
läuft, wird es nicht reagieren auf vold
bis hat es bestimmte Eigenschaften aus lesen init
, was genau in der Sackgasse beschrieben. Platzieren exec_start wait_for_keymaster
über dem jeweiligen mount_all
Aufruf , wie sie sicherstellt , dass Keymaster vollständig im Voraus ausgeführt wird , und vermeidet so aus dieser Sackgasse.
Konfiguration auf anpassungsfähigem Speicher
Da Android 9 ist eine Form von Metadaten - Verschlüsselung immer aktiviert adoptable Speicher , wenn FBE aktiviert ist, auch wenn Metadaten - Verschlüsselung nicht auf interne Speicher aktiviert ist.
In AOSP gibt es zwei Implementierungen von Metadaten - Verschlüsselung auf adoptable Speichern: ein veralteter einen auf Basis von dm-crypt
und eine neuere Version basierend auf dm-default-key
. Um sicherzustellen , dass die korrekte Umsetzung ist für das Gerät ausgewählt, stellen Sie sicher , dass Sie den korrekten Wert eingestellt haben PRODUCT_SHIPPING_API_LEVEL
in device.mk
. Zum Beispiel, wenn das Gerät startet mit Android 11 (API - Ebene 30), device.mk
sollte enthalten:
PRODUCT_SHIPPING_API_LEVEL := 30
Sie können auch die folgenden Systemeigenschaften festlegen, um die Verwendung der neuen Volume-Metadaten-Verschlüsselungsmethode (und der neuen Standardversion der FBE-Richtlinie) unabhängig von der Versand-API-Ebene zu erzwingen:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.volume.metadata.method=dm-default-key \ ro.crypto.dm_default_key.options_format.version=2 \ ro.crypto.volume.options=::v2
Aktuelle Methode
Auf Geräten mit Android 11 oder höher, Metadaten - Verschlüsselung auf adoptable Speicher verwendet den Start dm-default-key
- Kernel - Modul, genau wie auf internen Speicher. Siehe die Voraussetzungen oben für die Kernel - Konfigurationsoptionen zu aktivieren. Beachten Sie, dass Inline - Verschlüsselung Hardware , dass die Arbeiten auf dem internen Speicher des Geräts auf adoptable Lagerung nicht verfügbar sein können und somit CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
erforderlich.
Standardmäßig ist die dm-default-key
verwendet Volume - Metadaten Verschlüsselungsmethode , den AES-256-XTS - Verschlüsselungsalgorithmus mit 4096-Byte - Krypto - Sektoren. Der Algorithmus kann durch Einstellung der außer Kraft gesetzt ro.crypto.volume.metadata.encryption
Systemeigenschaft. In diesem Hause nicht Wert hat die gleiche Syntax wie die metadata_encryption
fstab Option oben beschrieben. Zum Beispiel auf Geräten , die AES - Beschleunigung fehlt, Adiantum Verschlüsselung kann durch Einstellung aktiviert sein ro.crypto.volume.metadata.encryption=adiantum
.
Legacy-Methode
Auf Geräten mit Android 10 oder niedriger Metadaten - Verschlüsselung auf adoptable Speichern verwendet den Start dm-crypt
Kernel - Modul statt dm-default-key
:
CONFIG_DM_CRYPT=y
Im Gegensatz zu dem dm-default-key
Methode, die dm-crypt
- Methode bewirkt , dass Dateiinhalt zweimal verschlüsselt werden: einmal mit einem FBE Schlüssel und einmal mit dem Metadaten - Verschlüsselungsschlüssel. Diese doppelte Verschlüsselung reduziert die Leistung und ist nicht erforderlich, um die Sicherheitsziele der Metadatenverschlüsselung zu erreichen, da Android dafür sorgt, dass FBE-Schlüssel mindestens so schwer zu kompromittieren sind wie der Metadatenverschlüsselungsschlüssel. Anbieter können Kernel - Anpassungen machen die doppelte Verschlüsselung zu vermeiden, insbesondere durch die Umsetzung allow_encrypt_override
Option , die Android passieren wird dm-crypt
, wenn die Systemeigenschaft ro.crypto.allow_encrypt_override
gesetzt ist true
. Diese Anpassungen werden vom allgemeinen Android-Kernel nicht unterstützt.
Standardmäßig ist die dm-crypt
verwendet Volume - Metadaten Verschlüsselungsmethode , den AES-128-CBC - Verschlüsselungsalgorithmus mit essiv und 512-Byte - Sektoren Krypto. Dies kann durch Setzen der folgenden Systemeigenschaften (die auch für FDE verwendet werden) überschrieben werden:
-
ro.crypto.fde_algorithm
wählt den Metadaten - Verschlüsselungsalgorithmus. Die Auswahlmöglichkeiten sindaes-128-cbc
undadiantum
. Adiantum kann nur dann , wenn das Gerät fehlt AES - Beschleunigung verwendet werden. -
ro.crypto.fde_sector_size
wählt die Krypto - Sektorgröße. Zur Auswahl stehen 512, 1024, 2048 und 4096. Verwenden Sie für die Adiantum-Verschlüsselung 4096.