Android 7.0 ve üzeri , dosya tabanlı şifrelemeyi (FBE) destekler. FBE, farklı dosyaların bağımsız olarak açılabilen farklı anahtarlarla şifrelenmesine olanak tanır. Bu anahtarlar hem dosya içeriğini hem de dosya adlarını şifrelemek için kullanılır. FBE kullanıldığında dizin düzenleri, dosya boyutları, izinler ve oluşturma/değiştirme süreleri gibi diğer bilgiler şifrelenmez. Bu diğer bilgiler toplu olarak dosya sistemi meta verileri olarak bilinir.
Android 9, meta veri şifreleme desteğini tanıttı. Meta veri şifrelemeyle, önyükleme sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen her türlü içeriği şifreler. Bu anahtar Keymaster tarafından korunur ve Keymaster da doğrulanmış önyüklemeyle korunur.
FBE etkinleştirildiğinde, benimsenebilir depolamada meta veri şifreleme her zaman etkinleştirilir. Meta veri şifrelemesi dahili depolamada da etkinleştirilebilir. Android 11 veya sonraki bir sürümle başlatılan cihazlarda dahili depolamada meta veri şifrelemenin etkinleştirilmiş olması gerekir.
Dahili depolamada uygulama
metadata
dosya sistemini kurarak, başlangıç sırasını değiştirerek ve cihazın fstab dosyasında meta veri şifrelemesini etkinleştirerek yeni cihazların dahili depolamasında meta veri şifrelemesini ayarlayabilirsiniz.
Önkoşullar
Meta veri şifrelemesi yalnızca veri bölümü ilk kez biçimlendirildiğinde ayarlanabilir. Sonuç olarak bu özellik yalnızca yeni cihazlar içindir; Bu bir OTA'nın değiştirmesi gereken bir şey değil.
Meta veri şifrelemesi, çekirdeğinizde dm-default-key
modülünün etkinleştirilmesini gerektirir. Android 11 ve üzeri sürümlerde, dm-default-key
Android ortak çekirdekleri, sürüm 4.14 ve üzeri tarafından desteklenir. dm-default-key
bu sürümü , blk-crypto adı verilen donanımdan ve satıcıdan bağımsız bir şifreleme çerçevesi kullanır.
dm-default-key
etkinleştirmek için şunu kullanın:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
mevcut olduğunda satır içi şifreleme donanımını (depolama aygıtına giderken/aygıttan ayrılırken verileri şifreleyen/şifresini çözen donanım) kullanır. Satır içi şifreleme donanımını kullanmayacaksanız çekirdeğin şifreleme API'sine geri dönüşü etkinleştirmeniz de gereklidir:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Satır içi şifreleme donanımını kullanmadığınızda, FBE belgelerinde önerildiği gibi mevcut herhangi bir CPU tabanlı hızlandırmayı da etkinleştirmelisiniz.
Android 10 ve önceki sürümlerde dm-default-key
Android ortak çekirdeği tarafından desteklenmiyordu. Bu nedenle dm-default-key
uygulamak satıcılara kalmıştı.
Meta veri dosya sistemini ayarlama
Meta veri şifreleme anahtarı mevcut olana kadar kullanıcı verileri bölümündeki hiçbir şey okunamayacağından, bölüm tablosunun, bu anahtarı koruyan anahtar yöneticisi bloblarını depolamak için "meta veri bölümü" adı verilen ayrı bir bölüm ayırması gerekir. Meta veri bölümü 16 MB olmalıdır.
fstab.hardware
önyükleme sırasında biçimlendirildiğinden emin olmak için formattable
işaret de dahil olmak üzere, onu /metadata
konumuna monte ederek o bölümde yaşayan meta veri dosya sistemi için bir giriş içermelidir. f2fs dosya sistemi daha küçük bölümlerde çalışmaz; bunun yerine ext4 kullanmanızı öneririz. Örneğin:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
/metadata
bağlama noktasının mevcut olduğundan emin olmak için BoardConfig-common.mk
dosyasına aşağıdaki satırı ekleyin:
BOARD_USES_METADATA_PARTITION := true
Başlatma sırasındaki değişiklikler
Meta veri şifrelemesi kullanıldığında, /data
bağlanmadan önce vold
çalışıyor olmalıdır. Yeterince erken başlatıldığından emin olmak için init.hardware.rc
dosyasına aşağıdaki kıtayı ekleyin:
# We need vold early for metadata encryption on early-fs start vold
init'in /data
bağlama girişiminde bulunmasından önce Keymaster'ın çalışıyor ve hazır olması gerekir.
init.hardware.rc
zaten /data
kendisini on late-fs
kıtasına bağlayan bir mount_all
talimatı içermelidir. Bu satırın öncesine wait_for_keymaster
hizmetini yürütmek için yönergeyi ekleyin:
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
Meta veri şifrelemeyi açma
Son olarak userdata
için fstab
girişinin fs_mgr_flags sütununa keydirectory=/metadata/vold/metadata_encryption
ekleyin. Örneğin, tam bir fstab satırı şöyle görünebilir:
/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
Varsayılan olarak dahili depolamadaki meta veri şifreleme algoritması AES-256-XTS'dir. Bu, ayrıca fs_mgr_flags sütununda metadata_encryption
seçeneği ayarlanarak geçersiz kılınabilir:
- AES hızlandırması olmayan cihazlarda Adiantum şifrelemesi
metadata_encryption=adiantum
yapılarak etkinleştirilebilir. - Donanımla sarılmış anahtarları destekleyen cihazlarda, meta veri şifreleme anahtarı,
metadata_encryption=aes-256-xts:wrappedkey_v0
(veya eşdeğer olarakmetadata_encryption=:wrappedkey_v0
,aes-256-xts
varsayılan algoritma olduğundan) ayarlanarak donanımla sarılmış hale getirilebilir.
Android 11'de dm-default-key
çekirdek arayüzü değiştiğinden dolayı, device.mk
dosyasında PRODUCT_SHIPPING_API_LEVEL
için doğru değeri ayarladığınızdan da emin olmanız gerekir. Örneğin, cihazınız Android 11 (API düzeyi 30) ile başlatılıyorsa, device.mk
şunları içermelidir:
PRODUCT_SHIPPING_API_LEVEL := 30
Gönderim API düzeyine bakılmaksızın yeni dm-default-key
API'sinin kullanımını zorunlu kılmak için aşağıdaki sistem özelliğini de ayarlayabilirsiniz:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Doğrulama
Meta veri şifrelemenin etkinleştirildiğini ve düzgün çalıştığını doğrulamak için aşağıda açıklanan testleri çalıştırın. Ayrıca aşağıda açıklanan genel sorunlara da dikkat edin.
Testler
Dahili depolamada meta veri şifrelemenin etkinleştirildiğini doğrulamak için aşağıdaki komutu çalıştırarak başlayın:
adb root
adb shell dmctl table userdata
Çıktı şuna benzer olmalıdır:
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
Aygıtın fstab
dosyasındaki metadata_encryption
seçeneğini ayarlayarak varsayılan şifreleme ayarlarını geçersiz kıldıysanız, çıktı yukarıdakilerden biraz farklı olacaktır. Örneğin, Adiantum şifrelemesini etkinleştirdiyseniz üçüncü alan aes-xts-plain64
yerine xchacha12,aes-adiantum-plain64
olacaktır.
Ardından, meta veri şifrelemesinin ve FBE'nin doğruluğunu doğrulamak için vts_kernel_encryption_test komutunu çalıştırın:
atest vts_kernel_encryption_test
veya:
vts-tradefed run vts -m vts_kernel_encryption_test
Ortak sorunlar
Meta veri şifreli /data
bölümünü bağlayan mount_all
çağrısı sırasında init
, vdc aracını çalıştırır. vdc aracı, meta veri şifreli aygıtı kurmak ve bölümü monte etmek için vold
over binder
bağlanır. Bu çağrı süresince init
engellenir ve init
özelliklerini okuma veya ayarlama girişimleri mount_all
bitene kadar engellenir. Bu aşamada vold
çalışmasının herhangi bir kısmı, bir özelliğin okunması veya ayarlanması sırasında doğrudan veya dolaylı olarak engellenirse, kilitlenme ortaya çıkar. Vold'un anahtarları okuma, Keymaster ile etkileşim kurma ve veri dizinini init
ile daha fazla etkileşime girmeden vold
işini tamamlayabilmesini sağlamak önemlidir.
Keymaster mount_all
çalıştırıldığında tam olarak başlatılmamışsa, init
belirli özellikleri okuyana kadar vold
yanıt vermeyecektir ve bu da tam olarak açıklanan kilitlenme ile sonuçlanacaktır. exec_start wait_for_keymaster
belirtildiği gibi ilgili mount_all
çağrısının üstüne yerleştirmek, Keymaster'ın önceden tam olarak çalışmasını sağlar ve böylece bu kilitlenmeyi önler.
Benimsenebilir depolamada yapılandırma
Android 9'dan bu yana, dahili depolamada meta veri şifrelemesi etkinleştirilmese bile, FBE etkinleştirildiğinde benimsenebilir depolamada bir tür meta veri şifrelemesi her zaman etkinleştirilir.
AOSP'de, benimsenebilir depolamada meta veri şifrelemenin iki uygulaması vardır: dm-crypt
temel alan kullanımdan kaldırılmış bir uygulama ve dm-default-key
temel alan daha yeni bir uygulama. Cihazınız için doğru uygulamanın seçildiğinden emin olmak amacıyla, device.mk
dosyasında PRODUCT_SHIPPING_API_LEVEL
için doğru değeri ayarladığınızdan emin olun. Örneğin, cihazınız Android 11 (API düzeyi 30) ile başlatılıyorsa, device.mk
şunları içermelidir:
PRODUCT_SHIPPING_API_LEVEL := 30
Ayrıca, gönderim API düzeyine bakılmaksızın yeni birim meta veri şifreleme yönteminin (ve yeni varsayılan FBE ilkesi sürümünün) kullanımını zorunlu kılmak için aşağıdaki sistem özelliklerini de ayarlayabilirsiniz:
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
Mevcut yöntem
Android 11 veya sonraki bir sürümle başlatılan cihazlarda, benimsenebilir depolamadaki meta veri şifrelemesi, tıpkı dahili depolamada olduğu gibi dm-default-key
çekirdek modülünü kullanır. Hangi çekirdek yapılandırma seçeneklerinin etkinleştirileceğine ilişkin yukarıdaki önkoşullara bakın. Cihazın dahili deposunda çalışan satır içi şifreleme donanımının benimsenebilir depolamada kullanılamayabileceğini ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
gerekebileceğini unutmayın.
Varsayılan olarak, dm-default-key
birim meta veri şifreleme yöntemi, 4096 baytlık kripto sektörleriyle AES-256-XTS şifreleme algoritmasını kullanır. Algoritma, ro.crypto.volume.metadata.encryption
sistem özelliği ayarlanarak geçersiz kılınabilir. Bu özelliğin değeri yukarıda açıklanan metadata_encryption
fstab seçeneğiyle aynı sözdizimine sahiptir. Örneğin, AES hızlandırması olmayan cihazlarda Adiantum şifrelemesi , ro.crypto.volume.metadata.encryption=adiantum
ayarı yapılarak etkinleştirilebilir.
Eski yöntem
Android 10 veya daha düşük bir sürümle başlatılan cihazlarda, benimsenebilir depolamadaki meta veri şifrelemesi dm-default-key
yerine dm-crypt
çekirdek modülünü kullanır:
CONFIG_DM_CRYPT=y
dm-default-key
yönteminden farklı olarak dm-crypt
yöntemi, dosya içeriğinin iki kez şifrelenmesine neden olur: bir kez FBE anahtarıyla ve bir kez meta veri şifreleme anahtarıyla. Bu çift şifreleme performansı azaltır ve Android, FBE anahtarlarının en az meta veri şifreleme anahtarı kadar tehlikeye atılmasının zor olmasını sağladığından, meta veri şifrelemenin güvenlik hedeflerine ulaşmak için gerekli değildir. Satıcılar, özellikle ro.crypto.allow_encrypt_override
sistem özelliği true
olarak ayarlandığında Android'in dm-crypt
ileteceği allow_encrypt_override
seçeneğini uygulayarak çift şifrelemeyi önlemek için çekirdek özelleştirmeleri yapabilir. Bu özelleştirmeler Android ortak çekirdeği tarafından desteklenmez.
Varsayılan olarak dm-crypt
birim meta veri şifreleme yöntemi, ESSIV ve 512 baytlık kripto sektörleriyle AES-128-CBC şifreleme algoritmasını kullanır. Bu, aşağıdaki sistem özellikleri (FDE için de kullanılır) ayarlanarak geçersiz kılınabilir:
-
ro.crypto.fde_algorithm
meta veri şifreleme algoritmasını seçer. Seçenekleraes-128-cbc
veadiantum
. Adiantum yalnızca cihazda AES hızlandırması yoksa kullanılabilir. -
ro.crypto.fde_sector_size
kripto sektörü boyutunu seçer. Seçenekler 512, 1024, 2048 ve 4096'dır. Adiantum şifrelemesi için 4096'yı kullanın.