অ্যান্ড্রয়েড ৭.০ এবং এর পরবর্তী সংস্করণ ফাইল-ভিত্তিক এনক্রিপশন (FBE) সমর্থন করে। FBE-এর মাধ্যমে বিভিন্ন ফাইলকে আলাদা আলাদা কী (key) দিয়ে এনক্রিপ্ট করা যায়, যা স্বাধীনভাবে আনলক করা যায়। এই কীগুলো ফাইলের বিষয়বস্তু এবং ফাইলের নাম উভয়ই এনক্রিপ্ট করতে ব্যবহৃত হয়। যখন FBE ব্যবহার করা হয়, তখন ডিরেক্টরি বিন্যাস, ফাইলের আকার, অনুমতি এবং তৈরি/পরিবর্তনের সময়ের মতো অন্যান্য তথ্য এনক্রিপ্ট করা হয় না। সম্মিলিতভাবে, এই অন্যান্য তথ্য ফাইলসিস্টেম মেটাডেটা নামে পরিচিত।
অ্যান্ড্রয়েড ৯ মেটাডেটা এনক্রিপশনের সুবিধা চালু করেছে। মেটাডেটা এনক্রিপশনের মাধ্যমে, বুট করার সময় উপস্থিত একটিমাত্র কী সেইসব কন্টেন্টকে এনক্রিপ্ট করে যা FBE দ্বারা এনক্রিপ্ট করা হয়নি। এই কী-টি KeyMint (পূর্বে Keymaster) দ্বারা সুরক্ষিত থাকে, যা আবার Verified Boot দ্বারা সুরক্ষিত।
যখনই FBE সক্রিয় করা হয়, অ্যাডপ্টেবল স্টোরেজে মেটাডেটা এনক্রিপশন সর্বদা সক্রিয় থাকে। ইন্টারনাল স্টোরেজেও মেটাডেটা এনক্রিপশন সক্রিয় করা যেতে পারে। Android 11 বা তার উচ্চতর সংস্করণ দিয়ে লঞ্চ হওয়া ডিভাইসগুলির ইন্টারনাল স্টোরেজে মেটাডেটা এনক্রিপশন অবশ্যই সক্রিয় থাকতে হবে।
অভ্যন্তরীণ স্টোরেজে বাস্তবায়ন
নতুন ডিভাইসগুলির অভ্যন্তরীণ স্টোরেজে মেটাডেটা এনক্রিপশন সেট আপ করার জন্য, আপনাকে metadata ফাইলসিস্টেম সেট আপ করতে হবে, ইনিট সিকোয়েন্স পরিবর্তন করতে হবে এবং ডিভাইসটির fstab ফাইলে মেটাডেটা এনক্রিপশন সক্রিয় করতে হবে।
পূর্বশর্ত
মেটাডেটা এনক্রিপশন শুধুমাত্র ডেটা পার্টিশন প্রথমবার ফরম্যাট করার সময়ই সেট আপ করা যায়। ফলে, এই ফিচারটি কেবল নতুন ডিভাইসের জন্য; এটি এমন কিছু নয় যা একটি OTA-এর মাধ্যমে পরিবর্তন করা উচিত।
মেটাডেটা এনক্রিপশনের জন্য আপনার কার্নেলে dm-default-key মডিউলটি সক্রিয় থাকা আবশ্যক। অ্যান্ড্রয়েড ১১ এবং এর পরবর্তী সংস্করণগুলোতে, অ্যান্ড্রয়েড কমন কার্নেলের ৪.১৪ এবং তার পরবর্তী সংস্করণগুলো 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 উপলব্ধ থাকলে ইনলাইন এনক্রিপশন হার্ডওয়্যার (এমন হার্ডওয়্যার যা স্টোরেজ ডিভাইসে ডেটা যাওয়া-আসার পথেই তা এনক্রিপ্ট/ডিক্রিপ্ট করে) ব্যবহার করে। আপনি যদি ইনলাইন এনক্রিপশন হার্ডওয়্যার ব্যবহার না করেন, তবে কার্নেলের ক্রিপ্টোগ্রাফি এপিআই-তে একটি ফলব্যাক সক্রিয় করাও আবশ্যক:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
ইনলাইন এনক্রিপশন হার্ডওয়্যার ব্যবহার না করার সময়, FBE ডকুমেন্টেশনে সুপারিশ অনুযায়ী উপলব্ধ যেকোনো সিপিইউ-ভিত্তিক অ্যাক্সিলারেশনও সক্রিয় করা উচিত।
অ্যান্ড্রয়েড ১০ এবং এর পূর্ববর্তী সংস্করণগুলোতে, অ্যান্ড্রয়েড কমন কার্নেল dm-default-key সমর্থন করত না। তাই dm-default-key বাস্তবায়নের দায়িত্ব ছিল ভেন্ডরদের উপর।
মেটাডেটা ফাইলসিস্টেম সেট আপ করুন
যেহেতু মেটাডেটা এনক্রিপশন কী উপস্থিত না থাকা পর্যন্ত ইউজারডেটা পার্টিশনের কিছুই পড়া যায় না, তাই এই কী-টিকে সুরক্ষিত রাখে এমন KeyMint ব্লবগুলো সংরক্ষণের জন্য পার্টিশন টেবিলে মেটাডেটা পার্টিশন নামে একটি পৃথক পার্টিশন অবশ্যই রাখতে হবে। মেটাডেটা পার্টিশনটি ১৬ মেগাবাইটের হওয়া উচিত।
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
ইনিট ক্রমের পরিবর্তন
যখন মেটাডেটা এনক্রিপশন ব্যবহার করা হয়, তখন /data মাউন্ট করার আগেই vold চালু থাকতে হবে। এটি যথেষ্ট আগে চালু হয় তা নিশ্চিত করতে, init.hardware.rc তে নিম্নলিখিত স্ট্যানজাটি যোগ করুন:
# We need vold early for metadata encryption
on early-fs
start vold init যখন /data মাউন্ট করার চেষ্টা করবে, তার আগে KeyMint অবশ্যই চালু এবং প্রস্তুত থাকতে হবে।
init.hardware.rc ইতিমধ্যেই একটি mount_all নির্দেশনা থাকা উচিত, যা on late-fs স্ট্যানজাতে /data মাউন্ট করে। এই লাইনের আগে, ` 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
মেটাডেটা এনক্রিপশন চালু করুন
অবশেষে userdata এর জন্য fstab এন্ট্রির fs_mgr_flags কলামে keydirectory=/metadata/vold/metadata_encryption যোগ করুন। উদাহরণস্বরূপ, একটি সম্পূর্ণ 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। fs_mgr_flags কলামে থাকা metadata_encryption অপশনটি সেট করার মাধ্যমে এটি পরিবর্তন করা যেতে পারে:
- যেসব ডিভাইসে AES অ্যাক্সিলারেশন নেই, সেগুলোতে
metadata_encryption=adiantumসেট করে Adiantum এনক্রিপশন সক্রিয় করা যেতে পারে। যেসব ডিভাইস হার্ডওয়্যার-র্যাপড ইনলাইন এনক্রিপশন কী সমর্থন করে, সেগুলোতে
metadata_encryption=aes-256-xts:wrappedkeyঅথবাmetadata_encryption=aes-256-xts:wrappedkey_v0সেট করার মাধ্যমে মেটাডেটা এনক্রিপশন কী-কে হার্ডওয়্যার-র্যাপড করা যায়।wrappedkeyহলো আধুনিক সংস্করণ;wrappedkey_v0শুধুমাত্র সেইসব ডিভাইসে ব্যবহার করা উচিত যেগুলোwrappedkeyসমর্থন করে না অথবা যেগুলো আগে থেকেইwrappedkey_v0দিয়ে চালু করা হয়েছে। আরও তথ্যের জন্য, র্যাপড কী সক্ষম করুন (Enable wrapped keys) দেখুন।উভয় ক্ষেত্রেই,
aes-256-xtsবাদ দেওয়া যেতে পারে কারণ এটি ডিফল্ট অ্যালগরিদম। উদাহরণস্বরূপ,metadata_encryption=:wrappedkeymetadata_encryption=aes-256-xts:wrappedkeyএর সমতুল্য।
যেহেতু Android 11-এ dm-default-key এর কার্নেল ইন্টারফেস পরিবর্তিত হয়েছে, তাই আপনাকে device.mk ফাইলে PRODUCT_SHIPPING_API_LEVEL এর জন্য সঠিক মান সেট করা নিশ্চিত করতে হবে। উদাহরণস্বরূপ, যদি আপনার ডিভাইসটি Android 11 (API লেভেল 30) দিয়ে চালু হয়, তাহলে device.mk ফাইলে নিম্নলিখিত বিষয়গুলো থাকা উচিত:
PRODUCT_SHIPPING_API_LEVEL := 30
শিপিং এপিআই লেভেল নির্বিশেষে নতুন dm-default-key এপিআই-এর ব্যবহার বাধ্যতামূলক করতে আপনি নিম্নলিখিত সিস্টেম প্রপার্টিটিও সেট করতে পারেন:
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
যদি আপনি ডিভাইসের fstab এ metadata_encryption অপশনটি সেট করে ডিফল্ট এনক্রিপশন সেটিংস ওভাররাইড করেন, তাহলে আউটপুটটি উপরেরটির থেকে কিছুটা ভিন্ন হবে। উদাহরণস্বরূপ, যদি আপনি Adiantum এনক্রিপশন সক্রিয় করেন, তাহলে তৃতীয় ফিল্ডটি aes-xts-plain64 এর পরিবর্তে xchacha12,aes-adiantum-plain64 হবে।
এরপরে, মেটাডেটা এনক্রিপশন এবং FBE-এর সঠিকতা যাচাই করতে vts_kernel_encryption_test চালান:
atest vts_kernel_encryption_test
অথবা:
vts-tradefed run vts -m vts_kernel_encryption_test
সাধারণ সমস্যা
mount_all কল চলাকালীন, যা মেটাডেটা-এনক্রিপ্টেড /data পার্টিশনটি মাউন্ট করে, init vdc টুলটি এক্সিকিউট করে। vdc টুলটি মেটাডেটা-এনক্রিপ্টেড ডিভাইসটি সেট আপ করতে এবং পার্টিশনটি মাউন্ট করতে binder মাধ্যমে vold এর সাথে সংযোগ স্থাপন করে। এই কল চলাকালীন init ব্লকড থাকে, এবং mount_all শেষ না হওয়া পর্যন্ত init প্রোপার্টি রিড বা সেট করার প্রচেষ্টাগুলো ব্লক হয়ে যায়। এই পর্যায়ে, যদি vold এর কাজের কোনো অংশ প্রত্যক্ষ বা পরোক্ষভাবে কোনো প্রোপার্টি রিড বা সেট করার কারণে ব্লক হয়ে যায়, তাহলে ডেডলক তৈরি হয়। এটা নিশ্চিত করা জরুরি যে vold যেন init সাথে আর কোনো রকম মিথস্ক্রিয়া না করেই কী-গুলো রিড করা, KeyMint-এর সাথে ইন্টারঅ্যাক্ট করা এবং ডেটা ডিরেক্টরি মাউন্ট করার কাজগুলো সম্পন্ন করতে পারে।
mount_all চলার সময় যদি KeyMint পুরোপুরি চালু না থাকে, তবে init থেকে নির্দিষ্ট কিছু প্রোপার্টি না পড়া পর্যন্ত এটি vold এর ডাকে সাড়া দেয় না, যার ফলে ঠিক বর্ণিত ডেডলকটি ঘটে। বর্ণিত পদ্ধতি অনুযায়ী প্রাসঙ্গিক mount_all কমান্ডের উপরে exec_start wait_for_keymaster ব্যবহার করলে, KeyMint আগে থেকেই পুরোপুরি চালু থাকে এবং এর ফলে এই ডেডলক এড়ানো যায়।
গ্রহণযোগ্য স্টোরেজে কনফিগারেশন
অ্যান্ড্রয়েড ৯ থেকে, যখনই FBE সক্রিয় করা হয়, অ্যাডপ্টেবল স্টোরেজে এক ধরনের মেটাডেটা এনক্রিপশন সর্বদা সক্রিয় থাকে, এমনকি যখন ইন্টারনাল স্টোরেজে মেটাডেটা এনক্রিপশন সক্রিয় করা থাকে না তখনও।
AOSP-তে, অ্যাডপ্টেবল স্টোরেজে মেটাডেটা এনক্রিপশনের দুটি ইমপ্লিমেন্টেশন রয়েছে: একটি হলো dm-crypt ভিত্তিক ডেপ্রিকেটেড ইমপ্লিমেন্টেশন, এবং অন্যটি dm-default-key ভিত্তিক নতুন ইমপ্লিমেন্টেশন। আপনার ডিভাইসের জন্য সঠিক ইমপ্লিমেন্টেশনটি নির্বাচিত হয়েছে কিনা তা নিশ্চিত করতে, device.mk ফাইলে PRODUCT_SHIPPING_API_LEVEL এর জন্য সঠিক ভ্যালু সেট করেছেন কিনা তা নিশ্চিত করুন। উদাহরণস্বরূপ, যদি আপনার ডিভাইসটি Android 11 (API লেভেল 30) দিয়ে লঞ্চ হয়, তাহলে device.mk ফাইলে নিম্নলিখিত কোডটি থাকা উচিত:
PRODUCT_SHIPPING_API_LEVEL := 30
শিপিং এপিআই লেভেল নির্বিশেষে নতুন ভলিউম মেটাডেটা এনক্রিপশন পদ্ধতি (এবং নতুন ডিফল্ট এফবিই পলিসি ভার্সন) ব্যবহার বাধ্যতামূলক করতে আপনি নিম্নলিখিত সিস্টেম প্রোপার্টিগুলোও সেট করতে পারেন:
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
বর্তমান পদ্ধতি
অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণ সহ চালু হওয়া ডিভাইসগুলিতে, অ্যাডপ্টেবল স্টোরেজে মেটাডেটা এনক্রিপশনের জন্য ইন্টারনাল স্টোরেজের মতোই dm-default-key কার্নেল মডিউল ব্যবহার করা হয়। কোন কার্নেল কনফিগারেশন অপশনগুলো সক্রিয় করতে হবে, তা জানতে উপরের পূর্বশর্তগুলো দেখুন। মনে রাখবেন যে, ডিভাইসের ইন্টারনাল স্টোরেজে কাজ করে এমন ইনলাইন এনক্রিপশন হার্ডওয়্যার অ্যাডপ্টেবল স্টোরেজে উপলব্ধ নাও থাকতে পারে, এবং সেক্ষেত্রে CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y প্রয়োজন হতে পারে।
ডিফল্টরূপে, dm-default-key ভলিউম মেটাডেটা এনক্রিপশন পদ্ধতিটি ৪০৯৬-বাইট ক্রিপ্টো সেক্টর সহ AES-256-XTS এনক্রিপশন অ্যালগরিদম ব্যবহার করে। ro.crypto.volume.metadata.encryption সিস্টেম প্রপার্টি সেট করার মাধ্যমে এই অ্যালগরিদমটি ওভাররাইড করা যেতে পারে। এই প্রপার্টির ভ্যালুর সিনট্যাক্স উপরে বর্ণিত metadata_encryption fstab অপশনের মতোই। উদাহরণস্বরূপ, যেসব ডিভাইসে AES অ্যাক্সিলারেশন নেই, সেখানে ro.crypto.volume.metadata.encryption=adiantum সেট করে Adiantum এনক্রিপশন সক্রিয় করা যেতে পারে।
ঐতিহ্য পদ্ধতি
অ্যান্ড্রয়েড ১০ এবং এর পূর্ববর্তী সংস্করণ সহ চালু হওয়া ডিভাইসগুলিতে, অ্যাডপ্টেবল স্টোরেজে মেটাডেটা এনক্রিপশনের জন্য dm-default-key পরিবর্তে dm-crypt কার্নেল মডিউল ব্যবহার করা হয়।
CONFIG_DM_CRYPT=y
dm-default-key পদ্ধতির বিপরীতে, dm-crypt পদ্ধতি ফাইলের বিষয়বস্তুকে দুইবার এনক্রিপ্ট করে: একবার FBE কী দিয়ে এবং আরেকবার মেটাডেটা এনক্রিপশন কী দিয়ে। এই দ্বৈত এনক্রিপশন পারফরম্যান্স কমিয়ে দেয় এবং মেটাডেটা এনক্রিপশনের নিরাপত্তা লক্ষ্য অর্জনের জন্য এটি প্রয়োজনীয় নয়, কারণ অ্যান্ড্রয়েড নিশ্চিত করে যে FBE কী-গুলো মেটাডেটা এনক্রিপশন কী-এর মতোই বা তার চেয়েও বেশি দুর্ভেদ্য। ভেন্ডররা এই দ্বৈত এনক্রিপশন এড়ানোর জন্য কার্নেলে কাস্টমাইজেশন করতে পারে, বিশেষ করে allow_encrypt_override অপশনটি প্রয়োগ করার মাধ্যমে, যা অ্যান্ড্রয়েড dm-crypt এ পাস করে যখন সিস্টেম প্রপার্টি ro.crypto.allow_encrypt_override true সেট করা হয়। এই কাস্টমাইজেশনগুলো অ্যান্ড্রয়েড কমন কার্নেল দ্বারা সমর্থিত নয়।
ডিফল্টরূপে, dm-crypt ভলিউম মেটাডেটা এনক্রিপশন পদ্ধতিতে ESSIV এবং 512-বাইট ক্রিপ্টো সেক্টর সহ AES-128-CBC এনক্রিপশন অ্যালগরিদম ব্যবহৃত হয়। নিম্নলিখিত সিস্টেম প্রোপার্টিগুলো সেট করার মাধ্যমে এটি ওভাররাইড করা যেতে পারে (যা FDE-এর জন্যও ব্যবহৃত হয়):
-
ro.crypto.fde_algorithmমেটাডেটা এনক্রিপশন অ্যালগরিদম নির্বাচন করে। বিকল্পগুলো হলোaes-128-cbcএবংadiantum। ডিভাইসটিতে AES অ্যাক্সিলারেশন না থাকলেই কেবল Adiantum ব্যবহার করা যাবে। -
ro.crypto.fde_sector_sizeক্রিপ্টো সেক্টর সাইজ নির্বাচন করে। বিকল্পগুলো হলো ৫১২, ১০২৪, ২০৪৮ এবং ৪০৯৬। অ্যাডিয়েন্টাম এনক্রিপশনের জন্য ৪০৯৬ ব্যবহার করুন।