मेटाडेटा एन्क्रिप्शन

एंड्रॉयड 7.0 और बाद का समर्थन करता है फ़ाइल आधारित एन्क्रिप्शन (FBE)। एफबीई अलग-अलग फाइलों को अलग-अलग कुंजियों से एन्क्रिप्ट करने की अनुमति देता है जिन्हें स्वतंत्र रूप से अनलॉक किया जा सकता है। इन कुंजियों का उपयोग फ़ाइल सामग्री और फ़ाइल नाम दोनों को एन्क्रिप्ट करने के लिए किया जाता है। जब FBE का उपयोग किया जाता है, तो अन्य जानकारी, जैसे निर्देशिका लेआउट, फ़ाइल आकार, अनुमतियाँ, और निर्माण/संशोधन समय, एन्क्रिप्ट नहीं किया जाता है। सामूहिक रूप से, इस अन्य जानकारी को फाइलसिस्टम मेटाडेटा के रूप में जाना जाता है।

एंड्रॉइड 9 ने मेटाडेटा एन्क्रिप्शन के लिए समर्थन पेश किया। मेटाडेटा एन्क्रिप्शन के साथ, बूट समय पर मौजूद एक एकल कुंजी जो भी सामग्री FBE द्वारा एन्क्रिप्ट नहीं की गई है, उसे एन्क्रिप्ट करती है। यह कुंजी कीमास्टर द्वारा सुरक्षित है, जो बदले में सत्यापित बूट द्वारा सुरक्षित है।

मेटाडाटा एन्क्रिप्शन हमेशा पर सक्षम है ग्रहणीय भंडारण जब भी FBE सक्षम है। मेटाडेटा एन्क्रिप्शन को आंतरिक संग्रहण पर भी सक्षम किया जा सकता है। Android 11 या उच्चतर के साथ लॉन्च किए गए डिवाइस में आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन सक्षम होना चाहिए।

आंतरिक भंडारण पर कार्यान्वयन

आप की स्थापना करके नए उपकरणों की आंतरिक मेमोरी में मेटाडाटा एन्क्रिप्शन सेट कर सकते हैं metadata फाइल सिस्टम, init अनुक्रम में परिवर्तन, और डिवाइस के fstab फाइल में मेटाडाटा एन्क्रिप्शन सक्षम करने से।

आवश्यक शर्तें

मेटाडेटा एन्क्रिप्शन केवल तभी सेट किया जा सकता है जब डेटा विभाजन को पहले स्वरूपित किया गया हो। परिणामस्वरूप, यह सुविधा केवल नए उपकरणों के लिए है; यह ऐसा कुछ नहीं है जिसे ओटीए को बदलना चाहिए।

मेटाडाटा एन्क्रिप्शन कि आवश्यकता है dm-default-key मॉड्यूल आपके कर्नेल में सक्षम होना। एंड्रॉयड 11 और में अधिक है, dm-default-key एंड्रॉयड आम कर्नेल, संस्करण 4.14 और उच्च द्वारा समर्थित है। के इस संस्करण में dm-default-key एक हार्डवेयर और विक्रेता स्वतंत्र एन्क्रिप्शन ढांचे बुलाया blk-क्रिप्टो उपयोग करता है।

सक्षम करने के लिए dm-default-key , का उपयोग करें:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key एन्क्रिप्शन हार्डवेयर इनलाइन उपयोग करता है (हार्डवेयर कि encrypts / decrypts डेटा जबकि यह संग्रहण उपकरण / करने के लिए रास्ते पर है) जब उपलब्ध। आप इनलाइन एन्क्रिप्शन हार्डवेयर का उपयोग नहीं किया जाएगा, यह भी कर्नेल के क्रिप्टोग्राफी एपीआई के लिए एक वापस आने में सक्षम करने के लिए आवश्यक है:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

इनलाइन एन्क्रिप्शन हार्डवेयर का उपयोग नहीं जब आप के रूप में भी में सिफारिश की किसी भी उपलब्ध सीपीयू आधारित त्वरण सक्षम होना चाहिए FBE प्रलेखन

एंड्रॉयड 10 तथा उससे पूर्व में dm-default-key एंड्रॉयड आम गिरी द्वारा समर्थित नहीं किया गया था। इसे लागू करने के विक्रेताओं के लिए ऊपर इसलिए था dm-default-key

मेटाडेटा फ़ाइल सिस्टम सेट करें

चूंकि मेटाडेटा एन्क्रिप्शन कुंजी मौजूद होने तक उपयोगकर्ताडेटा विभाजन में कुछ भी नहीं पढ़ा जा सकता है, विभाजन तालिका को इस कुंजी की रक्षा करने वाले कीमास्टर ब्लॉब्स को संग्रहीत करने के लिए "मेटाडेटा विभाजन" नामक एक अलग विभाजन को अलग करना होगा। मेटाडेटा विभाजन 16 एमबी होना चाहिए।

fstab.hardware मेटाडाटा फाइल सिस्टम है कि जो पार्टीशन पर जीवन में यह बढ़ते के लिए एक प्रवेश को शामिल करना चाहिए /metadata , सहित formattable झंडा सुनिश्चित करने के लिए यह बूट समय पर स्वरूपित है। f2fs फाइल सिस्टम छोटे विभाजन पर काम नहीं करता है; हम इसके बजाय ext4 का उपयोग करने की सलाह देते हैं। उदाहरण के लिए:

/dev/block/bootdevice/by-name/metadata              /metadata          ext4        noatime,nosuid,nodev,discard                          wait,check,formattable

यह सुनिश्चित करने के /metadata माउंट बिंदु मौजूद है, के लिए निम्न पंक्ति जोड़ें BoardConfig-common.mk :

BOARD_USES_METADATA_PARTITION := true

इनिट अनुक्रम में परिवर्तन

जब मेटाडाटा एन्क्रिप्शन प्रयोग किया जाता है, vold से पहले चलना चाहिए /data खड़ा होता है। यह सुनिश्चित करें कि यह काफी पहले शुरू कर दिया है, के लिए निम्न श्लोक जोड़ने init.hardware.rc :

# We need vold early for metadata encryption
on early-fs
    start vold

Keymaster चल रहा है और माउंट करने के लिए init प्रयास से पहले तैयार किया जाना चाहिए /data

init.hardware.rc पहले से ही एक को शामिल करना चाहिए mount_all अनुदेश जो माउंट /data में ही on late-fs छंद। इस लाइन से पहले, निर्देश exec में जोड़ने 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

मेटाडेटा एन्क्रिप्शन चालू करना

अंत में जोड़ने keydirectory=/metadata/vold/metadata_encryption की fs_mgr_flags स्तंभ के लिए fstab के लिए प्रवेश userdata । उदाहरण के लिए, एक पूर्ण fstab लाइन इस तरह दिख सकती है:

/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

डिफ़ॉल्ट रूप से, आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन एल्गोरिथम AES-256-XTS है। इस सेटिंग के द्वारा अधिरोहित जा सकता है metadata_encryption fs_mgr_flags कॉलम में विकल्प, भी:

  • उपकरणों कि एईएस त्वरण की कमी पर, Adiantum एन्क्रिप्शन सेटिंग के द्वारा सक्षम किया जा सकता metadata_encryption=adiantum
  • उपकरणों कि समर्थन पर हार्डवेयर-लिपटे चाबियाँ , मेटाडाटा एन्क्रिप्शन कुंजी बनाया जा सकता है हार्डवेयर-लिपटे स्थापना करके metadata_encryption=aes-256-xts:wrappedkey_v0 (या समतुल्य रूप metadata_encryption=:wrappedkey_v0 , के रूप में aes-256-xts डिफ़ॉल्ट एल्गोरिथ्म है)।

क्योंकि करने के लिए कर्नेल इंटरफेस dm-default-key एंड्रॉयड 11 में बदल गया है, आप यह भी सुनिश्चित करने के लिए आप के लिए सही मान निर्धारित किया है कि जरूरत PRODUCT_SHIPPING_API_LEVEL में device.mk । उदाहरण के लिए, अगर एंड्रॉयड 11 (एपीआई स्तर 30) के साथ अपनी डिवाइस लॉन्च हुआ, जिसने device.mk शामिल करना चाहिए:

PRODUCT_SHIPPING_API_LEVEL := 30

तुम भी नए का उपयोग कराने के लिए निम्न सिस्टम गुण सेट कर सकते हैं dm-default-key एपीआई स्तर शिपिंग की परवाह किए बिना एपीआई:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.dm_default_key.options_format.version=2

मान्यकरण

यह सत्यापित करने के लिए कि मेटाडेटा एन्क्रिप्शन सक्षम है और ठीक से काम कर रहा है, नीचे वर्णित परीक्षण चलाएँ। इसके अलावा में सचेत रहें कि आम मुद्दों नीचे वर्णित है।

परीक्षण

यह सत्यापित करने के लिए कि आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन सक्षम है, निम्न आदेश चलाकर प्रारंभ करें:

adb root
adb shell dmctl table userdata

आउटपुट के समान होना चाहिए:

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

आप की स्थापना करके डिफ़ॉल्ट एन्क्रिप्शन सेटिंग overrode तो metadata_encryption डिवाइस की में विकल्प fstab , तो उत्पादन ऊपर से थोड़ा भिन्न होते हैं जाएगा। उदाहरण के लिए, यदि आप सक्षम Adiantum एन्क्रिप्शन , फिर तीसरे क्षेत्र हो जाएगा xchacha12,aes-adiantum-plain64 बजाय aes-xts-plain64

इसके बाद, चलाने vts_kernel_encryption_test मेटाडाटा एन्क्रिप्शन और FBE की सत्यता की पुष्टि करने के लिए:

atest vts_kernel_encryption_test

या:

vts-tradefed run vts -m vts_kernel_encryption_test

सामान्य मुद्दे

कॉल करने के लिए के दौरान mount_all , जो मेटाडाटा-एन्क्रिप्टेड mounts /data विभाजन, init ग्राम रक्षा समिति के उपकरण निष्पादित करता है। ग्राम रक्षा समिति के उपकरण जोड़ता को vold से अधिक binder मेटाडाटा-एन्क्रिप्टेड डिवाइस को सेट और विभाजन माउंट करने के लिए। इस कॉल की अवधि के लिए, init अवरुद्ध है, और या तो पढ़ने या सेट करने का प्रयास init गुण जब तक अवरुद्ध कर देगा mount_all खत्म। तो, इस स्तर पर, के किसी भी हिस्से vold का कार्यालय प्रत्यक्ष या परोक्ष रूप पढ़ने या एक संपत्ति की स्थापना पर अवरुद्ध है, गतिरोध परिणाम देगा। ऐसा नहीं है कि यह सुनिश्चित करने के लिए महत्वपूर्ण है vold के साथ आगे बातचीत के बिना, कुंजी पढ़ने Keymaster के साथ बातचीत, और डेटा निर्देशिका बढ़ते काम को पूरा कर सकते हैं init

यदि Keymaster पूरी तरह से शुरू नहीं किया जाता है, जब mount_all चलता है, यह का जवाब देंगे नहीं vold जब तक यह से कुछ गुण पढ़ा है init , वास्तव में गतिरोध में जिसके परिणामस्वरूप का वर्णन किया। रखने exec_start wait_for_keymaster प्रासंगिक ऊपर mount_all के रूप में सुनिश्चित निकल पड़े मंगलाचरण कि Keymaster पूरी तरह से अग्रिम में चल रहा है और इसलिए है इस गतिरोध से बचा जाता है।

गोद लेने योग्य भंडारण पर विन्यास

एंड्रॉयड 9 के बाद से, मेटाडाटा एन्क्रिप्शन का एक रूप हमेशा पर सक्षम है ग्रहणीय भंडारण जब भी FBE सक्षम किया गया है, तब भी जब मेटाडाटा एन्क्रिप्शन आंतरिक मेमोरी में सक्षम नहीं है।

AOSP में, वहाँ ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन के दो कार्यान्वयन हैं: एक पदावनत के आधार पर एक dm-crypt , और एक नए आधार पर dm-default-key । यह सुनिश्चित करने के सही क्रियान्वयन के लिए अपनी डिवाइस के लिए चुना जाता है, सुनिश्चित करें कि आप के लिए सही मान निर्धारित किया है कि PRODUCT_SHIPPING_API_LEVEL में device.mk । उदाहरण के लिए, अगर एंड्रॉयड 11 (एपीआई स्तर 30) के साथ अपनी डिवाइस लॉन्च हुआ, जिसने device.mk शामिल करना चाहिए:

PRODUCT_SHIPPING_API_LEVEL := 30

आप शिपिंग API स्तर की परवाह किए बिना नई वॉल्यूम मेटाडेटा एन्क्रिप्शन विधि (और नया डिफ़ॉल्ट FBE नीति संस्करण) के उपयोग के लिए बाध्य करने के लिए निम्न सिस्टम गुण भी सेट कर सकते हैं:

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

वर्तमान विधि

एंड्रॉयड 11 या उसके बाद के साथ शुरू करने डिवाइस पर, ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन का उपयोग करता dm-default-key सिर्फ मोबाइल संग्रहण की तरह, कर्नेल मॉड्यूल। देखें आवश्यक शर्तें जिसके लिए कर्नेल विन्यास विकल्प सक्षम करने के लिए ऊपर। ध्यान दें कि इनलाइन एन्क्रिप्शन हार्डवेयर डिवाइस की आंतरिक मेमोरी पर काम करता है ग्रहणीय भंडारण पर उपलब्ध नहीं है और इस तरह हो सकता है कि CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y आवश्यकता हो सकती है।

डिफ़ॉल्ट रूप से, dm-default-key मात्रा मेटाडाटा एन्क्रिप्शन विधि 4096-बाइट क्रिप्टो क्षेत्रों के साथ एईएस 256 XTS एन्क्रिप्शन एल्गोरिथ्म का उपयोग करता। एल्गोरिथ्म की स्थापना द्वारा अधिरोहित जा सकता है ro.crypto.volume.metadata.encryption प्रणाली संपत्ति। यह संपत्ति के मूल्य के रूप में ही वाक्य रचना है metadata_encryption fstab ऊपर वर्णित विकल्प। उदाहरण के लिए, उपकरणों कि एईएस त्वरण की कमी पर, Adiantum एन्क्रिप्शन सेटिंग के द्वारा सक्षम किया जा सकता ro.crypto.volume.metadata.encryption=adiantum

विरासत विधि

एंड्रॉयड 10 या कम के साथ शुरू करने डिवाइस पर, ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन का उपयोग करता dm-crypt के बजाय गिरी मॉड्यूल dm-default-key :

CONFIG_DM_CRYPT=y

विपरीत dm-default-key विधि, dm-crypt विधि फ़ाइल सामग्री दो बार एन्क्रिप्ट होने के लिए कारण बनता है: एक FBE कुंजी के साथ एक बार और मेटाडाटा एन्क्रिप्शन कुंजी के साथ एक बार। यह दोहरा एन्क्रिप्शन प्रदर्शन को कम करता है और मेटाडेटा एन्क्रिप्शन के सुरक्षा लक्ष्यों को प्राप्त करने के लिए आवश्यक नहीं है, क्योंकि Android सुनिश्चित करता है कि FBE कुंजी मेटाडेटा एन्क्रिप्शन कुंजी के रूप में समझौता करने के लिए कम से कम कठिन हैं। विक्रेताओं को लागू करने से डबल एन्क्रिप्शन से बचने के लिए, विशेष रूप से गिरी अनुकूलन कर सकते हैं allow_encrypt_override विकल्प जो एंड्रॉयड के लिए पारित करेंगे dm-crypt जब सिस्टम संपत्ति ro.crypto.allow_encrypt_override पर सेट है true । ये अनुकूलन Android सामान्य कर्नेल द्वारा समर्थित नहीं हैं।

डिफ़ॉल्ट रूप से, dm-crypt मात्रा मेटाडाटा एन्क्रिप्शन विधि ESSIV और 512-बाइट क्रिप्टो क्षेत्रों के साथ एईएस 128-सीबीसी एन्क्रिप्शन एल्गोरिथ्म का उपयोग करता। इसे निम्नलिखित सिस्टम गुण (जो FDE के लिए भी उपयोग किया जाता है) सेट करके ओवरराइड किया जा सकता है:

  • ro.crypto.fde_algorithm मेटाडाटा एन्क्रिप्शन एल्गोरिथ्म चयन करता है। विकल्प हैं aes-128-cbc और adiantumAdiantum केवल इस्तेमाल किया जा सकता है, तो डिवाइस एईएस त्वरण का अभाव है।
  • ro.crypto.fde_sector_size चयन क्रिप्टो क्षेत्र आकार। विकल्प ५१२, १०२४, २०४८, और ४०९६ हैं। एडियंटम एन्क्रिप्शन के लिए, ४०९६ का उपयोग करें।