मेटाडेटा को एन्क्रिप्ट (सुरक्षित) करना

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

Android 9 वर्शन में, मेटाडेटा को एन्क्रिप्ट (सुरक्षित) करने की सुविधा भी लॉन्च की गई है. मेटाडेटा एन्क्रिप्शन की मदद से, बूट के समय मौजूद एक कुंजी ही सभी चीज़ों को एन्क्रिप्ट (सुरक्षित) करती है कॉन्टेंट को एफ़बीई ने एन्क्रिप्ट (सुरक्षित) नहीं किया है. इस कुंजी की सुरक्षा KeyMaster के ज़रिए की गई है, जो टर्न वेरिफ़ाइड बूट की मदद से सुरक्षित किया जाता है.

अगर एफ़बीई की सुविधा चालू होती है, तो डिवाइस के स्टोरेज में मेटाडेटा एन्क्रिप्ट (सुरक्षित) करने की सुविधा हमेशा चालू रहती है. मेटाडेटा एन्क्रिप्शन को डिवाइस की मेमोरी पर भी चालू किया जा सकता है. लॉन्च किए गए डिवाइस Android 11 या इसके बाद वाले वर्शन के साथ, मेटाडेटा एन्क्रिप्शन होना ज़रूरी है मोबाइल मेमोरी पर चालू किया गया.

डिवाइस के स्टोरेज को लागू करने की सुविधा

नए डिवाइसों के स्टोरेज पर मेटाडेटा एन्क्रिप्ट (सुरक्षित) करने का तरीका सेट अप किया जा सकता है. इसके लिए: metadata फ़ाइल सिस्टम सेट अप किया जा रहा है, init क्रम बदला जा रहा है, और डिवाइस की fstab फ़ाइल में मेटाडेटा एन्क्रिप्शन सक्षम करना होगा.

ज़रूरी शर्तें

मेटाडेटा एन्क्रिप्शन की सुविधा सिर्फ़ तब सेट अप की जा सकती है, जब डेटा पार्टीशन पहले हो फ़ॉर्मैट किया गया है. इस वजह से, यह सुविधा सिर्फ़ नए डिवाइसों के लिए है; यह नहीं है जो OTA में बदलना चाहिए.

मेटाडेटा एन्क्रिप्शन के लिए ज़रूरी है कि dm-default-key मॉड्यूल आपके कर्नेल में चालू है. Android 11 और उसके बाद के वर्शन में, dm-default-key, Android सामान्य कर्नेल के वर्शन पर काम करता है 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, इनलाइन एन्क्रिप्शन हार्डवेयर का इस्तेमाल करता है (यह हार्डवेयर डेटा को एन्क्रिप्ट/डिक्रिप्ट करता है, जब वह स्टोरेज डिवाइस के रास्ते में होता है या उससे बाहर आता है) उपलब्ध हैं. अगर इनलाइन एन्क्रिप्शन हार्डवेयर का इस्तेमाल नहीं किया जाएगा, तो कर्नेल के क्रिप्टोग्राफ़ी एपीआई पर फ़ॉलबैक चालू करने के लिए भी ज़रूरी है:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

इनलाइन एन्क्रिप्शन हार्डवेयर का इस्तेमाल नहीं करते समय, आपको किसी भी उपलब्ध डिवाइस को भी चालू करना चाहिए सीपीयू के हिसाब से तेज़ी लाने की सुविधा, जैसा कि एफ़बीई दस्तावेज़ में दिया गया है.

Android 10 और उससे पहले के वर्शन में, dm-default-key Android कॉमन कर्नेल में काम नहीं करता था. इसलिए, यह वेंडर के पास था 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 चालू और तैयार होना चाहिए /data.

init.hardware.rc में पहले से mount_all होना चाहिए निर्देश, जो /data को खुद on late-fs छंदों में माउंट करता है. इस पंक्ति से पहले, निर्देश को लागू करने के लिए 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 को इसके लिए fstab एंट्री का fs_mgr_flags कॉलम 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

डिफ़ॉल्ट रूप से, डिवाइस के स्टोरेज पर मेटाडेटा एन्क्रिप्ट (सुरक्षित) करने का एल्गोरिदम ऐसा होता है एईएस-256-एक्सटीएस. इसे सेट करके बदला जा सकता है: metadata_encryption विकल्प fs_mgr_flags कॉलम:

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

क्योंकि Android में कर्नेल इंटरफ़ेस को dm-default-key में बदल दिया गया है आपको यह भी सुनिश्चित करना होगा कि आपने PRODUCT_SHIPPING_API_LEVEL के लिए सही मान device.mk. उदाहरण के लिए, अगर आपका डिवाइस Android के साथ लॉन्च होता है 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

यदि आप डिवाइस के fstab में metadata_encryption विकल्प चुनें. इसके बाद आउटपुट, ऊपर दिए गए आउटपुट से कुछ अलग होगा. उदाहरण के लिए, अगर आपने Adiantum एन्क्रिप्शन चालू किया है, तो तीसरा फ़ील्ड इसके बजाय xchacha12,aes-adiantum-plain64 होगा aes-xts-plain64.

इसके बाद, vts_kernel_encryption_test चलाएं मेटाडेटा एन्क्रिप्शन और एफ़बीई के सही होने की पुष्टि करने के लिए:

atest vts_kernel_encryption_test

या:

vts-tradefed run vts -m vts_kernel_encryption_test

सामान्य समस्याएं

mount_all को कॉल करने के दौरान, जो मेटाडेटा को एन्क्रिप्ट (सुरक्षित) करके माउंट करता है /data पार्टीशन, init vdc टूल को एक्ज़ीक्यूट करता है. vdc यह टूल, binder पर vold से कनेक्ट होता है. मेटाडेटा को एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस और पार्टिशन को माउंट करें. इस अवधि के लिए कॉल करने पर, init ब्लॉक है और पढ़ने या सेट करने की कोशिश कर रहा है init प्रॉपर्टी तब तक ब्लॉक रहेंगी, जब तक mount_all काम पूरा नहीं हो जाता. अगर इस स्तर पर, vold के काम का कोई भी हिस्सा सीधे तौर पर या किसी प्रॉपर्टी को पढ़ने या सेट करने पर अप्रत्यक्ष रूप से ब्लॉक किया गया है, तो डेडलॉक की समस्या होगी. हां यह सुनिश्चित करना ज़रूरी है कि vold कुंजियां, KeyMaster के साथ इंटरैक्ट करना, और बिना किसी सूचना के डेटा डायरेक्ट्री को माउंट करना init के साथ और भी इंटरैक्ट करते हैं.

अगर mount_all के चलने पर, KeyMaster पूरी तरह से चालू नहीं हुआ है, तो काम नहीं करेगा vold का तब तक जवाब दें, जब तक कि उसमें init का नतीजा निकालने के लिए, सटीक डेडलॉक दिया गया है. स्थान exec_start wait_for_keymaster लक्ष्य से ज़्यादा mount_all को शुरू करने से पक्का होता है कि KeyMaster पूरी तरह से काम कर रहा है को रोका नहीं जा सकता है, इसलिए गड़बड़ी से बचा जा सकता है.

डिवाइस के स्टोरेज के लिए कॉन्फ़िगरेशन

Android 9 के बाद से, मेटाडेटा एन्क्रिप्ट (सुरक्षित) करने का एक तरीका ऐसा है डिवाइस का स्टोरेज, हमेशा चालू रखने की सुविधा देता है जब भी एफ़बीई चालू हो, तब भी जब मेटाडेटा एन्क्रिप्शन चालू न हो डिवाइस का स्टोरेज.

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

PRODUCT_SHIPPING_API_LEVEL := 30

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

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

मौजूदा तरीका

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

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

लेगसी तरीका

Android 10 या इससे पहले के वर्शन के साथ लॉन्च होने वाले डिवाइसों पर, मेटाडेटा डिवाइस के स्टोरेज को एन्क्रिप्ट (सुरक्षित) करने के लिए, dm-crypt कर्नेल मॉड्यूल का इस्तेमाल किया जाता है dm-default-key के बजाय:

CONFIG_DM_CRYPT=y

dm-default-key तरीके के उलट, dm-crypt तरीका इसकी वजह से फ़ाइल का कॉन्टेंट दो बार एन्क्रिप्ट (सुरक्षित) होता है: एक बार FBE कुंजी से और एक बार मेटाडेटा एन्क्रिप्शन कुंजी पर जाएं. दो बार एन्क्रिप्ट (सुरक्षित) करने का यह तरीका, परफ़ॉर्मेंस को कम करता है और Android के लिए, मेटाडेटा एन्क्रिप्शन से जुड़े सुरक्षा लक्ष्यों को हासिल करने की ज़रूरत नहीं होती यह पक्का करता है कि FBE कुंजियों को कम से कम मेटाडेटा की तरह समझौता करना मुश्किल हो कुंजी है. विक्रेता एन्क्रिप्शन, खास तौर पर allow_encrypt_override विकल्प जिसे Android पास करेगा सिस्टम प्रॉपर्टी के dm-crypt होने पर ro.crypto.allow_encrypt_override को true पर सेट किया गया. ये कस्टमाइज़ेशन Android सामान्य कर्नेल के ज़रिए काम नहीं करते हैं.

वॉल्यूम मेटाडेटा को एन्क्रिप्ट (सुरक्षित) करने का dm-crypt तरीका, डिफ़ॉल्ट रूप से ईएसएसआईवी और 512-बाइट वाले क्रिप्टो सेक्टर के साथ एईएस-128-सीबीसी एन्क्रिप्शन एल्गोरिदम. यह नीचे दिए गए सिस्टम की प्रॉपर्टी को सेट करके बदला जा सकता है (जो एफ़डीई के लिए इस्तेमाल किया जाता है):

  • ro.crypto.fde_algorithm, मेटाडेटा को एन्क्रिप्ट (सुरक्षित) करने का तरीका चुनता है एल्गोरिदम. विकल्प aes-128-cbc और हैं adiantum. Adiantum का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब डिवाइस में AES एक्सेलरेटर नहीं है.
  • ro.crypto.fde_sector_size, क्रिप्टो सेक्टर का साइज़ चुनता है. विकल्प 512, 1024, 2048, और 4096 हैं. एडिएंटम एन्क्रिप्शन के लिए, इसका इस्तेमाल करें 4096 है.