يدعم Android 7.0 والإصدارات الأحدث التشفير المستند إلى الملفات (FBE). يسمح FBE بتشفير ملفات مختلفة باستخدام مفاتيح مختلفة يمكن فتحها بشكل مستقل. تُستخدم هذه المفاتيح لتشفير محتويات الملف وأسماء الملفات. عند استخدام FBE، لا يتم تشفير المعلومات الأخرى، مثل تخطيطات الدليل وأحجام الملفات والأذونات وأوقات الإنشاء/التعديل. بشكل جماعي، تُعرف هذه المعلومات الأخرى باسم البيانات التعريفية لنظام الملفات.
قدم Android 9 دعمًا لتشفير البيانات الوصفية. باستخدام تشفير البيانات التعريفية، يقوم مفتاح واحد موجود في وقت التمهيد بتشفير أي محتوى غير مشفر بواسطة FBE. هذا المفتاح محمي بواسطة Keymaster، والذي بدوره محمي بواسطة التمهيد الذي تم التحقق منه.
يتم دائمًا تمكين تشفير البيانات التعريفية على وحدة تخزين قابلة للتبني عندما يتم تمكين FBE. يمكن أيضًا تمكين تشفير البيانات التعريفية على وحدة التخزين الداخلية. يجب أن يتم تمكين تشفير البيانات الوصفية على وحدة التخزين الداخلية في الأجهزة التي يتم تشغيلها بنظام Android 11 أو أعلى.
التنفيذ على وحدة التخزين الداخلية
يمكنك إعداد تشفير البيانات التعريفية على وحدة التخزين الداخلية للأجهزة الجديدة عن طريق إعداد نظام ملفات metadata
، وتغيير تسلسل init، وتمكين تشفير البيانات التعريفية في ملف fstab الخاص بالجهاز.
المتطلبات الأساسية
لا يمكن إعداد تشفير البيانات التعريفية إلا عند تهيئة قسم البيانات لأول مرة. ونتيجة لذلك، فإن هذه الميزة مخصصة للأجهزة الجديدة فقط؛ هذا ليس شيئًا يجب على OTA تغييره.
يتطلب تشفير البيانات الوصفية تمكين وحدة dm-default-key
في النواة لديك. في نظام التشغيل Android 11 والإصدارات الأحدث، يتم دعم dm-default-key
بواسطة نواة Android الشائعة، الإصدار 4.14 والإصدارات الأحدث. يستخدم هذا الإصدار من dm-default-key
إطار عمل تشفير مستقل عن الأجهزة والبائعين يسمى blk-crypto .
لتمكين dm-default-key
، استخدم:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
يستخدم dm-default-key
أجهزة التشفير المضمنة (الأجهزة التي تقوم بتشفير/فك تشفير البيانات أثناء وجودها في الطريق من/إلى جهاز التخزين) عندما تكون متاحة. إذا كنت لن تستخدم أجهزة التشفير المضمّنة، فمن الضروري أيضًا تمكين الرجوع إلى واجهة برمجة تطبيقات تشفير kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
عند عدم استخدام أجهزة التشفير المضمنة، يجب عليك أيضًا تمكين أي تسريع متاح يعتمد على وحدة المعالجة المركزية (CPU) كما هو موصى به في وثائق FBE .
في نظام التشغيل Android 10 والإصدارات الأقدم، لم يكن dm-default-key
مدعومًا بواسطة kernel المشترك لنظام 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
التغييرات في تسلسل init
عند استخدام تشفير البيانات التعريفية، يجب تشغيل 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
. قبل هذا السطر، أضف التوجيه لتنفيذ خدمة 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 :
- على الأجهزة التي لا تحتوي على تسريع AES، قد يتم تمكين تشفير Adiantum عن طريق تعيين
metadata_encryption=adiantum
. - على الأجهزة التي تدعم المفاتيح المغلفة بالأجهزة ، يمكن جعل مفتاح تشفير البيانات التعريفية مغلفًا بالأجهزة عن طريق تعيين
metadata_encryption=aes-256-xts:wrappedkey_v0
(أو ما يعادلmetadata_encryption=:wrappedkey_v0
، حيث أنaes-256-xts
هي الخوارزمية الافتراضية).
نظرًا لأن واجهة kernel إلى dm-default-key
قد تغيرت في Android 11، فأنت بحاجة أيضًا إلى التأكد من أنك قمت بتعيين القيمة الصحيحة لـ 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
إذا قمت بتجاوز إعدادات التشفير الافتراضية عن طريق تعيين خيار 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
، الذي يقوم بتثبيت قسم /data
المشفر ببيانات التعريف، يقوم init
بتنفيذ الأداة vdc. تتصل أداة vdc بـ vold
over binder
لإعداد الجهاز المشفر ببيانات التعريف وتثبيت القسم. طوال مدة هذا الاستدعاء، يتم حظر init
، وسيتم حظر محاولات قراءة خصائص init
أو تعيينها حتى انتهاء mount_all
. إذا تم، في هذه المرحلة، حظر أي جزء من عمل vold
بشكل مباشر أو غير مباشر عند قراءة خاصية ما أو تعيينها، فسيؤدي ذلك إلى حالة توقف تام. من المهم التأكد من أن vold
يمكنه إكمال عمل قراءة المفاتيح والتفاعل مع Keymaster وتثبيت دليل البيانات دون التفاعل بشكل أكبر مع init
.
إذا لم يتم تشغيل Keymaster بشكل كامل عند تشغيل mount_all
، فلن يستجيب لـ vold
حتى يقرأ خصائص معينة من init
، مما يؤدي إلى حالة توقف تام موصوفة تمامًا. يؤدي وضع exec_start wait_for_keymaster
فوق استدعاء mount_all
ذي الصلة كما هو موضح إلى ضمان تشغيل Keymaster بشكل كامل مسبقًا وبالتالي تجنب هذا الجمود.
التكوين على التخزين المعتمد
منذ Android 9، يتم دائمًا تمكين أحد أشكال تشفير البيانات التعريفية على وحدة تخزين قابلة للتبني عندما يتم تمكين FBE، حتى عندما لا يتم تمكين تشفير البيانات التعريفية على وحدة التخزين الداخلية.
في AOSP، هناك تطبيقان لتشفير البيانات الوصفية على وحدة تخزين قابلة للتبني: تطبيق مهمل يعتمد على dm-crypt
، وآخر يعتمد على dm-default-key
. للتأكد من تحديد التنفيذ الصحيح لجهازك، تأكد من أنك قمت بتعيين القيمة الصحيحة لـ PRODUCT_SHIPPING_API_LEVEL
في device.mk
. على سبيل المثال، إذا تم تشغيل جهازك باستخدام Android 11 (مستوى واجهة برمجة التطبيقات 30)، فيجب أن يحتوي device.mk
على:
PRODUCT_SHIPPING_API_LEVEL := 30
يمكنك أيضًا تعيين خصائص النظام التالية لفرض استخدام طريقة تشفير بيانات تعريف الحجم الجديدة (وإصدار سياسة 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
الطريقة الحالية
على الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، يستخدم تشفير البيانات الوصفية على وحدة تخزين قابلة للتبني وحدة kernel dm-default-key
، تمامًا كما هو الحال في وحدة التخزين الداخلية. راجع المتطلبات الأساسية المذكورة أعلاه لمعرفة خيارات تكوين kernel التي سيتم تمكينها. لاحظ أن أجهزة التشفير المضمنة التي تعمل على وحدة التخزين الداخلية للجهاز قد لا تكون متاحة على وحدة تخزين قابلة للتبني، وبالتالي قد تكون هناك حاجة إلى CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
.
افتراضيًا، تستخدم طريقة تشفير البيانات التعريفية لحجم المفتاح dm-default-key
خوارزمية تشفير AES-256-XTS مع قطاعات تشفير تبلغ 4096 بايت. يمكن تجاوز الخوارزمية عن طريق تعيين خاصية النظام ro.crypto.volume.metadata.encryption
. قيمة هذه الخاصية لها نفس بناء الجملة الخاص بخيار metadata_encryption
fstab الموضح أعلاه. على سبيل المثال، على الأجهزة التي لا تحتوي على تسريع AES، قد يتم تمكين تشفير Adiantum عن طريق تعيين ro.crypto.volume.metadata.encryption=adiantum
.
الطريقة التراثية
على الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأقدم، يستخدم تشفير البيانات الوصفية على وحدة تخزين قابلة للتبني وحدة kernel dm-crypt
بدلاً من dm-default-key
:
CONFIG_DM_CRYPT=y
على عكس طريقة dm-default-key
، تؤدي طريقة dm-crypt
إلى تشفير محتويات الملف مرتين: مرة باستخدام مفتاح FBE ومرة باستخدام مفتاح تشفير البيانات التعريفية. يؤدي هذا التشفير المزدوج إلى تقليل الأداء وليس مطلوبًا لتحقيق الأهداف الأمنية لتشفير البيانات التعريفية، نظرًا لأن Android يضمن أن مفاتيح FBE يصعب اختراقها على الأقل مثل مفتاح تشفير البيانات التعريفية. يمكن للموردين إجراء تخصيصات kernel لتجنب التشفير المزدوج، على وجه الخصوص من خلال تنفيذ خيار allow_encrypt_override
الذي سيمرره Android إلى dm-crypt
عندما يتم تعيين خاصية النظام ro.crypto.allow_encrypt_override
على true
. هذه التخصيصات غير مدعومة بواسطة نواة Android الشائعة.
افتراضيًا، تستخدم طريقة تشفير البيانات التعريفية لوحدة التخزين dm-crypt
خوارزمية التشفير AES-128-CBC مع قطاعات التشفير ESSIV و512 بايت. يمكن تجاوز ذلك عن طريق تعيين خصائص النظام التالية (والتي تستخدم أيضًا لـ FDE):
- يقوم
ro.crypto.fde_algorithm
بتحديد خوارزمية تشفير البيانات التعريفية. الاختيارات هيaes-128-cbc
وadiantum
. لا يجوز استخدام Adiantum إلا إذا كان الجهاز يفتقر إلى تسريع AES. -
ro.crypto.fde_sector_size
يحدد حجم قطاع التشفير. الاختيارات هي 512 و1024 و2048 و4096. بالنسبة لتشفير Adiantum، استخدم 4096.