Android 7.0 และสูงกว่ารองรับ การเข้ารหัสตามไฟล์ (FBE) FBE อนุญาตให้เข้ารหัสไฟล์ต่าง ๆ ด้วยคีย์ต่าง ๆ ที่สามารถปลดล็อคได้อย่างอิสระ คีย์เหล่านี้ใช้เพื่อเข้ารหัสทั้งเนื้อหาไฟล์และชื่อไฟล์ เมื่อใช้ FBE ข้อมูลอื่นๆ เช่น โครงร่างไดเร็กทอรี ขนาดไฟล์ สิทธิ์ และเวลาสร้าง/แก้ไข จะไม่ถูกเข้ารหัส ข้อมูลอื่นนี้เรียกรวมกันว่าข้อมูลเมตาของระบบไฟล์
Android 9 แนะนำการรองรับการเข้ารหัสข้อมูลเมตา ด้วยการเข้ารหัสข้อมูลเมตา คีย์เดียวที่มีอยู่ ณ เวลาบูตจะเข้ารหัสเนื้อหาใดก็ตามที่ไม่ได้เข้ารหัสโดย FBE คีย์นี้ได้รับการปกป้องโดย Keymaster ซึ่งจะได้รับการปกป้องด้วยการบูตที่ผ่านการตรวจสอบแล้ว
การเข้ารหัสข้อมูลเมตาจะเปิดใช้งานเสมอใน ที่เก็บข้อมูลที่ปรับใช้ได้ เมื่อใดก็ตามที่เปิดใช้งาน FBE นอกจากนี้ยังสามารถเปิดใช้งานการเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายใน อุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไปต้องเปิดใช้งานการเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายใน
การใช้งานในที่จัดเก็บข้อมูลภายใน
คุณสามารถตั้งค่าการเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายในของอุปกรณ์ใหม่ได้โดยการตั้งค่าระบบไฟล์ metadata
เปลี่ยนลำดับเริ่มต้น และเปิดใช้งานการเข้ารหัสข้อมูลเมตาในไฟล์ fstab ของอุปกรณ์
ข้อกำหนดเบื้องต้น
การเข้ารหัสข้อมูลเมตาสามารถตั้งค่าได้เฉพาะเมื่อมีการฟอร์แมตพาร์ติชันข้อมูลเป็นครั้งแรก ด้วยเหตุนี้ คุณลักษณะนี้จึงมีไว้สำหรับอุปกรณ์ใหม่เท่านั้น นี่ไม่ใช่สิ่งที่ OTA ควรเปลี่ยนแปลง
การเข้ารหัสข้อมูลเมตาจำเป็นต้องเปิดใช้งานโมดูล dm-default-key
ในเคอร์เนลของคุณ ใน Android 11 ขึ้นไป 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
ใช้ฮาร์ดแวร์เข้ารหัสแบบอินไลน์ (ฮาร์ดแวร์ที่เข้ารหัส/ถอดรหัสข้อมูลในขณะที่อยู่ระหว่างทางไป/จากอุปกรณ์จัดเก็บข้อมูล) เมื่อพร้อมใช้งาน หากคุณจะ ไม่ ใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ จำเป็นต้องเปิดใช้งานทางเลือกสำรองไปยัง API การเข้ารหัสของเคอร์เนล:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
เมื่อไม่ได้ใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ คุณควรเปิดใช้งานการเร่งความเร็วตาม CPU ที่มีอยู่ตามที่แนะนำใน เอกสารประกอบของ FBE
ใน Android 10 และต่ำกว่า dm-default-key
ไม่รองรับโดยเคอร์เนลทั่วไปของ Android ดังนั้นจึงขึ้นอยู่กับผู้ขายที่จะใช้ dm-default-key
ตั้งค่าระบบไฟล์ข้อมูลเมตา
เนื่องจากไม่มีสิ่งใดในพาร์ติชันข้อมูลผู้ใช้ที่สามารถอ่านได้จนกว่าจะมีคีย์การเข้ารหัสข้อมูลเมตา ตารางพาร์ติชันจึงต้องแยกพาร์ติชันแยกต่างหากที่เรียกว่า "พาร์ติชันข้อมูลเมตา" สำหรับจัดเก็บคีย์มาสเตอร์บล็อบที่ป้องกันคีย์นี้ พาร์ติชันข้อมูลเมตาควรเป็น 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
เพื่อให้แน่ใจว่าเริ่มต้นเร็วพอ ให้เพิ่ม stanza ต่อไปนี้ใน init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
คีย์มาสเตอร์ต้องทำงานและพร้อมก่อนที่จะพยายามเมานต์ /data
init.hardware.rc
ควรมีคำสั่ง mount_all
ซึ่งติดตั้ง /data
เองใน stanza 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
ตัวอย่างเช่น หากอุปกรณ์ของคุณเปิดตัวด้วย Android 11 (API ระดับ 30) device.mk
ควรมี:
PRODUCT_SHIPPING_API_LEVEL := 30
คุณยังสามารถตั้งค่าคุณสมบัติระบบต่อไปนี้เพื่อบังคับใช้ API dm-default-key
ใหม่โดยไม่คำนึงถึงระดับการจัดส่ง 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 เพื่อตรวจสอบความถูกต้องของการเข้ารหัสข้อมูลเมตาและ FBE:
atest vts_kernel_encryption_test
หรือ:
vts-tradefed run vts -m vts_kernel_encryption_test
ปัญหาที่พบบ่อย
ระหว่างการเรียกไปยัง mount_all
ซึ่งเมาต์พาร์ติชัน /data
ที่เข้ารหัสข้อมูลเม init
ดำเนินการเครื่องมือ vdc เครื่องมือ vdc เชื่อมต่อกับ vold
over 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 (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 ขึ้นไป การเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลที่ปรับใช้ได้จะใช้โมดูลเคอร์เนล 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
วิธีการดั้งเดิม
ในอุปกรณ์ที่เปิดตัวด้วย Android 10 หรือต่ำกว่า การเข้ารหัสข้อมูลเมตาในที่เก็บข้อมูลที่ปรับใช้ได้จะใช้โมดูลเคอร์เนล 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