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