Android 7.0 ขึ้นไปรองรับการเข้ารหัสตามไฟล์ (FBE) FBE ช่วยให้เข้ารหัสไฟล์ต่างๆ ด้วยคีย์ที่แตกต่างกันซึ่งปลดล็อกได้ โดยอิสระ ระบบจะใช้คีย์เหล่านี้เพื่อเข้ารหัสทั้งเนื้อหาและชื่อไฟล์ เมื่อใช้ FBE ระบบจะไม่เข้ารหัสข้อมูลอื่นๆ เช่น เลย์เอาต์ไดเรกทอรี ขนาดไฟล์ สิทธิ์ และเวลาสร้าง/แก้ไข ข้อมูลอื่นๆ เหล่านี้เรียกรวมกันว่าข้อมูลเมตาของระบบไฟล์
Android 9 เปิดตัวการรองรับการเข้ารหัสข้อมูลเมตา เมื่อใช้การเข้ารหัสข้อมูลเมตา คีย์เดียวที่แสดงในเวลาบูตจะเข้ารหัสเนื้อหาที่ FBE ไม่ได้เข้ารหัส คีย์นี้ได้รับการปกป้องโดย KeyMint (เดิมชื่อ 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
จะใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ (ฮาร์ดแวร์ที่เข้ารหัส/ถอดรหัสข้อมูลขณะที่ข้อมูลกำลังเดินทางไปยัง/จากอุปกรณ์จัดเก็บข้อมูล) เมื่อพร้อมใช้งาน
หากไม่ได้ใช้ฮาร์ดแวร์การเข้ารหัสแบบอินไลน์ คุณจะต้องเปิดใช้การสำรองข้อมูลไปยัง Cryptography 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
การเปลี่ยนแปลงลำดับการเริ่มต้น
เมื่อใช้การเข้ารหัสข้อมูลเมตา vold
ต้องทำงานก่อนที่จะติดตั้ง /data
หากต้องการให้แน่ใจว่ามีการเริ่มต้นเร็วพอ ให้เพิ่ม
ส่วนต่อไปนี้ลงใน init.hardware.rc
# We need vold early for metadata encryption on early-fs start vold
KeyMint ต้องทำงานและพร้อมใช้งานก่อนที่ init จะพยายามติดตั้ง/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 คุณจะเปิดใช้การเข้ารหัส 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 ฟิลด์ที่ 3 จะเป็น 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
tool เชื่อมต่อกับ vold
ผ่าน binder
เพื่อตั้งค่า
อุปกรณ์ที่เข้ารหัสข้อมูลเมตาและติดตั้งพาร์ติชัน ในระหว่างการเรียกใช้
นี้ ระบบจะบล็อก init
และการพยายามอ่านหรือตั้งค่าพร็อพเพอร์ตี้
init
จะถูกบล็อกจนกว่า mount_all
จะเสร็จสิ้น
หากในขั้นตอนนี้ ส่วนใดส่วนหนึ่งของvold
's work ถูกบล็อกโดยตรงหรือโดยอ้อมไม่ให้อ่านหรือตั้งค่าพร็อพเพอร์ตี้ จะเกิดภาวะหยุดชะงัก สิ่งสำคัญคือต้องตรวจสอบว่า vold
สามารถอ่านคีย์ โต้ตอบกับ KeyMint และเมานต์ไดเรกทอรีข้อมูลได้โดยไม่ต้องโต้ตอบกับ init
เพิ่มเติม
หาก KeyMint ยังไม่เริ่มทำงานอย่างเต็มรูปแบบเมื่อ mount_all
ทำงาน KeyMint จะไม่ตอบสนองต่อ vold
จนกว่าจะอ่านพร็อพเพอร์ตี้บางอย่างจาก init
ซึ่งส่งผลให้เกิดภาวะหยุดชะงักตามที่อธิบายไว้ การวาง
exec_start wait_for_keymaster
เหนือการเรียกใช้ที่เกี่ยวข้อง
mount_all
ตามที่ระบุไว้จะช่วยให้มั่นใจได้ว่า KeyMint จะทำงาน
อย่างเต็มที่ล่วงหน้าและหลีกเลี่ยงภาวะหยุดชะงักนี้
การกำหนดค่าในพื้นที่เก็บข้อมูลแบบ Adoptable
ตั้งแต่ Android 9 เป็นต้นมา ระบบจะเปิดใช้การเข้ารหัสข้อมูลเมตาในรูปแบบหนึ่ง ในพื้นที่เก็บข้อมูลที่ปรับใช้ได้เสมอ เมื่อใดก็ตามที่เปิดใช้ FBE แม้ว่าจะไม่ได้เปิดใช้การเข้ารหัสข้อมูลเมตาใน พื้นที่เก็บข้อมูลภายในก็ตาม
ใน AOSP การเข้ารหัสข้อมูลเมตาในพื้นที่เก็บข้อมูลที่ปรับใช้ได้มี 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 ขึ้นไป
การเข้ารหัสข้อมูลเมตาในพื้นที่เก็บข้อมูลที่ปรับใช้ได้จะใช้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-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 ไบต์ คุณสามารถลบล้างการตั้งค่านี้ได้โดยการตั้งค่าพร็อพเพอร์ตี้ของระบบต่อไปนี้ (ซึ่งใช้สำหรับ FDE ด้วย)
ro.crypto.fde_algorithm
เลือกอัลกอริทึมการเข้ารหัสข้อมูลเมตา โดยตัวเลือกมีดังนี้aes-128-cbc
และadiantum
Adiantum จะใช้ได้ก็ต่อเมื่อ อุปกรณ์ไม่มีการเร่ง AESro.crypto.fde_sector_size
เลือกขนาดภาคส่วนคริปโต โดยตัวเลือกมีดังนี้ 512, 1024, 2048 และ 4096 สำหรับการเข้ารหัส Adiantum ให้ใช้ 4096