Android 7.0 ve sonraki sürümler 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ç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 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 kullanıma sundu. Meta veri şifreleme sayesinde, başlatma sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen içerikleri şifreler. Bu anahtar, Keymaster tarafından korunur. Keymaster da doğrulanmış önyükleme tarafından korunur.
FBE her etkinleştirildiğinde, kabul edilebilir depolama alanında meta veri şifreleme her zaman etkindir. Meta veri şifreleme, dahili depolama alanında da etkinleştirilebilir. Android 11 veya sonraki sürümlerin yüklü olduğu cihazlarda dahili depolamada meta veri şifreleme etkinleştirilmiş olmalıdır.
Dahili depolamaya uygulama
metadata
dosya sistemini ayarlayarak, init sırasını değiştirerek ve cihazın fstab dosyasında meta veri şifrelemeyi etkinleştirerek yeni cihazların dahili depolama alanında meta veri şifrelemeyi ayarlayabilirsiniz.
Ön koşullar
Meta veri şifreleme, yalnızca veri bölümü ilk biçimlendirildiğinde ayarlanabilir. Bu nedenle, bu özellik yalnızca yeni cihazlar içindir ve OTA'da değiştirilemez.
Meta veri şifreleme, çekirdeğinizde dm-default-key
modülünün etkinleştirilmesini gerektirir. dm-default-key
, Android 11 ve sonraki sürümlerde Android'in ortak çekirdekleri olan 4.14 ve sonraki sürümlerde desteklenir. dm-default-key
'ün bu sürümü, blk-crypto adlı donanım ve tedarikçiye bağımlı olmayan bir şifreleme çerçevesi kullanır.
dm-default-key
özelliğini 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
, mümkün olduğunda satır içi şifreleme donanımı (veriler depolama cihazına giderken veya depolama cihazından çıkarken verileri şifreleyen/şifre çözen donanım) kullanır. Satır içi şifreleme donanımı kullanmıyorsanız çekirdeğin kriptografi API'sine yedekleme seçeneğini etkinleştirmeniz de gerekir:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Satır içi şifreleme donanımı kullanmıyorsanız 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 desteklenmez. Bu nedenle, dm-default-key
'ü uygulamak tedarikçi firmalara bırakılmıştı.
Meta veri dosya sistemini ayarlama
Meta veri şifreleme anahtarı mevcut olana kadar kullanıcı verisi bölümlendirmesinde hiçbir şey okunamayacağından bölüm tablosu, bu anahtarı koruyan anahtar denetleyicisi blob'larını depolamak için "meta veri bölümü" adı verilen ayrı bir bölümü bir kenara ayırmalıdır. Meta veri bölümü 16 MB olmalıdır.
fstab.hardware
, ilgili bölümde bulunan ve /metadata
konumuna ekleyen meta veri dosya sistemi için bir giriş içermelidir. Buna, önyükleme sırasında biçimlendirildiğinden emin olmak için formattable
işareti de dahildir. f2fs dosya sistemi daha küçük bölümlerde çalışmaz. Bunun yerine ext4 kullanılmasını öneririz. Örnek:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
/metadata
bağlama noktasının bulunduğundan emin olmak için BoardConfig-common.mk
dosyasına aşağıdaki satırı ekleyin:
BOARD_USES_METADATA_PARTITION := true
İlk başlatma sırası değişiklikleri
Meta veri şifreleme kullanıldığında, /data
eklenmeden önce vold
çalışıyor olmalıdır. Yeterince erken başlatıldığından emin olmak için şu dizeyi init.hardware.rc
bölümüne ekleyin:
# We need vold early for metadata encryption on early-fs start vold
init, /data
'ü bağlamaya çalışmadan önce Keymaster'ın çalışıyor ve hazır olması gerekir.
init.hardware.rc
, /data
öğesini on
late-fs
dizesinin içine yerleştiren bir mount_all
talimatı içermelidir. Bu satırdan önce, wait_for_keymaster
hizmetini yürütmek için yönerge 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ştir
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ı ş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, fs_mgr_flags sütununda da bulunan metadata_encryption
seçeneği ayarlanarak geçersiz kılınabilir:
- AES hızlandırması olmayan cihazlarda
metadata_encryption=adiantum
ayarlanarak Adiantum şifrelemesi etkinleştirilebilir. - Donanımla sarmalanmış anahtarları destekleyen cihazlarda meta veri şifreleme anahtarı,
metadata_encryption=aes-256-xts:wrappedkey_v0
(veyaaes-256-xts
varsayılan algoritma olduğu için eşdeğerimetadata_encryption=:wrappedkey_v0
) ayarlanarak donanımla sarmalanmış hale getirilebilir.
Android 11'de dm-default-key
için çekirdek arayüzü değiştiğinden device.mk
'de PRODUCT_SHIPPING_API_LEVEL
için doğru değeri ayarladığınızdan emin olmanız gerekir. Örneğin, cihazınız Android 11 (API düzeyi 30) ile kullanıma sunuluyorsa device.mk
şu bilgileri içermelidir:
PRODUCT_SHIPPING_API_LEVEL := 30
Gönderim API'si düzeyinden bağımsız olarak yeni dm-default-key
API'nin 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 yaygın 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 root
adb shell dmctl table userdata
Çıkış şuna benzer şekilde görünecektir:
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 fstab
bölümünde metadata_encryption
seçeneğini ayarlayarak varsayılan şifreleme ayarlarını geçersiz kıldıysanız çıkış, yukarıdakinden biraz farklıdır. Örneğin, Adiantum şifrelemesi'ni etkinleştirdiyseniz üçüncü alan aes-xts-plain64
yerine xchacha12,aes-adiantum-plain64
olur.
Ardından, meta veri şifrelemenin ve FBE'nin doğruluğunu doğrulamak için vts_kernel_encryption_test dosyasını çalıştırın:
atest vts_kernel_encryption_test
veya:
vts-tradefed run vts -m vts_kernel_encryption_test
Genel sorunlar
Meta veriyle şifrelenmiş /data
bölümünü ekleyen mount_all
çağrısı sırasında init
, vdc aracını yürütür. Meta veri şifrelenmiş cihazı ayarlamak ve bölümü bağlamak için vdc aracı, binder
üzerinden vold
'e bağlanır. Bu çağrı süresince init
engellenir ve mount_all
bitene kadar init
özellikleri bloğunu okumayı veya ayarlamayı dener.
Bu aşamada, vold
'nin çalışmasının herhangi bir kısmı bir mülkü okuma veya ayarlama konusunda doğrudan veya dolaylı olarak engellenirse kilitlenme meydana gelir. vold
'ün, init
ile başka bir etkileşimde bulunmadan anahtarları okuma, Keymaster ile etkileşim kurma ve veri dizini bağlama işlemlerini tamamlayabilmesi önemlidir.
mount_all
çalışırken Keymaster tam olarak başlamazsa init
ürününden belirli özellikleri okuyana kadar vold
öğesine yanıt vermez. Bu da tam olarak açıklanan kilitlenmeye neden olur. exec_start wait_for_keymaster
'nin ilgili mount_all
çağrısının üzerine yerleştirilmesi, Keymaster'ın önceden tamamen çalışmasını sağlar ve böylece bu kilitlenmeyi önler.
Dahili hale getirilebilir depolama alanında yapılandırma
Android 9'dan beri, dahili depolama alanında meta veri şifrelemesi etkinleştirilmemiş olsa bile FBE etkinleştirildiğinde uyarlanabilir depolama alanında her zaman bir meta veri şifreleme biçimi etkinleştirilir.
AOSP'de, uyarlanabilir depolama alanında meta veri şifrelemenin iki uygulaması vardır: dm-crypt
temelli kullanımdan kaldırılan bir tanesi ve dm-default-key
tabanlı yeni bir tane. 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
Gönderim API'si düzeyinden bağımsız olarak yeni hacim meta veri şifreleme yönteminin (ve yeni varsayılan FBE politikası 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 kullanıma sunulan cihazlarda, uyarlanabilir depolama alanındaki 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ği hakkında bilgi edinmek için yukarıdaki ön koşullara bakın. Cihazın dahili depolama alanında çalışan satır içi şifreleme donanımının, benimsenebilir depolama alanında kullanılamayabileceğini ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
'ün gerekli olabileceğ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. ro.crypto.volume.metadata.encryption
sistem özelliği ayarlanarak algoritma geçersiz kılınabilir. Bu mülkün değeri, yukarıda açıklanan metadata_encryption
fstab seçeneğiyle aynı söz dizimi içerir. Örneğin, AES hızlandırması bulunmayan cihazlarda ro.crypto.volume.metadata.encryption=adiantum
ayarlanarak Adiantum şifrelemesi etkinleştirilebilir.
Eski yöntem
Android 10 veya önceki bir sürümle kullanıma sunulan cihazlarda, uyarlanabilir depolama alanındaki meta veri şifrelemesi için dm-default-key
yerine dm-crypt
çekirdek modülü kullanılır:
CONFIG_DM_CRYPT=y
dm-default-key
yönteminden farklı olarak dm-crypt
yöntemi, dosya içeriğinin bir kez FBE anahtarı ve ikincisi de meta veri şifreleme anahtarı ile olmak üzere iki kez şifrelenmesine neden olur. Android, FBE anahtarlarının güvenliğinin en az meta veri şifreleme anahtarı kadar zor olmasını sağladığından, bu çift şifreleme performansı azaltır ve meta veri şifrelemenin güvenlik hedeflerine ulaşmak için gerekli değildir. Tedarikçi firmalar, çift şifrelemeden kaçınmak için çekirdek özelleştirmeleri yapabilir. Özellikle, ro.crypto.allow_encrypt_override
sistem özelliği true
olarak ayarlandığında, Android'in dm-crypt
içine aktardığı allow_encrypt_override
seçeneğini uygulayabilir.
Bu özelleştirmeler, Android ortak çekirdeği tarafından desteklenmez.
dm-crypt
hacim meta veri şifreleme yöntemi, varsayılan olarak ESSIV ve 512 bayt kripto sektörleriyle AES-128-CBC şifreleme algoritmasını kullanır. Bu durum, FDE için de kullanılan aşağıdaki sistem özellikleri ayarlanarak geçersiz kılınabilir:
ro.crypto.fde_algorithm
, meta veri şifreleme algoritmasını seçer. Seçenekler:aes-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. 512, 1024, 2048 ve 4096 seçenekleri mevcuttur. Adiantum şifrelemesi için 4096 kullanın.