Android 7.0 ขึ้นไปรองรับ การเข้ารหัสตามไฟล์ (FBE) FBE อนุญาตให้เข้ารหัสไฟล์ต่างๆ ด้วยคีย์ที่แตกต่างกันซึ่งสามารถปลดล็อกแยกกันได้ คีย์เหล่านี้ใช้เพื่อเข้ารหัสทั้งเนื้อหาและชื่อไฟล์ เมื่อใช้ FBE ระบบจะไม่เข้ารหัสข้อมูลอื่นๆ เช่น เลย์เอาต์ไดเรกทอรี ขนาดไฟล์ สิทธิ์ และเวลาสร้าง/แก้ไข ข้อมูลอื่นๆ เหล่านี้รวมกันเรียกว่าข้อมูลเมตาของระบบไฟล์
Android 9 ได้เปิดตัวการรองรับการเข้ารหัสข้อมูลเมตา เมื่อมีการเข้ารหัสข้อมูลเมตา คีย์เดียวที่ปรากฏขึ้นในเวลาบูตจะเข้ารหัสเนื้อหาใดก็ตามที่ FBE ไม่ได้เข้ารหัส คีย์นี้ได้รับการปกป้องโดย KeyMint (เดิมชื่อ Keymaster) ซึ่งได้รับการปกป้องโดย การเปิดเครื่องที่ได้รับการยืนยัน อีกชั้นหนึ่ง
การเข้ารหัสข้อมูลเมตาจะเปิดใช้ในพื้นที่เก็บข้อมูลแบบ Adoptable เสมอเมื่อเปิดใช้ FBE นอกจากนี้ คุณยังเปิดใช้การเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายในได้ด้วย อุปกรณ์ที่เปิดตัวด้วย Android 11 ขึ้นไปต้องเปิดใช้การเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายใน
การติดตั้งใช้งานในที่จัดเก็บข้อมูลภายใน
คุณสามารถตั้งค่าการเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายในของอุปกรณ์ใหม่ได้โดยการตั้งค่าระบบไฟล์ metadata เปลี่ยนลำดับ init และเปิดใช้การเข้ารหัสข้อมูลเมตาในไฟล์ fstab ของอุปกรณ์
สิ่งที่ต้องมีก่อน
คุณจะตั้งค่าการเข้ารหัสข้อมูลเมตาได้ก็ต่อเมื่อมีการจัดรูปแบบพาร์ติชันข้อมูลเป็นครั้งแรก ดังนั้น ฟีเจอร์นี้จึงมีไว้สำหรับอุปกรณ์ใหม่เท่านั้น ไม่ใช่สิ่งที่ OTA ควรเปลี่ยนแปลง
การเข้ารหัสข้อมูลเมตาต้องเปิดใช้โมดูล dm-default-key ในเคอร์เนล ใน Android 11 ขึ้นไป เคอร์เนลทั่วไปของ Android เวอร์ชัน 4.14 ขึ้นไปรองรับ dm-default-key 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 ลงไป เคอร์เนลทั่วไปของ Android ไม่รองรับ dm-default-key ดังนั้น ผู้ให้บริการจึงต้องเป็นผู้ติดตั้งใช้งาน dm-default-key
ตั้งค่าระบบไฟล์ข้อมูลเมตา
เนื่องจากระบบจะอ่านข้อมูลในพาร์ติชัน userdata ไม่ได้จนกว่าจะมีคีย์การเข้ารหัสข้อมูลเมตา ตารางพาร์ติชันจึงต้องจัดสรรพาร์ติชันแยกต่างหากที่เรียกว่า พาร์ติชันข้อมูลเมตา เพื่อจัดเก็บ Blob ของ KeyMint ที่ปกป้องคีย์นี้ พาร์ติชันข้อมูลเมตาควรมีขนาด 16 MB
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 หากต้องการให้แน่ใจว่าระบบจะเริ่มทำงานเร็วพอ ให้เพิ่ม stanza ต่อไปนี้ลงใน init.hardware.rc
# We need vold early for metadata encryption
on early-fs
start vold
KeyMint ต้องทำงานและพร้อมใช้งานก่อนที่ init จะพยายามติดตั้ง /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หรือmetadata_encryption=aes-256-xts:wrappedkey_v0wrappedkeyเป็นเวอร์ชันที่ทันสมัย ส่วนwrappedkey_v0ควรใช้ในอุปกรณ์ที่ไม่รองรับwrappedkeyหรือเปิดตัวด้วยwrappedkey_v0อยู่แล้วเท่านั้น ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ ดู เปิดใช้ คีย์ที่ห่อหุ้มในทั้ง 2 กรณี คุณสามารถละเว้น
aes-256-xtsได้เนื่องจากเป็น อัลกอริทึมเริ่มต้น เช่นmetadata_encryption=:wrappedkeyเทียบเท่ากับmetadata_encryption=aes-256-xts:wrappedkey
เนื่องจากอินเทอร์เฟซเคอร์เนลไปยัง 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 rootadb 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 ทำงาน KeyMint จะไม่ตอบสนองต่อ vold จนกว่าจะอ่านพร็อพเพอร์ตี้บางอย่างจาก init ซึ่งจะทำให้เกิดภาวะหยุดชะงักตามที่อธิบายไว้ การวาง exec_start wait_for_keymaster ไว้เหนือการเรียกใช้ mount_all ที่เกี่ยวข้องตามที่กำหนดไว้จะช่วยให้ KeyMint ทำงานได้อย่างเต็มที่ล่วงหน้าและหลีกเลี่ยงภาวะหยุดชะงักนี้
การกำหนดค่าในพื้นที่เก็บข้อมูลแบบ Adoptable
ตั้งแต่ Android 9 เป็นต้นมา ระบบจะเปิดใช้การเข้ารหัสข้อมูลเมตาในรูปแบบหนึ่งใน พื้นที่เก็บข้อมูลแบบ Adoptable เสมอเมื่อเปิดใช้ FBE แม้ว่าจะไม่ได้เปิดใช้การเข้ารหัสข้อมูลเมตาใน ที่จัดเก็บข้อมูลภายในก็ตาม
ใน AOSP มีการติดตั้งใช้งานการเข้ารหัสข้อมูลเมตาในพื้นที่เก็บข้อมูลแบบ Adoptable 2 แบบ ได้แก่ แบบที่เลิกใช้งานแล้วซึ่งอิงตาม 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 เช่นเดียวกับในพื้นที่เก็บข้อมูลภายใน โปรดดูตัวเลือกการกำหนดค่าเคอร์เนล
ที่ต้องเปิดใช้ในส่วนสิ่งที่ต้องมีก่อนด้านบน โปรดทราบว่าฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ที่ทำงานในพื้นที่เก็บข้อมูลภายในของอุปกรณ์อาจไม่พร้อมใช้งานในพื้นที่เก็บข้อมูลแบบ 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-crypt ทำให้เนื้อหาไฟล์ถูกเข้ารหัส 2 ครั้ง ได้แก่ ครั้งหนึ่งด้วยคีย์ FBE และอีกครั้งด้วยคีย์การเข้ารหัสข้อมูลเมตา ซึ่งแตกต่างจากวิธีการ dm-default-key การเข้ารหัส 2 ครั้งนี้จะลดประสิทธิภาพลงและไม่จำเป็นต่อการบรรลุเป้าหมายด้านความปลอดภัยของการเข้ารหัสข้อมูลเมตา เนื่องจาก Android รับประกันว่าคีย์ FBE จะมีความซับซ้อนในการเจาะระบบอย่างน้อยเท่ากับคีย์การเข้ารหัสข้อมูลเมตา ผู้ให้บริการสามารถปรับแต่งเคอร์เนลเพื่อหลีกเลี่ยงการเข้ารหัส 2 ครั้งได้ โดยเฉพาะอย่างยิ่งโดยการติดตั้งใช้งานตัวเลือก
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 ได้ก็ต่อเมื่อ อุปกรณ์ไม่มีการเร่งความเร็ว AESro.crypto.fde_sector_sizeเลือกขนาดเซกเตอร์การเข้ารหัส ตัวเลือกคือ 512, 1024, 2048 และ 4096 สำหรับการเข้ารหัส Adiantum ให้ใช้ 4096