Android 7.0 dan yang lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan file yang berbeda dienkripsi dengan kunci berbeda yang dapat dibuka mereka dapat bekerja secara mandiri. Kunci ini digunakan untuk mengenkripsi isi file dan nama file. Ketika FBE digunakan, informasi lainnya, seperti tata letak direktori, ukuran file, izin, dan waktu pembuatan/perubahan, tidak dienkripsi. Secara kolektif, informasi lain ini dikenal sebagai {i>metadata <i}sistem file.
Android 9 memperkenalkan dukungan untuk enkripsi metadata. Dengan enkripsi {i>metadata<i}, satu kunci yang ada pada saat {i>booting<i} mengenkripsi konten tidak dienkripsi oleh FBE. Kunci ini dilindungi oleh Keymaster, yang terletak di pada gilirannya dilindungi oleh {i>booting<i} yang terverifikasi.
Enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan. Enkripsi metadata juga dapat diaktifkan di penyimpanan internal. Perangkat diluncurkan dengan Android 11 atau yang lebih tinggi harus memiliki enkripsi metadata di penyimpanan internal diaktifkan.
Implementasi pada penyimpanan internal
Anda dapat menyiapkan enkripsi metadata pada penyimpanan internal perangkat baru dengan
menyiapkan sistem file metadata
, mengubah urutan init, dan
mengaktifkan enkripsi metadata
di file fstab perangkat.
Prasyarat
Enkripsi metadata hanya dapat disiapkan ketika partisi data pertama kali diformat. Oleh karena itu, fitur ini hanya tersedia untuk perangkat baru. ini tidak sesuatu yang harus diubah oleh OTA.
Enkripsi metadata mengharuskan modul dm-default-key
di {i>kernel<i}. Di Android 11 dan yang lebih tinggi,
dm-default-key
didukung oleh kernel umum Android, versi
4.14 dan yang lebih tinggi. Versi dm-default-key
ini menggunakan hardware dan
framework enkripsi independen vendor yang disebut blk-crypto.
Untuk mengaktifkan dm-default-key
, gunakan:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
menggunakan hardware enkripsi inline (hardware yang
mengenkripsi/mendekripsi data saat dalam perjalanan ke/dari perangkat penyimpanan) saat
yang tersedia. Jika Anda tidak akan menggunakan hardware enkripsi inline,
juga diperlukan untuk mengaktifkan fallback ke API kriptografi kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Jika tidak menggunakan hardware enkripsi inline, Anda juga harus mengaktifkan semua hardware yang tersedia Akselerasi berbasis CPU seperti yang direkomendasikan dalam dokumentasi FBE.
Di Android 10 dan yang lebih rendah, dm-default-key
tidak didukung oleh {i>
kernel<i} umum Android. Oleh karena itu, terserah vendor
untuk menerapkan dm-default-key
.
Menyiapkan sistem file metadata
Karena tidak ada apa pun dalam partisi {i>userdata<i} yang dapat dibaca hingga {i>metadata<i} ada kunci enkripsi, tabel partisi harus menyisihkan partisi yang disebut "partisi metadata" untuk menyimpan blob keymaster melindungi kunci ini. Partisi metadata harus 16 MB.
fstab.hardware
harus menyertakan entri untuk sistem file metadata
yang ada di partisi tersebut yang memasangnya di /metadata
, termasuk
flag formattable
untuk memastikannya diformat pada saat booting. Tujuan
Sistem file f2fs tidak berfungsi pada partisi yang lebih kecil; sebaiknya gunakan ext4
sebagai gantinya. Contoh:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
Untuk memastikan titik pemasangan /metadata
ada, tambahkan baris berikut
ke BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Perubahan pada urutan init
Jika enkripsi metadata digunakan, vold
harus dijalankan sebelum
/data
telah dipasang. Untuk memastikan bahwa proses itu dimulai cukup awal, tambahkan
stanza berikut untuk init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster harus berjalan dan siap sebelum percobaan init dipasang
/data
.
init.hardware.rc
harus sudah berisi mount_all
instruksi yang memasang /data
dalam stanza on
late-fs
. Sebelum baris ini, tambahkan perintah untuk menjalankan
Layanan 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
Mengaktifkan enkripsi metadata
Terakhir tambahkan keydirectory=/metadata/vold/metadata_encryption
ke
fs_mgr_flags dari entri fstab
untuk
userdata
. Misalnya, baris fstab lengkap mungkin terlihat seperti:
/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
Secara default, algoritma enkripsi metadata pada penyimpanan internal
AES-256-XTS. Hal ini dapat diganti dengan menetapkan
metadata_encryption
, juga di
Kolom fs_mgr_flags:
- Pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum mungkin
diaktifkan dengan menyetel
metadata_encryption=adiantum
. - Pada perangkat yang mendukung tombol yang digabungkan dengan hardware,
kunci enkripsi metadata dapat dibuat
yang dibungkus perangkat keras dengan mengatur
metadata_encryption=aes-256-xts:wrappedkey_v0
(atau yang setara denganmetadata_encryption=:wrappedkey_v0
, sepertiaes-256-xts
adalah algoritma default).
Karena antarmuka kernel ke dm-default-key
berubah di Android
11, Anda juga harus memastikan bahwa Anda telah menetapkan
nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL
di
device.mk
. Misalnya, jika perangkat diluncurkan dengan Android
11 (level API 30), device.mk
harus
berisi:
PRODUCT_SHIPPING_API_LEVEL := 30
Anda juga dapat menetapkan properti sistem berikut untuk memaksa penggunaan
dm-default-key
API terlepas dari level API pengiriman:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Validasi
Untuk memastikan bahwa enkripsi metadata telah diaktifkan dan berfungsi dengan benar, jalankan pengujian yang dijelaskan di bawah ini. Perhatikan juga kesalahan masalah yang dijelaskan di bawah ini.
Pengujian
Mulailah dengan menjalankan perintah berikut untuk memverifikasi bahwa enkripsi metadata telah diaktifkan di penyimpanan internal:
adb root
adb shell dmctl table userdata
Output harus serupa dengan:
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
Jika Anda mengganti setelan enkripsi default dengan menyetel atribut
metadata_encryption
di fstab
perangkat, lalu
{i>output-<i}nya akan sedikit berbeda dari yang di atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum,
akan menjadi xchacha12,aes-adiantum-plain64
, bukan
aes-xts-plain64
.
Berikutnya, jalankan vts_kernel_encryption_test untuk memverifikasi keakuratan enkripsi metadata dan FBE:
atest vts_kernel_encryption_test
atau:
vts-tradefed run vts -m vts_kernel_encryption_test
Masalah umum
Selama panggilan ke mount_all
, yang memasang data yang dienkripsi
/data
, init
akan menjalankan alat vdc. VDC
alat terhubung ke vold
melalui binder
untuk menyiapkan
perangkat yang dienkripsi dengan metadata
dan memasang partisi. Selama durasi
panggilan, init
diblokir, dan mencoba membaca atau menyetel
init
properti akan diblokir hingga mount_all
selesai.
Jika, pada tahap ini, setiap bagian dari pekerjaan vold
secara langsung atau
diblokir secara tidak langsung saat membaca atau menyetel properti, akan menyebabkan deadlock. Penting
untuk memastikan bahwa vold
dapat menyelesaikan tugas membaca
kunci, berinteraksi dengan Keymaster, dan memasang direktori data tanpa
yang berinteraksi lebih lanjut dengan init
.
Jika Keymaster tidak sepenuhnya dimulai saat mount_all
berjalan, Keymaster tidak akan
respons vold
hingga membaca properti tertentu dari
init
, yang mengakibatkan deadlock persis seperti yang dijelaskan. Menempatkan
exec_start wait_for_keymaster
di atas nilai relevan
Pemanggilan mount_all
seperti yang ditetapkan memastikan bahwa Keymaster sepenuhnya
berjalan di muka sehingga dapat
menghindari {i>deadlock<i}.
Konfigurasi pada penyimpanan yang dapat diadaptasi
Sejak Android 9, suatu bentuk enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan, meskipun enkripsi metadata tidak diaktifkan dan penyimpanan internal.
Di AOSP, ada dua implementasi enkripsi metadata pada
penyimpanan: penyimpanan yang tidak digunakan lagi berdasarkan dm-crypt
, dan penyimpanan yang lebih baru berdasarkan
pada dm-default-key
. Untuk memastikan bahwa
penerapan yang benar
untuk perangkat, pastikan Anda telah menyetel nilai yang benar untuk
PRODUCT_SHIPPING_API_LEVEL
dalam device.mk
. Misalnya,
jika perangkat diluncurkan dengan Android 11 (API level 30),
device.mk
harus berisi:
PRODUCT_SHIPPING_API_LEVEL := 30
Anda juga dapat menetapkan properti sistem berikut untuk memaksa penggunaan metode enkripsi metadata volume (dan versi kebijakan FBE default baru) terlepas dari API level pengiriman:
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
Metode saat ini
Pada perangkat yang diluncurkan dengan Android 11 atau yang lebih tinggi,
enkripsi metadata pada penyimpanan yang dapat diadopsi menggunakan dm-default-key
modul {i>kernel<i}, seperti pada
penyimpanan internal. Lihat prasyarat di atas untuk konfigurasi kernel yang mana
mengaktifkan opsi. Perhatikan bahwa hardware enkripsi inline yang berfungsi pada
penyimpanan internal perangkat mungkin tidak
tersedia di penyimpanan yang dapat diadopsi, sehingga
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
mungkin wajib diisi.
Secara default, metode enkripsi metadata volume dm-default-key
menggunakan algoritma enkripsi AES-256-XTS dengan sektor kripto 4096 byte. Tujuan
algoritma ini dapat diganti
dengan menyetel atribut
Properti sistem ro.crypto.volume.metadata.encryption
. Ini
nilai properti memiliki sintaksis yang sama dengan metadata_encryption
opsi fstab yang dijelaskan di atas. Misalnya, pada perangkat yang tidak memiliki AES
akselerasi, Enkripsi adiantum
dapat diaktifkan dengan menyetel
ro.crypto.volume.metadata.encryption=adiantum
.
Metode lama
Di perangkat yang diluncurkan dengan Android 10 atau yang lebih rendah, metadata
enkripsi pada penyimpanan yang dapat diadopsi menggunakan modul kernel dm-crypt
dan bukan dm-default-key
:
CONFIG_DM_CRYPT=y
Berbeda dengan metode dm-default-key
, metode dm-crypt
menyebabkan isi file dienkripsi dua kali: sekali dengan kunci FBE dan sekali dengan
kunci enkripsi metadata. Enkripsi ganda ini mengurangi
kinerja dan
tidak diperlukan untuk mencapai sasaran keamanan enkripsi metadata, karena Android
memastikan bahwa kunci FBE setidaknya sama sulitnya untuk disusupi
kunci enkripsi. Vendor dapat membuat penyesuaian {i>
kernel<i} untuk menghindari
enkripsi, khususnya dengan menerapkan
allow_encrypt_override
opsi yang akan diteruskan Android
dm-crypt
saat properti sistem
ro.crypto.allow_encrypt_override
disetel ke true
.
Penyesuaian ini tidak didukung oleh kernel umum Android.
Secara default, metode enkripsi metadata volume dm-crypt
akan menggunakan
Algoritma enkripsi AES-128-CBC dengan sektor kripto ESSIV dan 512 byte. Ini
dapat diganti dengan mengatur
properti sistem berikut (yang juga
digunakan untuk FDE):
ro.crypto.fde_algorithm
memilih enkripsi metadata algoritme. Pilihannya adalahaes-128-cbc
danadiantum
. Adiantum hanya dapat digunakan jika perangkat tidak memiliki akselerasi AES.ro.crypto.fde_sector_size
memilih ukuran sektor kripto. Pilihannya adalah 512, 1024, 2048, dan 4096. Untuk enkripsi Adiantum, gunakan 4096.