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

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

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

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

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

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

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

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

يتطلب تشفير البيانات الفوقية أن dm-default-key وحدة يكون ممكنا في النواة. في الروبوت 11 وأعلى، dm-default-key يدعمه حبات المشتركة أندرويد، الإصدار 4.14 وأعلى. هذا الإصدار من dm-default-key يستخدم الأجهزة ويسمى إطار التشفير بائع مستقلة BLK-التشفير.

لتمكين dm-default-key ، استخدام:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key الاستخدامات مضمنة الأجهزة التشفير (الأجهزة التي يشفر / يفك شفرة البيانات بينما هو في الطريق إلى / من جهاز التخزين) عند توفرها. إذا كنت لن تستخدم أجهزة التشفير مضمنة، فمن الضروري أيضا تمكين تراجع إلى API التشفير نواة ل:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

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

في الروبوت 10 وأقل من ذلك، dm-default-key وغير معتمدة من قبل نواة مشتركة الروبوت. ولذلك ليصل إلى البائعين لتنفيذ 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

Keymaster يجب تشغيل وجاهزة قبل محاولات الحرف الأول لتركيب /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، التشفير كزبرة البئر قد مكنت من وضع metadata_encryption=adiantum .
  • على الأجهزة التي دعم مفاتيح ملفوفة الأجهزة ، مفتاح التشفير الفوقية ويمكن عن طريق وضع الملفوفة الأجهزة metadata_encryption=aes-256-xts:wrappedkey_v0 (أو مكافئ metadata_encryption=:wrappedkey_v0 ، كما aes-256-xts هو خوارزمية الافتراضي).

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

PRODUCT_SHIPPING_API_LEVEL := 30

يمكنك أيضا تعيين الخاصية نظام التالية لفرض استخدام جديد dm-default-key API بغض النظر عن مستوى الشحن API:

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

التكوين على التخزين القابل للتبني

منذ الروبوت 9، يتم تمكين شكل من أشكال التشفير ميتاداتا دائما على تخزين تبنيهم كلما تم تمكين FBE، حتى عندما لا يتم تمكين التشفير ميتاداتا حول سعة التخزين الداخلية.

في AOSP، هناك نوعان من تطبيقات التشفير ميتاداتا على تخزين تبنيهم: واحد مستنكر على أساس dm-crypt ، وأحدث واحد على أساس dm-default-key . لضمان أن يتم تحديد التنفيذ الصحيح لجهازك، تأكد من أنك قمت بتعيين القيمة الصحيحة ل PRODUCT_SHIPPING_API_LEVEL في device.mk . على سبيل المثال، إذا إطلاق الجهاز مع الروبوت 11 (مستوى API 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 الروبوت أو أعلى، تشفير البيانات الفوقية على تخزين تبنيهم يستخدم 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، التشفير كزبرة البئر قد مكنت من وضع ro.crypto.volume.metadata.encryption=adiantum .

طريقة الإرث

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

CONFIG_DM_CRYPT=y

وخلافا لل dm-default-key الأسلوب، و dm-crypt يسبب طريقة محتويات الملف ليتم تشفير مرتين: مرة مع مفتاح FBE ومرة واحدة مع مفتاح التشفير الفوقية. يقلل هذا التشفير المزدوج من الأداء وليس مطلوبًا لتحقيق أهداف الأمان لتشفير البيانات الوصفية ، نظرًا لأن Android يضمن أن مفاتيح FBE يصعب التنازل عنها على الأقل مثل مفتاح تشفير البيانات الوصفية. يمكن للبائعين جعل التخصيصات نواة لتجنب التشفير المزدوج، ولا سيما من خلال تنفيذ allow_encrypt_override الخيار الذي سيمر الروبوت إلى 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 . كزبرة البئر يمكن استخدامها فقط إذا كان الجهاز يفتقر إلى تسارع AES.
  • ro.crypto.fde_sector_size يختار حجم القطاع التشفير. الاختيارات هي 512 و 1024 و 2048 و 4096. لتشفير Adiantum ، استخدم 4096.