Android 7.0 ve sonraki sürümlerde dosya tabanlı şifreleme (FBE) desteklenir. FBE, farklı dosyaların bağımsız olarak kilidi açılabilen farklı anahtarlarla şifrelenmesine olanak tanır. Bu anahtarlar hem dosya içeriklerini 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 zamanları gibi diğer bilgiler şifrelenmez. Bu diğer bilgiler toplu olarak dosya sistemi meta verileri olarak bilinir.
Android 9, meta veri şifreleme desteğini kullanıma sundu. Meta veri şifreleme ile, başlatma sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen tüm içerikleri şifreler. Bu anahtar, KeyMint (eski adıyla Keymaster) tarafından korunur. KeyMint ise Doğrulanmış Önyükleme tarafından korunur.
FBE etkinleştirildiğinde dahili hale getirilebilir depolama alanında meta veri şifreleme her zaman etkindir. Meta veri şifrelemesi, dahili depolama biriminde de etkinleştirilebilir. Android 11 veya sonraki sürümlerle kullanıma sunulan cihazlarda dahili depolama alanında meta veri şifreleme etkin olmalıdır.
Dahili depolama biriminde uygulama
Yeni cihazların dahili depolama alanında meta veri şifrelemeyi ayarlamak için metadata dosya sistemini ayarlayabilir, başlatma sırasını değiştirebilir ve cihazın fstab dosyasında meta veri şifrelemeyi etkinleştirebilirsiniz.
Ön koşullar
Meta veri şifreleme yalnızca veri bölümü ilk kez biçimlendirilirken ayarlanabilir. Bu nedenle, bu özellik yalnızca yeni cihazlarda kullanılabilir. OTA ile değiştirilemez.
Meta veri şifreleme için çekirdeğinizde dm-default-key modülünün etkinleştirilmesi gerekir. Android 11 ve sonraki sürümlerde,
dm-default-key, Android ortak çekirdekleri sürüm 4.14 ve sonraki sürümler tarafından desteklenir. Bu dm-default-key sürümü, blk-crypto adlı donanımdan ve satıcıdan bağımsız bir şifreleme çerçevesi kullanır.
dm-default-key özelliğini etkinleştirmek için:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key, kullanılabilir olduğunda satır içi şifreleme donanımını (verileri depolama cihazına giderken/gelirken şifreleyen/şifresini çözen donanım) kullanır. Satır içi şifreleme donanımı kullanmıyorsanız çekirdeğin kriptografi API'sine geri dönüşü de etkinleştirmeniz gerekir:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Satır içi şifreleme donanımı kullanılmadığında FBE belgelerinde önerildiği gibi mevcut CPU tabanlı hızlandırmayı da etkinleştirmeniz gerekir.
Android 10 ve önceki sürümlerde dm-default-key
Android ortak çekirdeği tarafından desteklenmiyordu. Bu nedenle, dm-default-key'yı uygulamak satıcıların sorumluluğundaydı.
Meta veri dosya sistemini ayarlama
Meta veri şifreleme anahtarı mevcut olana kadar kullanıcı verileri bölümündeki hiçbir şey okunamadığından, bölüm tablosu bu anahtarı koruyan KeyMint blob'larını depolamak için meta veri bölümü adlı ayrı bir bölüm ayırmalıdır. Meta veri bölümü 16 MB olmalıdır.
fstab.hardware, önyükleme sırasında biçimlendirilmesini sağlamak için formattable işaretini de içerecek şekilde, /metadata konumunda bağlanan bölümdeki 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 şifreleme kullanıldığında vold, /data bağlanmadan önce çalışıyor olmalıdır. Yeterince erken başlatıldığından emin olmak için init.hardware.rc dosyasına aşağıdaki bölümü ekleyin:
# We need vold early for metadata encryption
on early-fs
start vold
init, bağlama girişiminde bulunmadan önce KeyMint çalışır durumda ve hazır olmalıdır
/data.
init.hardware.rc, /data öğesini on
late-fs bölümüne monte eden bir mount_all
talimatını zaten içermelidir. Bu satırdan önce, wait_for_keymaster hizmetini yürütme yönergesini 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 etkinleştirme
Son olarak, keydirectory=/metadata/vold/metadata_encryption değerini userdata için fstab girişinin fs_mgr_flags sütununa ekleyin. Örneğin, tam bir fstab satırı şu şekilde 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
Dahili depolama alanındaki meta veri şifreleme algoritması varsayılan olarak AES-256-XTS'dir. Bu, metadata_encryption seçeneği ayarlanarak da geçersiz kılınabilir. Bu seçenek de fs_mgr_flags sütunundadır:
- AES hızlandırması olmayan cihazlarda Adiantum şifrelemesi,
metadata_encryption=adiantumayarlanarak etkinleştirilebilir. Donanım sarmalı satır içi şifreleme anahtarlarını destekleyen cihazlarda, meta veri şifreleme anahtarı
metadata_encryption=aes-256-xts:wrappedkeyveyametadata_encryption=aes-256-xts:wrappedkey_v0ayarlanarak donanım sarmalı hale getirilebilir.wrappedkeymodern sürümdür.wrappedkey_v0yalnızcawrappedkey'yı desteklemeyen veyawrappedkey_v0ile kullanıma sunulan cihazlarda kullanılmalıdır. Daha fazla bilgi için Sarmalanmış anahtarları etkinleştirme başlıklı makaleyi inceleyin.Her iki durumda da
aes-256-xts, varsayılan algoritma olduğundan atlanabilir. Örneğin,metadata_encryption=:wrappedkey,metadata_encryption=aes-256-xts:wrappedkeyile eşdeğerdir.
Android 11'de dm-default-key çekirdek arayüzü değiştiğinden device.mk içinde 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 kullanıma sunuluyorsa device.mk şunları içermelidir:
PRODUCT_SHIPPING_API_LEVEL := 30
Kargo API düzeyi ne olursa olsun yeni dm-default-key API'nin kullanılmasını zorlamak 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 doğru şekilde çalıştığını doğrulamak için aşağıda açıklanan testleri çalıştırın. Ayrıca, aşağıda açıklanan sık karşılaşılan sorunlara da dikkat edin.
Testler
Dahili depolama alanında meta veri şifrelemenin etkinleştirildiğini doğrulamak için aşağıdaki komutu çalıştırarak başlayın:
adb rootadb shell dmctl table userdata
Çıkış ş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
Cihazın metadata_encryption bölümünde fstab seçeneğini ayarlayarak varsayılan şifreleme ayarlarını geçersiz kıldıysanız çıkış yukarıdakinden biraz farklı olur. Örneğin, Adiantum şifrelemeyi etkinleştirdiyseniz üçüncü alan aes-xts-plain64 yerine xchacha12,aes-adiantum-plain64 olur.
Ardından, meta veri şifreleme ve FBE'nin doğruluğunu doğrulamak için vts_kernel_encryption_test'i çalıştırın:
atest vts_kernel_encryption_test
veya:
vts-tradefed run vts -m vts_kernel_encryption_test
Genel sorunlar
Meta veri şifreli mount_all bölümünü bağlayan /data çağrısı sırasında init, vdc aracını yürütür. vdc
aracı, meta verileri şifrelenmiş cihazı ayarlamak ve bölümü bağlamak için binder üzerinden vold'ya bağlanır. Bu görüşme süresince init engellenir ve init özelliklerini okuma veya ayarlama girişimleri, mount_all tamamlanana kadar engellenir.
Bu aşamada, vold'nın çalışmasının herhangi bir bölümü doğrudan veya dolaylı olarak bir özelliği okuma ya da ayarlama konusunda engellenirse kilitlenme oluşur. vold'nın, anahtarları okuma, KeyMint ile etkileşim kurma ve veri dizinini bağlama işlemlerini init ile daha fazla etkileşim kurmadan tamamlayabildiğinden emin olmak önemlidir.
mount_all çalıştırıldığında KeyMint tam olarak başlatılmamışsa init'den belirli özellikler okunana kadar vold'ye yanıt vermez. Bu da tam olarak açıklanan kilitlenmeye neden olur. exec_start wait_for_keymaster'yı, belirtildiği gibi ilgili mount_all çağrının üzerine yerleştirmek, KeyMint'in önceden tam olarak çalışmasını sağlar ve bu nedenle bu kilitlenmeyi önler.
Dahili hale getirilebilir depolama alanında yapılandırma
Android 9'dan beri, FBE etkinleştirildiğinde dahili hale getirilebilir depolama alanında her zaman bir meta veri şifreleme biçimi etkinleştirilir. Bu, meta veri şifreleme dahili depolama alanında etkinleştirilmemiş olsa bile geçerlidir.
AOSP'de, harici depolama alanında meta veri şifrelemenin iki uygulaması vardır: dm-crypt tabanlı olan ve dm-default-key tabanlı olan. Cihazınız için doğru uygulamanın seçildiğinden emin olmak üzere device.mk içinde 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 kullanıma sunuluyorsa device.mk şunları içermelidir:
PRODUCT_SHIPPING_API_LEVEL := 30
Ayrıca, gönderim API düzeyinden bağımsız olarak yeni birim meta verileri şifreleme yönteminin (ve yeni varsayılan FBE politika sürümünün) kullanılması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 sürümlerle kullanıma sunulan cihazlarda, dahili hale getirilebilir depolama alanında meta veri şifrelemesi, dahili depolama alanında olduğu gibi, dm-default-key çekirdek modülünü kullanır. Hangi çekirdek yapılandırma seçeneklerinin etkinleştirileceğiyle ilgili ön koşullar için yukarıya bakın. Cihazın dahili depolama alanında çalışan satır içi şifreleme donanımının, uyarlanabilir depolama alanında kullanılamayabileceğini ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y gerekebileceğini unutmayın.
Varsayılan olarak, dm-default-key birim meta verileri şifreleme yöntemi, 4096 baytlık kripto sektörleriyle AES-256-XTS şifreleme algoritmasını kullanır. ro.crypto.volume.metadata.encryption sistem özelliği ayarlanarak algoritma geçersiz kılınabilir. Bu özelliğin değeri, yukarıda açıklanan metadata_encryption
fstab seçeneğiyle aynı söz dizimine sahiptir. Örneğin, AES hızlandırması olmayan cihazlarda Adiantum şifrelemesi, ro.crypto.volume.metadata.encryption=adiantum ayarlanarak etkinleştirilebilir.
Eski yöntem
Android 10 ve önceki sürümlerle kullanıma sunulan cihazlarda, dahili hale getirilebilir depolama alanındaki meta veri şifreleme işlemi dm-default-key yerine dm-crypt çekirdek modülünü kullanır:
CONFIG_DM_CRYPT=y
dm-default-key yönteminin aksine, dm-crypt yöntemi dosya içeriklerinin iki kez şifrelenmesine neden olur: bir kez FBE anahtarıyla, bir kez de meta veri şifreleme anahtarıyla. Bu çift şifreleme, performansı düşürür ve Android, FBE anahtarlarının meta veri şifreleme anahtarı kadar zor ele geçirilebilmesini sağladığından meta veri şifrelemenin güvenlik hedeflerine ulaşmak için gerekli değildir. Satıcılar, özellikle sistem özelliği ro.crypto.allow_encrypt_override, true olarak ayarlandığında Android'in dm-crypt'ye ilettiğ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 verileri ş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 ayarlanarak geçersiz kılınabilir (bu özellikler FDE için de kullanılır):
ro.crypto.fde_algorithm, meta veri şifreleme algoritmasını seçer. Seçenekleraes-128-cbcveadiantum'dir. Adiantum yalnızca cihazda AES hızlandırma özelliği 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.