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 है.