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

يتيح الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث التشفير على مستوى الملفات (FBE). تسمح ميزة FBE بتشفير ملفات مختلفة باستخدام مفاتيح مختلفة يمكن فتح قفلها بشكل مستقل. وتُستخدَم هذه المفاتيح لتشفير كلّ من محتوى الملفات وأسماء الملفات. عند استخدام ميزة "التشفير من جهة العميل"، لا يتم تشفير معلومات أخرى، مثل تنسيقات الأدلة وحجم الملفات والأذونات وأوقات الإنشاء/التعديل. وتُعرف هذه المعلومات الأخرى بشكلٍ جماعي باسم البيانات الوصفية لنظام الملفات.

وفّر نظام التشغيل Android 9 إمكانية تشفير البيانات الوصفية. من خلال ميزة "تشفير البيانات الوصفية"، يتم استخدام مفتاح تشفير واحد في وقت التشغيل لتشفير أي محتوى لم يتم تشفيره من خلال ميزة "التشفير من جهة العميل". تتم حماية هذا المفتاح من خلال Keymaster، والذي بدوره محمي من خلال ميزة "التمهيد التحقق منه".

يكون تشفير البيانات الوصفية مفعَّلاً دائمًا في مساحة التخزين القابلة للتخصيص عند تفعيل ميزة "التشفير من جهة العميل". يمكن أيضًا تفعيل تشفير البيانات الوصفية في مساحة التخزين الداخلية. يجب أن تكون ميزة تشفير البيانات الوصفية مفعَّلة في الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث على مساحة التخزين الداخلية.

التنفيذ على مساحة التخزين الداخلية

يمكنك إعداد تشفير البيانات الوصفية في مساحة التخزين الداخلية للأجهزة الجديدة من خلال إعداد نظام الملفات metadata وتغيير تسلسل init و تفعيل تشفير البيانات الوصفية في ملف fstab الخاص بالجهاز.

المتطلّبات الأساسية

لا يمكن إعداد تشفير البيانات الوصفية إلا عند إعادة تنسيق قسم البيانات لأول مرة. ونتيجةً لذلك، تتوفّر هذه الميزة للأجهزة الجديدة فقط، وليس من المفترض أن يؤدي تحديث OTA إلى تغيير ذلك.

يتطلّب تشفير البيانات الوصفية تفعيل dm-default-key في النواة. في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث، يتوافق 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 أجهزة التشفير المضمّنة (الأجهزة التي تتشفّر/تفكّ التشفير للبيانات أثناء نقلها إلى جهاز التخزين أو من جهاز التخزين) عند توفّرها. إذا كنت لا تستخدِم أجهزة التشفير المضمّنة، يجب أيضًا تفعيل ميزة التراجع إلى واجهة برمجة تطبيقات التشفير في النواة:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

عند عدم استخدام أجهزة التشفير المضمّنة، عليك أيضًا تفعيل أي تسريع متاح استنادًا إلى وحدة المعالجة المركزية كما هو مقترَح في مستندات FBE.

في الإصدار 10 من Android والإصدارات الأقدم، لم يكن 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 قيد التشغيل ومستعدًا قبل أن تحاول 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. على سبيل المثال، إذا كان جهازك يعمل بالإصدار 11 من نظام التشغيل Android (المستوى 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 عبر binder لإعداد الجهاز المشفَّر بالبيانات الوصفية وتثبيت القسم. خلال مدّة هذا الطلب، يتم حظر init، وسيتم حظر محاولات قراءة أو ضبط سمات init إلى أن تنتهي mount_all. في هذه المرحلة، إذا تم حظر أي جزء من عمل vold مباشرةً أو بشكل غير مباشر عند قراءة خاصيّة أو ضبطها، سيؤدي ذلك إلى حدوث "توقّف عمليات متعددة في انتظار بعضها". من المهم التأكّد من أنّه يمكن لـ vold إكمال عملية قراءة المفاتيح والتفاعل مع Keymaster وتركيب دليل البيانات بدون التفاعل أكثر مع init.

إذا لم يتم تشغيل Keymaster بالكامل عند تشغيل mount_all، لن يردّ علىvold إلى أن يقرأ سمات معيّنة منinit، ما يؤدي إلى حدوث التوقف المفاجئ الموضّح بالضبط. يضمن وضع exec_start wait_for_keymaster فوق دعوة mount_all ذات الصلة كما هو موضّح أنّه يتم تشغيل Keymaster بالكامل مسبقًا، وبالتالي تجنُّب هذا التوقف المفاجئ.

الضبط على مساحة التخزين القابلة للاستخدام

منذ الإصدار 9 من Android، يتم دائمًا تفعيل أحد أشكال تشفير البيانات الوصفية في مساحة التخزين القابلة للاستخدام كمساحة تخزين داخلية عند تفعيل ميزة "التشفير من جهة العميل"، حتى في حال عدم تفعيل ميزة تشفير البيانات الوصفية في مساحة التخزين الداخلية.

في AOSP، هناك طريقتان لتنفيذ تشفير البيانات الوصفية في ميزة "مساحة التخزين القابلة للتخصيص": طريقة متوقّفة نهائيًا تستند إلى dm-crypt وطريقة أحدث تستند إلى dm-default-key. لضمان اختيار التنفيذ الصحيح لجهازك، تأكَّد من ضبط القيمة الصحيحة لملف PRODUCT_SHIPPING_API_LEVEL في device.mk. على سبيل المثال، إذا كان جهازك يعمل بالإصدار 11 من نظام التشغيل Android (المستوى 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

الطريقة الحالية

على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو إصدار أحدث، يستخدم التشفير في البيانات الوصفية على مساحة التخزين القابلة للتخصيص وحدة dm-default-key النواة، تمامًا كما هو الحال في مساحة التخزين الداخلية. راجِع المتطلبات الأساسية أعلاه لمعرفة خيارات إعدادات kernel التي يجب تفعيلها. يُرجى العِلم أنّ أجهزة التشفير المضمّنة التي تعمل على وحدة التخزين الداخلية للجهاز قد لا تكون متاحة على مساحة التخزين القابلة للتخصيص، وبالتالي قد يكون مطلوبًا استخدامCONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y.

تلقائيًا، تستخدم dm-default-key طريقة تشفير البيانات الوصفية للوحدة التخزين خوارزمية التشفير AES-256-XTS مع قطاعات تشفير بحجم 4096 بايت. يمكن إلغاء أثر الخطوات المتعلّقة بالalgorithm من خلال ضبط سمة النظام ro.crypto.volume.metadata.encryption. تحتوي قيمة هذه السمة على بنية الجملة نفسها التي يتضمّنها خيار metadata_encryption fstab الموضّح أعلاه. على سبيل المثال، على الأجهزة التي لا تتضمّن ميزة تسريع التشفير باستخدام مفتاح AES، يمكن تفعيل التشفير باستخدام Adiantum من خلال ضبط القيمة ro.crypto.volume.metadata.encryption=adiantum.

الطريقة القديمة

على الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأقدم، يستخدم تشفير metadata في مساحة التخزين القابلة للتخصيص وحدة kernel dm-crypt بدلاً من dm-default-key:

CONFIG_DM_CRYPT=y

على عكس طريقة dm-default-key، تؤدي طريقة dm-crypt إلى تشفير محتوى الملف مرتين: مرة باستخدام مفتاح تشفير الملفات المشفَّرة بالكامل ومرة باستخدام مفتاح تشفير البيانات الوصفية. يؤدّي هذا التشفير المزدوج إلى خفض الأداء وهو غير مطلوب لتحقيق أهداف الأمان الخاصة بتشفير البيانات الوصفية، لأنّ نظام Android يضمن أنّه من الصعب اختراق مفاتيح FBE على الأقل بقدر صعوبة اختراق مفتاح تشفير البيانات الوصفية. يمكن للمورّدين إجراء تخصيصات للنواة لتجنُّب التشفير العميق، لا سيما من خلال تنفيذ الخيار allow_encrypt_override الذي يمرره Android إلى dm-crypt عند ضبط خاصية النظام ro.crypto.allow_encrypt_override على true. لا تتوافق هذه التخصيصات مع نواة Android الشائعة.

تستخدم طريقة تشفير البيانات الوصفية للوحدة dm-crypt تلقائيًا خوارزمية التشفير AES-128-CBC مع تنسيق ESSIV وقطاعات التشفير التي تبلغ 512 بايت. يمكن تجاوز هذه الإعدادات من خلال ضبط خصائص النظام التالية (التي يتم استخدامها أيضًا لميزة "التشفير من جهة العميل"):

  • ro.crypto.fde_algorithm يختار خوارزمية تشفير البيانات الوصفية. الخياران هما aes-128-cbc و adiantum. لا يمكن استخدام Adiantum إلا إذا كان الجهاز لا يتضمّن ميزة تسريع التشفير باستخدام مفتاح AES.
  • ro.crypto.fde_sector_size لاختيار حجم قطاع العملات المشفّرة الخيارات هي 512 و1024 و2048 و4096. لتشفير Adiantum، استخدِم 4096.