يتوافق الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث مع التشفير المستند إلى الملفات (FBE). ويسمح FBE بتشفير الملفات المختلفة باستخدام مفاتيح مختلفة يمكن فتح قفلها بشكل مستقل. تُستخدم هذه المفاتيح لتشفير محتوى الملفات وأسماءها. عند استخدام FBE، لا يتم تشفير المعلومات الأخرى، مثل تنسيقات الأدلة وأحجام الملفات والأذونات وأوقات الإنشاء/التعديل. مجتمعة، تُعرف هذه المعلومات الأخرى باسم بيانات التعريف لنظام الملفات.
وفّر نظام Android 9 إمكانية تشفير البيانات الوصفية. من خلال ميزة "تشفير البيانات الوصفية"، يتم استخدام مفتاح تشفير واحد في وقت التشغيل لتشفير أي محتوى لم يتم تشفيره من خلال ميزة "التشفير من جهة العميل". تتم حماية هذا المفتاح من خلال Keymaster، والذي بدوره محمي من خلال ميزة "التمهيد التحقق منه".
يكون تشفير البيانات الوصفية مفعَّلاً دائمًا على مساحة التخزين القابلة للاستخدام عند تفعيل FBE. يمكن أيضًا تفعيل تشفير البيانات الوصفية في مساحة التخزين الداخلية. إنّ الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث يجب أن يتم تفعيل ميزة تشفير البيانات الوصفية على وحدة التخزين الداخلية فيها.
التنفيذ على وحدة التخزين الداخلية
يمكنك إعداد تشفير البيانات الوصفية على وحدة التخزين الداخلية للأجهزة الجديدة من خلال
إعداد نظام ملفات metadata
وتغيير التسلسل init وتفعيل تشفير البيانات الوصفية في ملف 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
أجهزة التشفير المضمّنة (الأجهزة التي تتشفّر/تفكّ التشفير للبيانات أثناء نقلها إلى جهاز التخزين أو العكس) عند
توفّرها. إذا لم تكن تستخدم أجهزة التشفير المضمّن، من الضروري
أيضًا تفعيل إجراء احتياطي لواجهة برمجة تطبيقات التشفير في kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
عند عدم استخدام أجهزة التشفير المضمّن، عليك أيضًا تفعيل أي تسريع متاح عبر وحدة المعالجة المركزية (CPU) على النحو الموصى به في مستندات 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
يجب أن يكون مفتاح التشفير قيد التشغيل وجاهزًا قبل محاولة تثبيت
/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
الطريقة الحالية
على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو إصدار أحدث، يستخدم التشفير في البيانات الوصفية على مساحة التخزين القابلة للتخصيص وحدة 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 أو الإصدارات الأقدم، يستخدم تشفير 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.