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

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

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

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

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

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

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

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

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

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

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

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

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