تشفير البيانات الوصفية

يدعم 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.