Android 7.0 und höher unterstützt Dateibasierte Verschlüsselung (File-based Encryption, FBE). FBE lässt zu, dass verschiedene Dateien mit verschiedenen Schlüsseln verschlüsselt werden, die entsperrt werden können unabhängig voneinander unterscheiden. Mit diesen Schlüsseln werden sowohl Dateiinhalte als auch Dateinamen verschlüsselt. Wenn FBE verwendet wird, können auch andere Informationen wie Verzeichnislayouts, Dateigrößen, Berechtigungen und Erstellungs-/Änderungszeiten werden nicht verschlüsselt. Gemeinsam werden diese Informationen als Dateisystemmetadaten bezeichnet.
Mit Android 9 wurde die Metadatenverschlüsselung unterstützt. Bei der Metadatenverschlüsselung wird mit einem einzigen Schlüssel beim Booten alles verschlüsselt, Der Inhalt wird nicht von FBE verschlüsselt. Dieser Schlüssel wird durch Keymaster geschützt, der wird durch den verifizierten Bootmodus geschützt.
Die Metadatenverschlüsselung ist im adoptierbaren Speicher immer aktiviert, wenn FBE aktiviert ist. Die Metadatenverschlüsselung kann auch im internen Speicher aktiviert werden. Auf den Markt gebrachte Geräte mit Android 11 oder höher muss Metadatenverschlüsselung haben im internen Speicher aktiviert.
Implementierung auf internem Speicher
Sie können die Metadatenverschlüsselung im internen Speicher neuer Geräte einrichten, indem Sie
Einrichten des Dateisystems metadata
, Ändern der Initialisierungssequenz und
Metadatenverschlüsselung in der fstab-Datei des Geräts aktivieren
Voraussetzungen
Die Metadatenverschlüsselung kann nur eingerichtet werden, wenn die Datenpartition zuerst ist formatiert sind. Daher ist diese Funktion nur für neue Geräte verfügbar. das ist nicht das ein Onlinereisebüro ändern sollte.
Für die Metadatenverschlüsselung muss das Modul dm-default-key
die in Ihrem Kernel aktiviert sind. Unter Android 11 und höher
dm-default-key
wird von den gängigen Android-Kerneln Version unterstützt
4.14 und höher. Diese Version von dm-default-key
verwendet Hardware und
herstellerunabhängiges Verschlüsselungs-Framework namens blk-crypto.
Verwenden Sie Folgendes, um dm-default-key
zu aktivieren:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
verwendet Inline-Verschlüsselungshardware (Hardware, die
verschlüsselt/entschlüsselt Daten auf dem Weg zum/vom Speichergerät), wenn
verfügbar. Wenn Sie keine Inline-Verschlüsselungshardware verwenden, ist es
Außerdem ist es erforderlich, ein Fallback auf die Cryptography API des Kernels zu aktivieren:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Wenn Sie keine Inline-Verschlüsselungshardware verwenden, sollten Sie auch alle verfügbaren CPU-basierte Beschleunigung, wie in der FBE-Dokumentation empfohlen.
Unter Android 10 und niedriger: dm-default-key
wurde vom allgemeinen Android-Kernel nicht unterstützt. Daher ließen sich die Zulieferunternehmen
um dm-default-key
zu implementieren.
Metadatendateisystem einrichten
Weil nichts in der Nutzerdatenpartition gelesen werden kann, bis die Metadaten Verschlüsselungsschlüssel vorhanden ist, muss die Partitionstabelle einen separaten Partition namens „Metadatenpartition“ zum Speichern der Keymaster-BLOBs, um diesen Schlüssel zu schützen. Die Metadatenpartition sollte 16 MB groß sein.
fstab.hardware
muss einen Eintrag für das Metadatendateisystem enthalten
die auf dieser Partition gespeichert ist und sie unter /metadata
bereitstellt, einschließlich
Das Flag formattable
, damit es beim Booten formatiert wird. Die
Das f2fs-Dateisystem funktioniert nicht auf kleineren Partitionen. empfehlen wir ext4
. Beispiel:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Fügen Sie die folgende Zeile hinzu, damit der Bereitstellungspunkt /metadata
vorhanden ist
an BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Änderungen an der Init-Sequenz
Wenn Metadatenverschlüsselung verwendet wird, muss vold
ausgeführt werden, bevor
/data
wurde bereitgestellt. Fügen Sie
folgende Stanza in init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster muss aktiv und bereit sein, bevor init versucht wird, die Datei bereitzustellen
/data
init.hardware.rc
sollte bereits mount_all
enthalten.
Anweisung, die /data
selbst in der on
late-fs
-Stanza bereitstellt. Fügen Sie vor dieser Zeile die Anweisung ein, um die
Dienst wait_for_keymaster
:
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 aktivieren
Fügen Sie schließlich keydirectory=/metadata/vold/metadata_encryption
zum
Spalte fs_mgr_flags des Eintrags fstab
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
Standardmäßig ist der Metadaten-Verschlüsselungsalgorithmus im internen Speicher
AES-256-XTS. Dies kann überschrieben werden, indem das Attribut
metadata_encryption
, auch in der
fs_mgr_flags angeben:
- Auf Geräten ohne AES-Beschleunigung ist die Adiantum-Verschlüsselung möglicherweise
durch Festlegen von
metadata_encryption=adiantum
aktiviert. - Auf Geräten, die hardwareverpackte Schlüssel unterstützen:
kann der Metadatenverschlüsselungsschlüssel hardwareverpackt sein, indem er Folgendes festlegt:
metadata_encryption=aes-256-xts:wrappedkey_v0
(oder entsprechendmetadata_encryption=:wrappedkey_v0
, wieaes-256-xts
ist der Standardalgorithmus.
Weil sich die Kernel-Schnittstelle zu dm-default-key
in Android geändert hat
11 festgelegt ist, müssen Sie auch sicherstellen, dass die
richtiger Wert für PRODUCT_SHIPPING_API_LEVEL
in
device.mk
Beispiel: Wenn Ihr Gerät mit Android gestartet wird,
11 (API-Level 30), device.mk
sollte
enthalten:
PRODUCT_SHIPPING_API_LEVEL := 30
Sie können auch die folgende Systemeigenschaft festlegen, um die Verwendung des neuen
dm-default-key
API unabhängig vom Versand-API-Level:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Zertifizierungsstufe
Um zu überprüfen, ob die Metadatenverschlüsselung aktiviert ist und korrekt funktioniert, führen Sie den die nachfolgend beschriebenen Tests durchführen. Beachten Sie außerdem die häufigen beschrieben.
Tests
Führen Sie zuerst den folgenden Befehl aus, um zu prüfen, ob die Metadatenverschlüsselung im internen Speicher aktiviert:
adb root
adb shell dmctl table userdata
Die Ausgabe sollte in etwa so aussehen:
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 durch Festlegen des
Option metadata_encryption
in der fstab
auf dem Gerät und dann
weicht die Ausgabe geringfügig von der obigen Beschreibung ab. Wenn Sie beispielsweise die Adiantum-Verschlüsselung aktiviert haben, wird die dritte
wird xchacha12,aes-adiantum-plain64
anstelle von
aes-xts-plain64
.
Führen Sie als Nächstes vts_kernel_encryption_test aus. um die Richtigkeit der Metadatenverschlüsselung und des FBE zu prüfen:
atest vts_kernel_encryption_test
oder:
vts-tradefed run vts -m vts_kernel_encryption_test
Häufige Probleme
Während des Aufrufs von mount_all
, wodurch die mit Metadaten verschlüsselten Daten bereitgestellt werden
/data
-Partition führt init
das vdc-Tool aus. VDC
wird über binder
mit vold
verbunden, um den
mit Metadaten verschlüsselt und die Partition wird bereitgestellt. Für die Dauer dieses
Anruf blockiert, init
wird blockiert und versucht, die Einstellungen
init
Unterkünfte werden blockiert, bis mount_all
abgeschlossen ist.
Wenn zu diesem Zeitpunkt ein Teil der Arbeit von vold
direkt oder
das Lesen oder Festlegen einer Eigenschaft indirekt blockiert ist, kommt es zu einem Deadlock. Es ist
ist wichtig, damit vold
die Lesematerialien
Schlüssel, Interaktion mit Keymaster und Bereitstellen des Datenverzeichnisses ohne
weitere Interaktionen mit init
.
Wenn Keymaster beim Ausführen von mount_all
nicht vollständig gestartet wird, wird er nicht
auf vold
antworten, bis bestimmte Eigenschaften aus
init
, was genau zum beschriebenen Deadlock führt. Wird platziert
exec_start wait_for_keymaster
über dem relevanten
Mit dem festgelegten mount_all
-Aufruf wird sichergestellt, dass Keymaster vollständig
damit dieses Deadlock vermieden wird.
Konfiguration für verwendbaren Speicher
Seit Android 9 ist eine Form der Metadatenverschlüsselung immer aktiviert, adaptiver Speicher aktiviert wenn FBE aktiviert ist, auch wenn die Metadatenverschlüsselung nicht aktiviert ist internen Speicher.
Bei AOSP gibt es zwei Implementierungen der Metadatenverschlüsselung
Speicher: ein veralteter Speicher basierend auf dm-crypt
und ein neuerer Speicher
am dm-default-key
. Um sicherzustellen, dass die richtige Implementierung
für Ihr Gerät ausgewählt haben, vergewissern Sie sich, dass Sie den richtigen Wert für
PRODUCT_SHIPPING_API_LEVEL
in device.mk
. Beispiel:
wenn auf deinem Gerät Android 11 (API-Level 30) installiert ist,
device.mk
sollte Folgendes enthalten:
PRODUCT_SHIPPING_API_LEVEL := 30
Sie können auch die folgenden Systemeigenschaften festlegen, um die Verwendung des neuen Verschlüsselungsmethode für Volume-Metadaten (und die neue FBE-Standardrichtlinienversion) unabhängig vom Versand-API-Level:
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
Die Metadatenverschlüsselung im akzeptablen Speicher verwendet die dm-default-key
genau wie beim internen Speicher. Welche Kernel-Konfiguration festgelegt ist, erfahren Sie in den Voraussetzungen oben.
zu aktivieren. Beachten Sie, dass die Inline-Verschlüsselungshardware auf dem
ist der interne Speicher des Geräts möglicherweise nicht verfügbar.
Eventuell ist die Angabe von CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
erforderlich.
Standardmäßig wird mit der Verschlüsselungsmethode für Volume-Metadaten dm-default-key
verwendet den Verschlüsselungsalgorithmus AES-256-XTS mit 4.096-Byte-Kryptosektoren. Die
kann überschrieben werden, indem das Attribut
Systemeigenschaft ro.crypto.volume.metadata.encryption
. Dieses
Der Wert des Attributs hat dieselbe Syntax wie der metadata_encryption
-Wert
die oben beschriebene fstab-Option. Zum Beispiel auf Geräten ohne AES-Verschlüsselung.
Beschleunigung, Adiantum-Verschlüsselung
kann aktiviert werden, indem
ro.crypto.volume.metadata.encryption=adiantum
Legacy-Methode
Auf Geräten, die mit Android 10 oder niedriger auf den Markt kommen,
Die Verschlüsselung des akzeptablen Speichers verwendet das Kernelmodul dm-crypt
statt dm-default-key
:
CONFIG_DM_CRYPT=y
Im Gegensatz zur Methode dm-default-key
wird mit der Methode dm-crypt
bewirkt, dass der Dateiinhalt zweimal verschlüsselt wird: einmal mit einem FBE-Schlüssel und einmal mit
Metadatenverschlüsselungsschlüssel. Diese doppelte Verschlüsselung verringert die Leistung und ist
nicht erforderlich, um die Sicherheitsziele der
Metadatenverschlüsselung zu erreichen, da Android
stellt sicher, dass FBE-Schlüssel mindestens so schwer zu manipulieren sind wie die Metadaten
Verschlüsselungsschlüssel. Anbieter können Kernel-Anpassungen vornehmen, um doppelte
Verschlüsselung, insbesondere durch die Implementierung der
allow_encrypt_override
-Option, an die Android übergeben wird
dm-crypt
, wenn die Systemeigenschaft
ro.crypto.allow_encrypt_override
ist auf true
eingestellt.
Diese Anpassungen werden vom allgemeinen Android-Kernel nicht unterstützt.
Standardmäßig verwendet die Verschlüsselungsmethode für Volume-Metadaten dm-crypt
die Methode
AES-128-CBC-Verschlüsselungsalgorithmus mit ESSIV und 512-Byte-Kryptosektoren. Dieses
kann überschrieben werden, indem die folgenden Systemeigenschaften festgelegt werden (die ebenfalls
verwendet für FDE):
ro.crypto.fde_algorithm
zum Auswählen der Metadatenverschlüsselung Algorithmus. Zur Auswahl stehenaes-128-cbc
undadiantum
. Adiantum darf nur verwendet werden, wenn der Parameter keine AES-Beschleunigung.ro.crypto.fde_sector_size
wählt die Größe des Kryptosektors aus. Zur Auswahl stehen 512, 1024, 2048 und 4096. Verwenden Sie für die Adiantum-Verschlüsselung 4096.