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

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

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

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

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

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

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

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

يتطلّب تشفير البيانات الوصفية تفعيل الوحدة النمطية 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

عند عدم استخدام أجهزة التشفير المضمّن، عليك أيضًا تفعيل أي تسريع متاح يستند إلى وحدة المعالجة المركزية (CPU) على النحو الموصى به في مستندات التشفير المستند إلى الملفات.

في نظام التشغيل Android 10 والإصدارات الأقدم، لم يكن dm-default-key متوافقًا مع نواة Android الشائعة. لذلك، كان على البائعين تنفيذ dm-default-key.

إعداد نظام ملفات البيانات الوصفية

بما أنّه لا يمكن قراءة أي بيانات في قسم userdata إلا بعد توفّر مفتاح تشفير البيانات الوصفية، يجب أن يخصّص جدول الأقسام قسمًا منفصلاً باسم قسم البيانات الوصفية لتخزين كائنات KeyMint الثنائية التي تحمي هذا المفتاح. يجب أن يكون حجم قسم البيانات الوصفية 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

يجب أن يكون KeyMint قيد التشغيل وجاهزًا قبل أن تحاول عملية 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 هي الخوارزمية التلقائية).

بما أنّ واجهة النواة 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 يمكنه إكمال عملية قراءة المفاتيح والتفاعل مع KeyMint وتثبيت دليل البيانات بدون الحاجة إلى التفاعل مع init.

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

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

منذ الإصدار 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 النواة، تمامًا كما هو الحال في وحدة التخزين الداخلية. يُرجى الاطّلاع على المتطلبات الأساسية أعلاه لمعرفة خيارات إعدادات النواة التي يجب تفعيلها. يُرجى العِلم أنّ أجهزة التشفير المضمّن التي تعمل على وحدة التخزين الداخلية للجهاز قد لا تكون متاحة على وحدة التخزين القابلة للنقل، وبالتالي قد يكون CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y مطلوبًا.

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

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

على الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android والإصدارات الأقدم، يستخدم تشفير البيانات الوصفية على وحدة التخزين الخارجية القابلة للنقل وحدة kernel 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 تلقائيًا خوارزمية التشفير 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.