การเข้ารหัสข้อมูลเมตา

Android 7.0 และสูงกว่าการสนับสนุน การเข้ารหัสไฟล์-based (FBE) FBE อนุญาตให้เข้ารหัสไฟล์ต่าง ๆ ด้วยคีย์ต่าง ๆ ที่สามารถปลดล็อคได้อย่างอิสระ คีย์เหล่านี้ใช้เพื่อเข้ารหัสทั้งเนื้อหาไฟล์และชื่อไฟล์ เมื่อใช้ FBE ข้อมูลอื่นๆ เช่น เค้าโครงไดเร็กทอรี ขนาดไฟล์ การอนุญาต และเวลาในการสร้าง/แก้ไข จะไม่ถูกเข้ารหัส เรียกรวมกันว่าข้อมูลอื่น ๆ นี้เรียกว่าข้อมูลเมตาของระบบไฟล์

Android 9 รองรับการเข้ารหัสข้อมูลเมตา ด้วยการเข้ารหัสข้อมูลเมตา คีย์เดียวที่มีอยู่ในเวลาบูตจะเข้ารหัสเนื้อหาใดก็ตามที่ไม่ได้เข้ารหัสโดย FBE คีย์นี้ได้รับการปกป้องโดย Keymaster ซึ่งได้รับการปกป้องด้วยการบู๊ตที่ตรวจสอบแล้ว

การเข้ารหัสข้อมูลเมตาถูกเปิดใช้งานอยู่เสมอใน การจัดเก็บ adoptable เมื่อใดก็ตามที่ FBE ถูกเปิดใช้งาน การเข้ารหัสข้อมูลเมตายังสามารถเปิดใช้งานบนที่จัดเก็บข้อมูลภายในได้อีกด้วย อุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไปต้องเปิดใช้งานการเข้ารหัสข้อมูลเมตาบนที่จัดเก็บข้อมูลภายใน

การใช้งานกับที่จัดเก็บข้อมูลภายใน

คุณสามารถตั้งค่าการเข้ารหัสข้อมูลเมตาในการจัดเก็บข้อมูลภายในของอุปกรณ์ใหม่โดยการตั้งค่า metadata ระบบแฟ้มเปลี่ยนลำดับ init และช่วยให้การเข้ารหัสข้อมูลเมตาในไฟล์ fstab อุปกรณ์

ข้อกำหนดเบื้องต้น

การเข้ารหัสข้อมูลเมตาสามารถตั้งค่าได้เฉพาะเมื่อมีการฟอร์แมตพาร์ติชั่นข้อมูลเป็นครั้งแรก ด้วยเหตุนี้ คุณลักษณะนี้จึงใช้ได้เฉพาะกับอุปกรณ์ใหม่เท่านั้น นี่ไม่ใช่สิ่งที่ OTA ควรเปลี่ยนแปลง

การเข้ารหัสข้อมูลเมตาต้องว่า dm-default-key โมดูลเปิดใช้งานในเคอร์เนลของคุณ ใน Android 11 และสูงกว่า dm-default-key ได้รับการสนับสนุนโดยเมล็ดที่พบบ่อย Android รุ่น 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

เมื่อไม่ได้ใช้การเข้ารหัสฮาร์ดแวร์แบบอินไลน์คุณยังควรเปิดใช้งานการเร่งความเร็วของ CPU-based ใด ๆ ตามคำแนะนำใน เอกสาร FBE

ใน Android 10 และต่ำกว่า dm-default-key ไม่ได้รับการสนับสนุนโดยเคอร์เนลทั่วไป Android ดังนั้นจึงขึ้นอยู่กับผู้ขายที่จะใช้ dm-default-key

ตั้งค่าระบบไฟล์ข้อมูลเมตา

เนื่องจากไม่มีสิ่งใดในพาร์ติชั่น userdata สามารถอ่านได้จนกว่าจะมีคีย์การเข้ารหัสข้อมูลเมตา ตารางพาร์ติชั่นต้องแยกพาร์ติชั่นที่เรียกว่า "พาร์ติชั่นเมทาดาทา" แยกกัน เพื่อจัดเก็บ keymaster blobs ที่ป้องกันคีย์นี้ พาร์ติชันข้อมูลเมตาควรเป็น 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

การเปลี่ยนแปลงลำดับเริ่มต้น

เมื่อการเข้ารหัสข้อมูลเมตาจะใช้ 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, การเข้ารหัส 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 ตัวอย่างเช่นถ้าเปิดตัวอุปกรณ์ของคุณกับ Android 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 แล้วออกจะแตกต่างกันเล็กน้อยจากด้านบน ตัวอย่างเช่นถ้าคุณเปิดใช้ การเข้ารหัส Adiantum แล้วสนามที่สามจะ xchacha12,aes-adiantum-plain64 แทน aes-xts-plain64

ถัดไปเรียกใช้ vts_kernel_encryption_test เพื่อตรวจสอบความถูกต้องของการเข้ารหัส metadata และ 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 's ทำงานโดยตรงหรือโดยอ้อมที่ถูกปิดกั้นในการอ่านหรือการตั้งค่าสถานที่ให้บริการหยุดชะงักจะส่งผลให้ มันเป็นสิ่งสำคัญเพื่อให้มั่นใจว่า vold สามารถดำเนินงานของการอ่านคีย์มีปฏิสัมพันธ์กับ Keymaster และติดตั้งไดเรกทอรีข้อมูลโดยไม่ต้องมีปฏิสัมพันธ์ต่อกับ init

หาก Keymaster ไม่ได้เริ่มอย่างเต็มที่เมื่อ mount_all ทำงานก็จะไม่ตอบสนองต่อการ vold จนกว่าจะได้อ่านคุณสมบัติบางอย่างจาก init ผลในตรงชะงักอธิบาย วาง exec_start wait_for_keymaster ข้างต้นเกี่ยวข้อง mount_all ภาวนาตามที่กำหนดไว้เพื่อให้มั่นใจว่า Keymaster กำลังทำงานอย่างเต็มที่ในการล่วงหน้าและเพื่อหลีกเลี่ยงการหยุดชะงักนี้

การกำหนดค่าบนพื้นที่เก็บข้อมูลที่ปรับใช้ได้

ตั้งแต่ Android 9 เป็นรูปแบบของการเข้ารหัสข้อมูลเมตาถูกเปิดใช้งานอยู่เสมอใน การจัดเก็บ adoptable เมื่อใดก็ตามที่ FBE ถูกเปิดใช้งานแม้ในขณะที่การเข้ารหัสข้อมูลเมตาไม่ได้เปิดใช้จัดเก็บข้อมูลภายใน

ใน AOSP มีสองการใช้งานของการเข้ารหัสในการจัดเก็บข้อมูลเมตา adoptable: หนึ่งเลิกขึ้นอยู่กับ dm-crypt และหนึ่งใหม่บนพื้นฐานของ dm-default-key เพื่อให้มั่นใจว่าการดำเนินการที่ถูกต้องจะถูกเลือกสำหรับอุปกรณ์ของคุณให้แน่ใจว่าคุณได้ตั้งค่าที่ถูกต้องสำหรับ PRODUCT_SHIPPING_API_LEVEL ใน device.mk ตัวอย่างเช่นถ้าเปิดตัวอุปกรณ์ของคุณกับ Android 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

วิธีการปัจจุบัน

บนอุปกรณ์ที่เปิดตัวพร้อมกับ Android 11 หรือสูงกว่า, การเข้ารหัสในการจัดเก็บข้อมูลเมตา adoptable ใช้ dm-default-key เคอร์เนลโมดูลเช่นเดียวกับที่จัดเก็บข้อมูลภายใน ดู สิ่งที่จำเป็น ดังกล่าวข้างต้นที่ตัวเลือกการตั้งค่า kernel เพื่อเปิดใช้งาน โปรดทราบว่าการเข้ารหัสฮาร์ดแวร์แบบอินไลน์ที่ทำงานในการจัดเก็บข้อมูลภายในของอุปกรณ์ที่อาจจะไม่สามารถใช้งานในการจัดเก็บ adoptable และทำให้ 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 หรือต่ำกว่าการเข้ารหัสในการจัดเก็บข้อมูลเมตา adoptable ใช้ 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 ไบต์ สามารถแทนที่ได้โดยการตั้งค่าคุณสมบัติของระบบต่อไปนี้ (ซึ่งใช้สำหรับ FDE ด้วย):

  • ro.crypto.fde_algorithm เลือกวิธีการเข้ารหัสข้อมูลเมตา ทางเลือกที่เป็น aes-128-cbc และ adiantum Adiantum อาจจะใช้เฉพาะในกรณีที่อุปกรณ์ที่ขาดเร่ง AES
  • ro.crypto.fde_sector_size เลือกขนาดภาคการเข้ารหัสลับ ตัวเลือกคือ 512, 1024, 2048 และ 4096 สำหรับการเข้ารหัส Adiantum ให้ใช้ 4096