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

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

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

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

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

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

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

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

يتطلّب تشفير البيانات الوصفية تفعيل وحدة dm-default-key في النواة. في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث، تتوافق النواة الشائعة لنظام Android، الإصدار 4.14 والإصدارات الأحدث، مع dm-default-key. يستخدم هذا الإصدار من 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

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

في الإصدار 10 من نظام التشغيل Android والإصدارات الأقدم، لم تكن النواة الشائعة لنظام Android متوافقة مع dm-default-key. لذلك، كان على المورّدين تنفيذ 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 قيد التشغيل وجاهزًا قبل أن تحاول عملية الإعداد تحميل /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:

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

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

في مشروع Android مفتوح المصدر (AOSP)، يتوفّر تنفيذان لتشفير البيانات الوصفية على وحدة التخزين القابلة للاستخدام: تنفيذ قديم يستند إلى dm-crypt، وتنفيذ أحدث يستند إلى dm-default-key. لضمان اختيار التنفيذ الصحيح لجهازك، تأكَّد من ضبط القيمة الصحيحة لـ PRODUCT_SHIPPING_API_LEVEL في device.mk. على سبيل المثال، إذا كان جهازك يعمل بالإصدار 11 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 30)، يجب أن يحتوي device.mk على ما يلي:

PRODUCT_SHIPPING_API_LEVEL := 30

يمكنك أيضًا ضبط سمات النظام التالية لفرض استخدام طريقة تشفير البيانات الوصفية الجديدة لوحدة التخزين (والإصدار الجديد من سياسة التشفير المستند إلى الملفات التلقائية) بغض النظر عن مستوى واجهة برمجة التطبيقات للشحن:

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_encryption في fstab الموضّح أعلاه. على سبيل المثال، على الأجهزة التي لا تتضمّن تسريعًا لخوارزمية AES ، يمكن تفعيل تشفير Adiantum من خلال ضبط ro.crypto.volume.metadata.encryption=adiantum.

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

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

CONFIG_DM_CRYPT=y

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