يتوافق الإصدار 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_encryption
fstab الموضّح أعلاه. على سبيل المثال، على الأجهزة التي لا تتوافق مع تسريع 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.