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