הצפנת מטא נתונים

7.0 אנדרואיד תומך גבוה מבוסס קובץ הצפנה (FBE). FBE מאפשר להצפין קבצים שונים באמצעות מפתחות שונים אותם ניתן לפתוח באופן עצמאי. מפתחות אלה משמשים להצפנת תוכן הקבצים ושמות הקבצים. כאשר משתמשים ב- FBE, מידע אחר, כגון פריסות ספריות, גדלי קבצים, הרשאות וזמני יצירה/שינוי, אינו מוצפן. ביחד, מידע אחר זה ידוע כמטא נתונים של מערכת הקבצים.

Android 9 הציג תמיכה בהצפנת מטא נתונים. עם הצפנת מטא נתונים, מפתח יחיד שנמצא בזמן האתחול מצפין כל תוכן שאינו מוצפן על ידי FBE. מפתח זה מוגן על ידי Keymaster, אשר בתורו מוגן על ידי אתחול מאומת.

הצפנה Metadata מופעלת תמיד על אחסון לאימוץ בכל פעם FBE מופעלת. ניתן גם להפעיל הצפנת מטא נתונים באחסון פנימי. התקנים שהושקו עם אנדרואיד 11 ומעלה חייבים להיות בעלי הצפנת מטא נתונים על אחסון פנימי.

יישום על אחסון פנימי

באפשרותך להגדיר הצפנה מטה על האחסון הפנימי של מכשירים חדשים על ידי ההקמה metadata מערכת קבצים, שינוי של רצף init, ולאפשר הצפנת 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 .

הגדר מערכת קבצים של מטא נתונים

מכיוון שלא ניתן לקרוא כלום במחיצת הנתונים של המשתמש עד שמפתח ההצפנה של המטא -נתונים קיים, על שולחן המחיצות להפריד מחיצה נפרדת בשם "מחיצת המטא -נתונים" לאחסון כתמי keymaster המגנים על מפתח זה. מחיצת המטא -נתונים צריכה להיות 16MB.

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

שינויים ברצף init

כאשר הצפנה מטה משמשת, vold חייב לפעול לפני /data מותקנים. כדי לוודא שהוא התחיל מוקדם מספיק, מוסיף את חרוז הבאה כדי init.hardware.rc :

# We need vold early for metadata encryption
on early-fs
    start vold

Keymaster חייב לפעול ומוכן לפני ניסיונות init לעלות /data .

init.hardware.rc צריך כבר מכילים mount_all הוראה אשר תושבות /data עצמה on late-fs חרוזה. לפני הקו הזה, להוסיף את ההוראה exec 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 יכול להתבצע עטוף החומרה על ידי הגדרת 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, סוג של הצפנה metadata מופעלת תמיד על אחסון לאימוץ בכל פעם FBE מופעלת, גם כאשר ההצפנה מטה אינה מופעלת על אחסון פנימי.

בשנת AOSP, יש שני יישומים של הצפנה מטה על אחסון לאימוץ: אחד משימוש, המבוסס על dm-crypt , וכן בהתבסס לחדשה יותר על dm-default-key . כדי להבטיח שהיישום הנכון נבחר עבור המכשיר, להבטיח כי קבעת את הערך הנכון עבור PRODUCT_SHIPPING_API_LEVEL ב device.mk . לדוגמא, אם השקות מכשירות עם 11 אנדרואיד (רמת ה- API 30), device.mk צריך להכיל:

PRODUCT_SHIPPING_API_LEVEL := 30

תוכל גם להגדיר את מאפייני המערכת הבאים כדי לאלץ את השימוש בשיטת הצפנת המטא נתונים החדשה (ובגרסת המדיניות החדשה של FBE) ללא קשר לרמת ה- API למשלוח:

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 ופעם עם מפתח הצפנה מטה. הצפנה כפולה זו מפחיתה את הביצועים ואינה נדרשת להשגת מטרות האבטחה של הצפנת מטא נתונים, שכן אנדרואיד מבטיחה שקשה להתפשר על מפתחות 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.