Android 7.0 ขึ้นไปรองรับ การเข้ารหัสตามไฟล์ (FBE) FBE ทำให้ไฟล์ต่างๆ เข้ารหัสได้ด้วยคีย์ต่างๆ ที่ปลดล็อกได้ ได้อย่างอิสระ คีย์เหล่านี้ใช้ในการเข้ารหัสทั้งเนื้อหาและชื่อไฟล์ เมื่อใช้ FBE ข้อมูลอื่นๆ เช่น เลย์เอาต์ไดเรกทอรี ขนาดไฟล์ สิทธิ์ และเวลาในการสร้าง/แก้ไขจะไม่มีการเข้ารหัส รวมกัน ข้อมูลนี้เรียกว่าข้อมูลเมตาของระบบไฟล์
Android 9 เพิ่มการรองรับการเข้ารหัสข้อมูลเมตา เมื่อใช้การเข้ารหัสข้อมูลเมตา จะมีคีย์เดียวปรากฏขึ้นในเวลาบูตจะเข้ารหัส เนื้อหาไม่ได้รับการเข้ารหัสโดย FBE คีย์นี้ได้รับการปกป้องโดย Keymaster ซึ่งจะ เปิดการป้องกันโดยการเปิดเครื่องที่ได้รับการยืนยัน
การเข้ารหัสข้อมูลเมตาจะเปิดใช้เสมอในพื้นที่เก็บข้อมูลที่สามารถนำมาใช้ได้เมื่อใดก็ตามที่เปิดใช้ FBE นอกจากนี้ยังเปิดใช้การเข้ารหัสข้อมูลเมตาบนที่จัดเก็บข้อมูลภายในได้ด้วย เปิดตัวอุปกรณ์แล้ว สำหรับ Android 11 ขึ้นไปต้องมีการเข้ารหัสข้อมูลเมตา เปิดที่จัดเก็บข้อมูลภายในไว้
การใช้งานกับที่จัดเก็บข้อมูลภายใน
คุณสามารถตั้งค่าการเข้ารหัสข้อมูลเมตาในที่จัดเก็บข้อมูลภายในของอุปกรณ์ใหม่ได้โดยดำเนินการดังนี้
ตั้งค่าระบบไฟล์ metadata
เปลี่ยนลำดับ init และ
เปิดใช้การเข้ารหัสข้อมูลเมตาในไฟล์ 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
ตั้งค่าระบบไฟล์ข้อมูลเมตา
เนื่องจากไม่มีสิ่งใดในพาร์ติชันข้อมูลผู้ใช้ที่อ่านได้จนกว่าข้อมูลเมตา มีคีย์การเข้ารหัส ตารางพาร์ติชันต้องแยก ที่เรียกว่า "พาร์ติชันข้อมูลเมตา" สำหรับจัดเก็บ BLOB ของคีย์มาสเตอร์ที่ ปกป้องกุญแจนี้ พาร์ติชันข้อมูลเมตาควรมีขนาด 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
แล้ว เพื่อให้มั่นใจว่าคุณจะเริ่มต้นเร็วพอ ให้เพิ่ม
ข้อความต่อไปนี้ถึง 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
ก่อนบรรทัดนี้ ให้เพิ่มคำสั่งเพื่อดำเนินการคำสั่ง
บริการ 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 วิธีที่ 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
เครื่องมือเชื่อมต่อกับ vold
ผ่าน 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 มีการใช้การเข้ารหัสข้อมูลเมตา 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-default-key
แต่เมธอด dm-crypt
ทำให้เนื้อหาไฟล์ได้รับการเข้ารหัส 2 ครั้ง คือ ครั้งแรกด้วยคีย์ 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 ได้เฉพาะในกรณีที่ อุปกรณ์ไม่มีความเร่ง AESro.crypto.fde_sector_size
เลือกขนาดกลุ่มคริปโต ตัวเลือกได้แก่ 512, 1024, 2048 และ 4096 สำหรับการเข้ารหัส Adiantum ให้ใช้ 4096