
જો તમે તમારી સિસ્ટમની અખંડિતતા વિશે ચિંતિત છો, dm-verity એ Linux ઇકોસિસ્ટમના મુખ્ય ભાગોમાંનું એક છે સુરક્ષિત રીતે બુટ કરવા અને સ્ટોરેજ ટેમ્પરિંગ શોધવા માટે. તે કર્નલના ડિવાઇસ મેપરના ભાગ રૂપે ઉદ્ભવ્યું હતું અને હવે તે Android, OpenWrt અને ઉન્નત સુરક્ષા શોધતા વિતરણોમાં ચકાસાયેલ બુટિંગ માટેનો આધાર છે.
એક અમૂર્ત ખ્યાલ હોવાથી દૂર, dm-verity ને veritysetup અને systemd-veritysetup જેવા વાસ્તવિક સાધનો સાથે ગોઠવવામાં આવે છે અને ઉપયોગમાં લેવાય છે.તે હેશ ટ્રીનો ઉપયોગ કરીને બ્લોક્સને તરત જ માન્ય કરે છે અને ઇવેન્ટ લોગ કરવાથી લઈને સિસ્ટમ રીબૂટ કરવા અથવા ક્રેશ કરવા સુધીની નીતિઓ સાથે ભ્રષ્ટાચાર પર પ્રતિક્રિયા આપી શકે છે. ચાલો નજીકથી નજર કરીએ, કોઈ છૂટા છેડા છોડ્યા વિના.
ડીએમ-વેરિટી શું છે અને તમે શા માટે કાળજી રાખી શકો છો
dm-verity એ કર્નલમાં એક ઉપકરણ-મેપર લક્ષ્ય છે જે ડેટા વાંચતી વખતે બ્લોક ડિવાઇસની અખંડિતતા ચકાસે છેતે દરેક બ્લોક (સામાન્ય રીતે 4K) ના હેશની ગણતરી અને ચકાસણી કરીને કામ કરે છે, જે પ્રી-કમ્પ્યુટેડ હેશ ટ્રી સામે હોય છે, સામાન્ય રીતે SHA-256 નો ઉપયોગ કરીને.
આ ડિઝાઇન પરવાનગી આપે છે રીબૂટ વચ્ચે અથવા એક્ઝેક્યુશન દરમિયાન ફાઇલોને શાંતિથી સુધારી શકાતી નથી.ઓપરેટિંગ સિસ્ટમ સુધી વિશ્વાસની બુટ ચેઇન વિસ્તારવા, માલવેરની ટકાઉપણું મર્યાદિત કરવા, સુરક્ષા નીતિઓને મજબૂત બનાવવા અને બુટ દરમિયાન એન્ક્રિપ્શન અને MAC મિકેનિઝમ્સને સુનિશ્ચિત કરવા માટે તે ચાવીરૂપ છે.
એન્ડ્રોઇડ (૪.૪ થી) અને સામાન્ય રીતે લિનક્સ પર, વિશ્વાસ વૃક્ષના મૂળમાં ટકેલો છે., જે સુરક્ષિત સ્થાન પર સ્થિત જાહેર કી સાથે સહી થયેલ અને માન્ય થયેલ છે (દા.ત., બુટ પાર્ટીશન પર અથવા સિક્યોર બુટ-સહી કરેલ UKI માં). કોઈપણ બ્લોકને તોડવા માટે અંતર્ગત ક્રિપ્ટોગ્રાફિક હેશ તોડવાની જરૂર પડશે.
ચકાસણી બ્લોક અને માંગ પર કરવામાં આવે છે: I/O ખર્ચની તુલનામાં વધારાની લેટન્સી ન્યૂનતમ છે.જો ચેક નિષ્ફળ જાય, તો કર્નલ I/O ભૂલ આપે છે અને ફાઇલ સિસ્ટમ દૂષિત દેખાય છે, જે ડેટા અવિશ્વસનીય હોય ત્યારે અપેક્ષિત છે. એપ્લિકેશનો તેમની ફોલ્ટ ટોલરન્સના આધારે ચાલુ રાખવું કે નહીં તે નક્કી કરી શકે છે.
ચકાસણી વૃક્ષ આંતરિક રીતે કેવી રીતે કાર્ય કરે છે
ચકાસણી વૃક્ષ સ્તરોમાં બનેલ છે. લેયર 0 એ ડિવાઇસમાંથી કાચો ડેટા છે, જે 4K બ્લોક્સમાં વિભાજિત છે.; દરેક બ્લોક માટે SHA-256 (સોલ્ટેડ) હેશની ગણતરી કરવામાં આવે છે. આ હેશને પછી લેયર 1 બનાવવા માટે જોડવામાં આવે છે. લેયર 1 ને પછી બ્લોક્સમાં જૂથબદ્ધ કરવામાં આવે છે અને લેયર 2 બનાવવા માટે ફરીથી હેશ કરવામાં આવે છે, અને આમ જ બધું એક જ બ્લોકમાં ફિટ થાય ત્યાં સુધી ચાલુ રહે છે: જ્યારે હેશ કરવામાં આવે છે, ત્યારે તે બ્લોક રૂટ હેશ ઉત્પન્ન કરે છે.
જો કોઈ સ્તર બ્લોકને બરાબર પૂર્ણ ન કરે, તે 4K સુધી પહોંચે ત્યાં સુધી તેને શૂન્યથી પેડ કરવામાં આવે છે. અસ્પષ્ટતા ટાળવા માટે. ટ્રીનું કુલ કદ તપાસવામાં આવતા પાર્ટીશનના કદ પર આધાર રાખે છે; વ્યવહારમાં, લાક્ષણિક સિસ્ટમ પાર્ટીશનો માટે તે સામાન્ય રીતે 30 MB કરતા ઓછું હોય છે.
સામાન્ય પ્રક્રિયા છે: રેન્ડમ સોલ્ટ પસંદ કરો, હેશ 4K સુધી, પ્રતિ-બ્લોક સોલ્ટ સાથે SHA-256 ની ગણતરી કરો, સ્તરો બનાવવા માટે જોડાય છે, બ્લોક સીમાને શૂન્યથી પેડ કરે છે, અને એક જ રૂટ હેશ બાકી ન રહે ત્યાં સુધી પાછલા સ્તર સાથે પુનરાવર્તન કરે છે. તે રૂટ હેશ, વપરાયેલ મીઠા સાથે, dm-verity ટેબલ અને સહીને ફીડ કરે છે.
ડિસ્ક ફોર્મેટ વર્ઝન અને અલ્ગોરિધમ
ડિસ્ક પર હેશ બ્લોક્સના ફોર્મેટમાં એક સંસ્કરણ છે. વર્ઝન 0 એ ક્રોમિયમ ઓએસમાં વપરાતું મૂળ વર્ઝન હતું.: હેશિંગ પ્રક્રિયાના અંતે મીઠું ઉમેરવામાં આવે છે, ડાયજેસ્ટ સતત સંગ્રહિત થાય છે, અને બાકીના બ્લોકને શૂન્યથી પેડ કરવામાં આવે છે.
La નવા ઉપકરણો માટે સંસ્કરણ 1 ની ભલામણ કરવામાં આવે છે.: સોલ્ટ હેશમાં પ્રીપેન્ડ કરવામાં આવે છે, અને દરેક ડાયજેસ્ટને બેના ઘાત સુધી શૂન્યથી પેડ કરવામાં આવે છે, જે સંરેખણ અને મજબૂતાઈમાં સુધારો કરે છે. dm-verity કોષ્ટક અલ્ગોરિધમનો પણ ઉલ્લેખ કરે છે (દા.ત., sha1 અથવા sha256), જોકે વર્તમાન સુરક્ષા માટે, sha256 નો ઉપયોગ થાય છે.
ડીએમ-વેરિટી ટેબલ અને આવશ્યક પરિમાણો
લક્ષ્ય કોષ્ટક dm-verity વર્ણવે છે ડેટા ક્યાં છે, હેશ ટ્રી ક્યાં છે, અને કેવી રીતે ચકાસવુંલાક્ષણિક કોષ્ટક ક્ષેત્રો:
- દેવ: ચકાસવાનો ડેટા ધરાવતું ઉપકરણ (પાથ પ્રકાર /dev/sdXN અથવા વધુ: ઓછું).
- હેશ_ડેવ: હેશ ટ્રી સાથેનું ઉપકરણ (સમાન હોઈ શકે છે; જો એમ હોય, તો હેશ_સ્ટાર્ટ ચેક કરેલ શ્રેણીની બહાર હોવું જોઈએ).
- ડેટા_બ્લોક_સાઇઝ: ડેટા બ્લોકનું કદ બાઇટ્સમાં (દા.ત. 4096).
- હેશ_બ્લોક_સાઇઝ: બાઇટ્સમાં હેશ બ્લોકનું કદ.
- ડેટા_બ્લોક્સ_નંબર: ચકાસી શકાય તેવા ડેટા બ્લોક્સની સંખ્યા.
- હેશ_સ્ટાર્ટ_બ્લોક: વૃક્ષના રુટ બ્લોકમાં (hash_block_size બ્લોકમાં) ઓફસેટ.
- અલ્ગોરિધમનો: હેશ અલ્ગોરિધમ (દા.ત. sha256).
- ડાયજેસ્ટ: રૂટ બ્લોક હેશનું હેક્સાડેસિમલ એન્કોડિંગ (ફોર્મેટ વર્ઝન અનુસાર સોલ્ટ સહિત); આ મૂલ્ય વિશ્વસનીય છે.
- મીઠું: હેક્સાડેસિમલ મીઠું.
વધુમાં, ત્યાં છે વૈકલ્પિક પરિમાણો વર્તનને સમાયોજિત કરવા માટે ખૂબ ઉપયોગી:
- ભ્રષ્ટાચારને અવગણો: દૂષિત બ્લોક્સ રેકોર્ડ કરે છે, પરંતુ વાંચન ચાલુ રાખવા દે છે.
- ભ્રષ્ટાચાર પર ફરી શરૂ કરો: ભ્રષ્ટાચાર શોધતી વખતે પુનઃપ્રારંભ કરો (ignore_corruption સાથે સુસંગત નથી અને લૂપ્સ ટાળવા માટે વપરાશકર્તા-જગ્યા સપોર્ટની જરૂર છે).
- ભ્રષ્ટાચાર પર_ગભરાટ: : ભ્રષ્ટાચાર શોધતી વખતે ગભરાટ પેદા કરે છે (અગાઉના સંસ્કરણો સાથે સુસંગત નથી).
- ભૂલ પર ફરી શરૂ કરો y ભૂલ પર_ગભરાટ: સમાન પ્રતિક્રિયાઓ પરંતુ I/O ભૂલો માટે.
- શૂન્ય_બ્લોક્સને અવગણો: શૂન્ય તરીકે અપેક્ષિત બ્લોક્સને તપાસતું નથી અને શૂન્ય પરત કરે છે.
- ઉપકરણમાંથી_fec_નો_ઉપયોગ કરો + ફેક_રુટ્સ + ફેક_બ્લોક્સ + ફેક_સ્ટાર્ટ: ચકાસણી નિષ્ફળ જાય ત્યારે ડેટા પુનઃપ્રાપ્ત કરવા માટે રીડ-સોલોમન (FEC) ને સક્ષમ કરો; ડેટા, હેશ અને FEC વિસ્તારો ઓવરલેપ ન થવા જોઈએ, અને બ્લોક કદ મેળ ખાતા હોવા જોઈએ.
- વધુમાં વધુ_એકવાર_તપાસો: ડેટાના દરેક બ્લોકને ફક્ત પહેલી વાર વાંચતી વખતે જ તપાસે છે (લાઇવ હુમલામાં સુરક્ષાના ખર્ચે ઓવરહેડ ઘટાડે છે).
- રૂટ_હેશ_સિગ_કી_ડેસ્ક: મેપિંગ બનાવતી વખતે રૂટ હેશના PKCS7 સહીને માન્ય કરવા માટે કીરીંગમાં કીનો સંદર્ભ (યોગ્ય કર્નલ રૂપરેખાંકન અને વિશ્વસનીય કીરીંગની જરૂર છે).
- ટાસ્કલેટમાં_ચકાસણી_કરવાનો_પ્રયાસ કરો: જો હેશ કેશ કરેલા હોય અને I/O કદ પરવાનગી આપે, તો લેટન્સી ઘટાડવા માટે નીચેનો ભાગ તપાસે છે; I/O વર્ગ દીઠ /sys/module/dm_verity/parameters/use_bh_bytes સાથે ગોઠવાયેલ છે.
સહી, મેટાડેટા અને ટ્રસ્ટ એન્કરિંગ
ડીએમ-વેરિટી વિશ્વસનીય બને તે માટે, રૂટ હેશ વિશ્વસનીય અને સામાન્ય રીતે સહી થયેલ હોવો જોઈએ.ક્લાસિક એન્ડ્રોઇડમાં, બુટ પાર્ટીશનમાં એક પબ્લિક કીનો સમાવેશ થાય છે, જે ઉત્પાદક દ્વારા બાહ્ય રીતે ચકાસવામાં આવે છે; તે રૂટ હેશ સિગ્નેચરને માન્ય કરે છે અને ખાતરી કરે છે કે સિસ્ટમ પાર્ટીશનમાં કોઈ ફેરફાર કરવામાં આવ્યો નથી.
વેરિટી મેટાડેટા માળખું અને સંસ્કરણ નિયંત્રણ ઉમેરે છે. મેટાડેટા બ્લોકમાં એક જાદુઈ નંબર 0xb001b001 શામેલ છે. (બાઇટ્સ b0 01 b0 01), સંસ્કરણ (હાલમાં 0), PKCS1.5 માં ટેબલ સિગ્નેચર (સામાન્ય રીતે RSA-2048 માટે 256 બાઇટ્સ), ટેબલ લંબાઈ, ટેબલ પોતે, અને 32K સુધી શૂન્ય પેડિંગ.
એન્ડ્રોઇડ અમલીકરણોમાં, ચકાસણી આના પર આધાર રાખે છે fs_mgr અને fstab: સંબંધિત એન્ટ્રીમાં ચેક માર્ક ઉમેરીને /boot/verity_key માં કી મૂકીને. જો મેજિક નંબર જ્યાં હોવો જોઈએ ત્યાં ન હોય, તો ખોટી વસ્તુ તપાસવાનું ટાળવા માટે ચકાસણી બંધ થઈ જાય છે.
ચકાસાયેલ કામગીરી શરૂ કરો
રક્ષણ કર્નલમાં રહે છે: જો કર્નલ બુટ થાય તે પહેલાં ચેડા કરવામાં આવે, તો હુમલાખોર નિયંત્રણ જાળવી રાખે છેએટલા માટે ઉત્પાદકો સામાન્ય રીતે દરેક તબક્કાને કડક રીતે માન્ય કરે છે: ઉપકરણમાં બાળવામાં આવેલી કી પ્રથમ બુટલોડરને ચકાસે છે, જે આગામી, એપ્લિકેશન બુટલોડરને અને અંતે, કર્નલને ચકાસે છે.
કર્નલ ચકાસાયેલ સાથે, ચકાસાયેલ બ્લોક ઉપકરણને માઉન્ટ કરતી વખતે dm-verity સક્ષમ હોય છેઆખા ડિવાઇસને હેશ કરવાને બદલે (જે ધીમું હશે અને ઉર્જાનો બગાડ કરશે), તેને ઍક્સેસ કરતી વખતે બ્લોક દ્વારા બ્લોક ચકાસવામાં આવે છે. નિષ્ફળતા I/O ભૂલનું કારણ બને છે, અને સેવાઓ અને એપ્લિકેશનો તેમની સહનશીલતા અનુસાર પ્રતિક્રિયા આપે છે: કાં તો તે ડેટા વિના ચાલુ રહે છે અથવા સંપૂર્ણપણે ક્રેશ થાય છે.
ફોરવર્ડ ભૂલ સુધારણા (FEC)
એન્ડ્રોઇડ 7.0 થી, FEC (રીડ-સોલોમન) ને ઇન્ટરલેસિંગ તકનીકો સાથે સમાવિષ્ટ કરવામાં આવ્યું છે જગ્યા ઘટાડવા અને ક્ષતિગ્રસ્ત બ્લોક્સને પુનઃપ્રાપ્ત કરવાની ક્ષમતા વધારવા માટે. આ dm-verity સાથે જોડાણમાં કાર્ય કરે છે: જો કોઈ તપાસ નિષ્ફળ જાય, તો સબસિસ્ટમ તેને પુનઃપ્રાપ્ત ન થઈ શકે તેવું જાહેર કરતા પહેલા તેને સુધારવાનો પ્રયાસ કરી શકે છે.
પ્રદર્શન અને ઓપ્ટિમાઇઝેશન
અસર ઘટાડવા માટે: ARMv7 પર NEON દ્વારા SHA-2 પ્રવેગક અને ARMv8 પર SHA-2 એક્સટેન્શન સક્ષમ કરો. કર્નલમાંથી. તમારા હાર્ડવેર માટે રીડ-અહેડ અને પ્રીફેચ_ક્લસ્ટર પરિમાણોને સમાયોજિત કરો; પ્રતિ-બ્લોક ચકાસણી સામાન્ય રીતે I/O ખર્ચમાં થોડો વધારો કરે છે, પરંતુ આ સેટિંગ્સ ફરક પાડે છે.
Linux (systemd, veritysetup) અને Android પર શરૂઆત કરવી
systemd વાળા આધુનિક Linux પર, dm-verity ચકાસાયેલ ફક્ત વાંચવા માટે રુટને મંજૂરી આપે છે veritysetup (cryptsetup નો ભાગ), systemd-veritysetup.generator, અને systemd-veritysetup@.service નો ઉપયોગ કરીને. સિક્યોર બૂટ અને સહી કરેલ UKI (યુનિફાઇડ કર્નલ ઇમેજ) નો સમાવેશ કરવાની ભલામણ કરવામાં આવે છે, જોકે તે સખત રીતે જરૂરી નથી.
તૈયારી અને ભલામણ કરેલ પાર્ટીશન
કાર્યાત્મક અને સમાયોજિત સિસ્ટમનો ભાગ. હેશ ટ્રી માટે વોલ્યુમ રિઝર્વ કરો (રૂટ કદના 8-10% સામાન્ય રીતે પૂરતા હોય છે) અને જો તમારે લખવાની જરૂર હોય તો /home અને /var ને અલગ કરવાનું વિચારો. એક લાક્ષણિક યોજનામાં શામેલ છે: ESP (બુટલોડર માટે), XBOOTLDR (UKI માટે), રુટ (એન્ક્રિપ્શન સાથે અથવા વગર), VERITY પાર્ટીશન, અને વૈકલ્પિક રીતે /home અને /var.
મૂળ તરીકે, EROFS એ ext4 અથવા squashfs નો ખૂબ જ રસપ્રદ વિકલ્પ છે.: તે ડિઝાઇન દ્વારા ફક્ત વાંચવા માટે છે, ફ્લેશ/SSD પર ખૂબ જ સારી કામગીરી સાથે, ડિફોલ્ટ રૂપે lz4 કમ્પ્રેશન, અને dm-verity સાથે Android ફોન પર વ્યાપકપણે ઉપયોગમાં લેવાય છે.
ફાઇલો જે લખી શકાય તેવી હોવી જોઈએ
રૂટ ro સાથે, કેટલાક પ્રોગ્રામ્સ લખવાની અપેક્ષા રાખે છે /વગેરે અથવા init દરમિયાનતમે તેને /var/etc માં ખસેડી શકો છો અને જે કંઈપણ બદલવાની જરૂર હોય તેને સિમલિંક કરી શકો છો (દા.ત., /etc/NetworkManager/system-connections માં NetworkManager કનેક્શન્સ). નોંધ કરો કે systemd-journald ને શરૂઆતના સ્ટાર્ટઅપ્સને તોડવાનું ટાળવા માટે રૂટ ડિરેક્ટરીમાં (સિમલિંક નહીં) /etc/machine-id અસ્તિત્વમાં હોવું જરૂરી છે.
અમલીકરણમાં કયા ફેરફારો થાય છે તે જાણવા માટે, ડ્રેકૂટ-ઓવરલેરૂટનો ઉપયોગ કરો: રુટ ઉપર tmpfs ઓવરલે કરે છે, અને લખેલી દરેક વસ્તુ /run/overlayroot/u માં દેખાય છે. /usr/lib/dracut/modules.d/ માં મોડ્યુલ ઉમેરો, dracut માં overlayroot શામેલ કરો, અને કર્નલ લાઇન પર overlayroot=1 સેટ કરો; આ રીતે તમે જોશો કે /var માં શું સ્થાનાંતરિત કરવું.
ઉપયોગી ઉદાહરણો: પેકમેન અને નેટવર્કમેનેજર
આર્કમાં, તે અનુકૂળ છે પેકમેન ડેટાબેઝને /usr/lib/pacman માં ખસેડો. જેથી rootfs હંમેશા ઇન્સ્ટોલ કરેલા પેકેજોને મિરર કરે. પછી, કેશને /var/lib/pacman પર રીડાયરેક્ટ કરો અને લિંક કરો. રુટને સ્પર્શ કર્યા વિના મિરરલિસ્ટ બદલવા માટે, તેને /var/etc પર ખસેડો અને તેને કોઈપણ રીતે લિંક કરો.
નેટવર્ક મેનેજર સાથે, સિસ્ટમ-કનેક્શન્સને /var/etc/NetworkManager માં ખસેડો અને /etc/NetworkManager/system-connections માંથી લિંક. આ રુટને અપરિવર્તનશીલ રાખે છે અને રૂપરેખાંકન ત્યાં જીવંત રાખે છે જ્યાં તે લખી શકાય તેવું હોવું જોઈએ.
સત્યતા અને પરીક્ષણનું નિર્માણ
લાઈવ અને બધું પરફેક્ટ અને ro માં માઉન્ટ થયેલ હોવાથી, ટ્રી બનાવો અને રૂટહેશ કરો વેરિટીસેટઅપ ફોર્મેટ: જ્યારે રન થાય છે, ત્યારે તે રૂટ હેશ લાઇન પ્રિન્ટ કરે છે, જેને તમે roothash.txt માં સેવ કરી શકો છો. તેને veritysetup ઓપન root-device root verity-device $(cat roothash.txt) અને માઉન્ટ /dev/mapper/root સાથે પરીક્ષણ માટે ચલાવો.
જો તમે ચાહો તો, પહેલા વૃક્ષને ફાઇલમાં જનરેટ કરે છે (verity.bin) અને પછી તેને VERITY પાર્ટીશનમાં લખો. પરિણામી સમૂહ છે: રૂટ ઈમેજ, વેરીટી ટ્રી, અને રૂટ હેશ જે તમે બુટ સમયે પિન કરશો.
કર્નલ લાઇન ગોઠવો
આ પરિમાણો ઉમેરો: સિસ્ટમડી.વેરિટી=1, roothash=contents_of_roothash.txt, systemd.verity_root_data=ROOT-PATH (દા.ત. LABEL=OS), અને systemd.verity_root_hash=VERITY-PATH (દા.ત. LABEL=VERITY). કડક નીતિઓ માટે systemd.verity_root_options ને રિસ્ટાર્ટ-ઓન-કરપ્શન અથવા પેનિક-ઓન-કરપ્શન પર સેટ કરો.
અન્ય ભલામણ કરેલ વિકલ્પો: ro (જો તમે EROFS/squashfs નો ઉપયોગ નથી કરતા), rd.emergency=રીબૂટ કરો y rd.શેલ=0 (જો બુટ નિષ્ફળ જાય તો અનધિકૃત શેલો અટકાવો), અને લોકડાઉન = ગુપ્તતા કર્નલ મેમરીને ઍક્સેસથી બચાવવા માટે.
વેરિટી સાથે વધારાના પાર્ટીશનો
ફક્ત મૂળ જ નહીં: તમે /etc/veritytab માં અન્ય મેપિંગ્સ વ્યાખ્યાયિત કરી શકો છો. અને systemd-veritysetup@.service તેમને બુટ સમયે એસેમ્બલ કરશે. યાદ રાખો: નોન-રુટ પાર્ટીશનને RW માઉન્ટ કરવું સરળ છે, અને રુટ યુઝર તે પાર્ટીશન પર Verity ને અક્ષમ કરી શકે છે, તેથી ત્યાં સુરક્ષા મૂલ્ય ઓછું છે.
સુરક્ષા: સિક્યોર બૂટ, યુકેઆઈ અને સહી કરેલ મોડ્યુલો
ડીએમ-વેરિટી કોઈ મોટી સફળતા નથી. UKI પર સહી કરો અને તમારી પોતાની ચાવીઓ વડે સિક્યોર બૂટ સક્ષમ કરો. કોઈપણને કર્નલ/initramfs/cmdline (જેમાં રૂટ હેશનો સમાવેશ થાય છે) ઓવરરાઇડ કરવાથી રોકવા માટે. sbupdate-git અથવા sbctl જેવા સાધનો છબીઓને સહી કરેલ રાખવામાં અને બુટ ચેઇનને અકબંધ રાખવામાં મદદ કરે છે.
જો તમે કર્નલ લોકડાઉન અથવા મોડ્યુલ સહી ચકાસણી સક્ષમ કરો છો, DKMS અથવા આઉટ-ઓફ-ટ્રી મોડ્યુલ્સ પર સહી કરવી આવશ્યક છે અથવા તે લોડ થશે નહીં. તમારી પાઇપલાઇન માટે સાઇનિંગ સપોર્ટ સાથે કસ્ટમ કર્નલનો વિચાર કરો (સાઇન કરેલ કર્નલ મોડ્યુલ્સ જુઓ).
એન્ક્રિપ્શન, TPM અને મીટરિંગ
dm-verity અખંડિતતાનું રક્ષણ કરે છે, ગુપ્તતા ન રાખવીજો રુટમાં કોઈ રહસ્યો ન હોય અને બુટ ચેઇન સુરક્ષિત હોય, તો તમે તેને એન્ક્રિપ્ટ કર્યા વિના રાખી શકો છો. જો તમે અન્ય વોલ્યુમોને અનલૉક કરવા માટે રુટમાંથી કીફાઇલ્સનો ઉપયોગ કરો છો, તો તેને એન્ક્રિપ્ટ કરવું એ એક સારો વિચાર છે.
TPM 2.0 સાથે, systemd-cryptenroll PCRs 0,1,5,7 સાથે કીને બંધનકર્તા બનાવવાની મંજૂરી આપે છે (ફર્મવેર, વિકલ્પો, GPT, સુરક્ષિત બુટ સ્થિતિ). rd.luks.options=LUKS_UUID=tpm2-device=auto ઉમેરો અને initramfs માં TPM2 સપોર્ટ શામેલ કરવાની ખાતરી કરો. systemd-boot PCR4 માં kernel.efi ને માપે છે, જો UKI અથવા તેની cmdline બદલાય તો કીને અમાન્ય કરવા માટે ઉપયોગી છે.
અપડેટ્સ અને ડિપ્લોયમેન્ટ મોડેલ્સ
ચકાસાયેલ ફક્ત વાંચવા માટેનું રુટ તે પરંપરાગત રીતે પેકેજ મેનેજર સાથે અપડેટ થયેલ નથી.. આદર્શ એ છે કે નવી છબીઓ બનાવવી જેમ કે યોક્ટો પ્રોજેક્ટ અને તેમને પ્રકાશિત કરો. systemd માં મજબૂત છબી ડાઉનલોડ અને ફ્લેશિંગ માટે systemd-sysupdate અને systemd-repart છે.
બીજી વ્યૂહરચના છે એ/બી સ્કીમ: તમે બે રૂટ અને બે વેરિટી રાખો છો. સક્રિય રૂટને નિષ્ક્રિય રૂટમાં કોપી કરો, ફેરફારો લાગુ કરો અને વેરિટી ફરીથી કરો. આગલા બુટ પર પાછા સ્વિચ કરો. જો તમે UKI નો ઉપયોગ કરી રહ્યા છો, તો cmd લાઇનમાં રૂટ હેશ અપડેટ કરવાનું અથવા સહી કરેલ UKI ફરીથી બનાવવાનું યાદ રાખો.
વૈકલ્પિક દ્રઢતા માટે, ચકાસાયેલ રૂટ પર ઓવરલેએફએસનો ઉપયોગ કરો tmpfs અથવા ડિસ્કમાં ઉપરના ભાગ સાથે. તમે કામચલાઉ ટકાઉપણું માટે systemd.volatile=overlay પણ પાસ કરી શકો છો. Flatpak /var અને /home માં / ને સ્પર્શ કર્યા વિના એપ્લિકેશનો ઇન્સ્ટોલ કરવાનું સરળ બનાવે છે.
ઓટોમેટેડ પેકેજો છે (દા.ત. AUR માં verity-squash-root) જે squashfs રુટ બનાવે છે અને રૂટહેશને કર્નલ અને ઇનિટ્રામ્ફ્સ સાથે સહી કરો, જે તમને પર્સિસ્ટન્ટ અથવા એફેમેરલ મોડ અને બેકઅપ તરીકે નવીનતમ રૂટએફએસ સાચવવા વચ્ચે પસંદગી કરવાની મંજૂરી આપે છે. નોંધ: ચકાસાયેલ રૂટમાં પર્સિસ્ટન્ટ ઉમેરવાથી ઉપયોગના કિસ્સાઓ ઓછા છે; અલગ પાર્ટીશનો પર પર્સિસ્ટન્ટ એપ્લિકેશન ડેટાનો પ્રયાસ કરો.
એન્ડ્રોઇડ: સિસ્ટમ-એઝ-રુટ, AVB અને વેન્ડર ઓવરલે
એન્ડ્રોઇડ 10 થી, રૂટએફએસ રેમ ડિસ્ક પર ચાલવાનું બંધ કરે છે અને system.img સાથે સંકલિત થાય છે. (system-as-root). Android 10 સાથે લોન્ચ થતા ઉપકરણો હંમેશા આ સ્કીમનો ઉપયોગ કરે છે અને dm-લિનિયર માટે ramdisk ની જરૂર પડે છે. ramdisk નો ઉપયોગ કરવા અને system.img ને સીધા સક્રિય કરવા વચ્ચે તફાવત કરવા માટે આ બિલ્ડમાં BOARD_BUILD_SYSTEM_ROOT_IMAGE ને false પર સેટ કરવામાં આવ્યું છે.
એન્ડ્રોઇડ 10 માં શામેલ છે ગતિશીલ પાર્ટીશનો અને પ્રથમ તબક્કાની શરૂઆત જે લોજિકલ સિસ્ટમ પાર્ટીશનને સક્રિય કરે છે; કર્નલ હવે તેને સીધું માઉન્ટ કરતું નથી. સિસ્ટમ-ઓન્લી OTA ને સિસ્ટમ-એઝ-રુટ ડિઝાઇનની જરૂર પડે છે, જે Android 10 ઉપકરણો પર ફરજિયાત છે.
કોઈ A/B માં, પુનઃપ્રાપ્તિને બુટથી અલગ રાખોA/B થી વિપરીત, કોઈ boot_a/boot_b બેકઅપ નથી, તેથી જો બૂટ અપડેટ નિષ્ફળ જાય તો નોન-A/B માં રિકવરી દૂર કરવાથી તમને રિકવરી મોડ વિના છોડી શકાય છે.
કર્નલ બે માર્ગો દ્વારા system.img ને /converity માં માઉન્ટ કરે છે: vboot 1.0 દ્વારા વધુ (/system માં એન્ડ્રોઇડ મેટાડેટાનું વિશ્લેષણ કરવા અને dm-verity પરિમાણો મેળવવા માટે કર્નલ માટેના પેચો; cmdline માં root=/dev/dm-0, skip_initramfs અને init=/init dm=… સાથે શામેલ છે) અથવા vboot 2.0/AVB, જ્યાં બુટલોડર libavb ને એકીકૃત કરે છે, હેશટ્રી ડિસ્ક્રીપ્ટર (vbmeta અથવા સિસ્ટમમાં) વાંચે છે, પરિમાણો બનાવે છે અને તેમને cmdline માં કર્નલમાં પાસ કરે છે, FEC સપોર્ટ અને restart_on_corruption જેવા ફ્લેગ્સ સાથે.
સિસ્ટમ-એઝ-રુટ સાથે, BOARD_ROOT_EXTRA_FOLDERS નો ઉપયોગ કરશો નહીં ઉપકરણ-વિશિષ્ટ રુટ ફોલ્ડર્સ માટે: GSI ફ્લેશ કરતી વખતે આ અદૃશ્ય થઈ જશે. /mnt/vendor/ હેઠળ ચોક્કસ માઉન્ટ્સ વ્યાખ્યાયિત કરો. , જે fs_mgr આપમેળે બનાવે છે, અને તેમને ઉપકરણ વૃક્ષના fstab માં સંદર્ભિત કરે છે.
એન્ડ્રોઇડ પરવાનગી આપે છે a /product/vendor_overlay/ માંથી વિક્રેતા ઓવરલે: init એ /vendor માં SELinux સંદર્ભ આવશ્યકતાઓ અને /vendor/ ના અસ્તિત્વને પૂર્ણ કરતી સબડિરેક્ટરીઝને માઉન્ટ કરશે. . જૂના કર્નલ પર, CONFIG_OVERLAY_FS=yy ની જરૂર છે, override_creds=off પેચ.
લાક્ષણિક અમલીકરણ: ઉપકરણમાં પૂર્વ-સંકલિત ફાઇલો ઇન્સ્ટોલ કરે છે/ / /વિક્રેતા_ઓવરલે/, તેમને $(TARGET_COPY_OUT_PRODUCT)/vendor_overlay માં find-copy-subdir-files સાથે PRODUCT_COPY_FILES માં ઉમેરો, વગેરે અને એપ્લિકેશન (દા.ત. vendor_configs_file અને vendor_app_file) માટે file_contexts માં સંદર્ભો વ્યાખ્યાયિત કરો અને init.te માં તે સંદર્ભો પર mounton ને મંજૂરી આપો. userdebug માં atest vfs_mgr_vendor_overlay_test સાથે પરીક્ષણ કરો.
મુશ્કેલીનિવારણ: Android પર dm-verity ભ્રષ્ટાચાર સંદેશ
A/B સ્લોટ ધરાવતા ઉપકરણો પર, સ્લોટ બદલો અથવા રૂટહેશ સાથે સુસંગતતા વિના vbmeta/boot ફ્લેશિંગ આ ચેતવણી ટ્રિગર કરી શકે છે: dm-verity ભ્રષ્ટાચાર, તમારું ઉપકરણ અવિશ્વસનીય છે. ફાસ્ટબૂટ ફ્લેશ –disable-verity –disable-verification vbmeta vbmeta.img જેવા આદેશો ચકાસણીને અક્ષમ કરે છે, પરંતુ સિસ્ટમને અખંડિતતાની કોઈપણ ગેરંટી વિના છોડી દે છે.
કેટલાક બુટલોડર સપોર્ટ કરે છે ફાસ્ટબૂટ OEM disable_dm_verity અને તેનાથી વિપરીત, enable_dm_verity. તે કેટલાક મોડેલો પર કામ કરે છે, પરંતુ અન્ય પર નહીં; અને તેને સમાયોજિત ફ્લેગ્સ સાથે કર્નલ/મેજિસ્કની જરૂર પડી શકે છે. તમારા પોતાના જોખમે ઉપયોગ કરો: કાર્યવાહીનો સમજદાર માર્ગ છે બુટ, vbmeta અને સિસ્ટમને સંરેખિત કરો, ટ્રી પર સહી કરો અથવા ફરીથી બનાવો અને ખાતરી કરો કે અપેક્ષિત રૂટ હેશ રૂપરેખાંકિત સાથે મેળ ખાય છે.
જો ચેતવણી પછી તમે પાવર દબાવવાનું ચાલુ રાખી શકો છો, તો સિસ્ટમ શરૂ થાય છે, પરંતુ તમારી પાસે હવે વિશ્વાસની અકબંધ સાંકળ નથી.સુરક્ષાનો ભોગ આપ્યા વિના સંદેશ દૂર કરવા માટે, મૂળ સહી કરેલી છબીઓને પુનઃસ્થાપિત કરો અથવા વેરીટીને અક્ષમ કરવાને બદલે, યોગ્ય હેશટ્રી સાથે vbmeta ને ફરીથી બનાવો/ચકાસો કરો.
i.MX અને OpenWrt પ્લેટફોર્મ
i.MX6 પર (દા.ત. sabresd), DM_VERITY અને FEC સપોર્ટ સાથે કર્નલને ગોઠવો, veritysetup સાથે ટ્રી જનરેટ કરો, રૂટ હેશને સુરક્ષિત રીતે સ્ટોર કરો, અને cmd લાઇનમાં યોગ્ય પરિમાણો પાસ કરો અથવા systemd-veritysetup સાથે initramfs દ્વારા સંકલિત કરો. જો તમે dm-crypt નો ઉપયોગ કરતા નથી, તો તમારે verity માટે CAAM ની જરૂર નથી; ધ્યાન અખંડિતતા પર છે.
ઓપનવર્ટીમાં અને ઓપનએમ્બેડેડ સાથે એમ્બેડેડ લિનક્સ સિસ્ટમ્સ, dm-verity અને SELinux ને એકીકૃત કરવાના પ્રયાસો ચાલી રહ્યા છે. (બુટલિન જોબ્સને સપોર્ટનો સમાવેશ કરવાના હેતુથી સુધારેલ છે). તે એક કુદરતી ફિટ છે: રાઉટર્સ અને નેટવર્ક સાધનો એક અપરિવર્તનશીલ, ચકાસાયેલ અને MAC-કઠણ રુટથી લાભ મેળવે છે.
મેન્યુઅલ ટ્રી અને મેટાડેટા બાંધકામ (વિગતવાર દૃશ્ય)
ક્રિપ્ટસેટઅપ તમારા માટે ટ્રી જનરેટ કરી શકે છે, પરંતુ જો તમે ફોર્મેટ સમજવા માંગતા હો, તો કોમ્પેક્ટ ટેબલ લાઇન વ્યાખ્યામાં શામેલ છે: મેપિંગ નામ, ડેટા ડિવાઇસ, ડેટા બ્લોક અને હેશ કદ, બ્લોકમાં છબીનું કદ, હેશ_સ્ટાર્ટ પોઝિશન (બ્લોક ઇમેજ + 8 જો કોંકેટેનેટેડ હોય તો), રુટ હેશ, અને સોલ્ટ. કોંકેટેનેટેડ લેયર્સ જનરેટ કર્યા પછી (ઉપરથી નીચે સુધી, લેયર 0 સિવાય), તમે ટ્રીને ડિસ્ક પર લખો છો.
બધું પેક કરવા માટે, dm-verity કોષ્ટક કંપોઝ કરો, તેને સહી કરો (સામાન્ય RSA-2048) અને મેટાડેટામાં સહી+કોષ્ટકનું જૂથ બનાવો. વર્ઝન હેડર અને મેજિક નંબર સાથે. પછી, તે સિસ્ટમ ઇમેજ, વેરિટી મેટાડેટા અને હેશ ટ્રીને જોડે છે. fstab માં, તે fs_mgr ને verify તરીકે ચિહ્નિત કરે છે અને સહીને માન્ય કરવા માટે /boot/verity_key માં પબ્લિક કી મૂકે છે.
આનાથી ઑપ્ટિમાઇઝ કરો તમારા CPU માટે SHA-2 સ્પીડઅપ્સ અને રીડ-અહેડ/પ્રીફેચ_ક્લસ્ટરને સમાયોજિત કરો. ARM હાર્ડવેર પર, NEON SHA-2 (ARMv7) અને SHA-2 એક્સટેન્શન (ARMv8) વેરિફિકેશન ઓવરહેડને નોંધપાત્ર રીતે ઘટાડે છે.
કોઈપણ જમાવટમાં, યાદ રાખો કે રુટ હેશ મૂલ્ય સુરક્ષિત હોવું આવશ્યક છે: ભલે તે સહી કરેલ UKI માં કમ્પાઇલ થયેલ હોય, સહી કરેલ બુટ પાર્ટીશનમાં હોય, અથવા AVB નો ઉપયોગ કરીને બુટલોડર દ્વારા માન્ય કરેલ હોય. તે બિંદુ પછીની દરેક વસ્તુ તે વિશ્વાસને વારસામાં મેળવે છે.
ઉપરોક્ત બધા સ્થાને હોવાથી, dm-verity બને છે અપરિવર્તનશીલ, મોબાઇલ અને એમ્બેડેડ સિસ્ટમ્સ માટે એક મજબૂત પાયો, ટ્રાન્ઝેક્શનલ અપડેટ્સ, રૂપરેખાંકન ઓવરલે અને આધુનિક સુરક્ષા મોડેલને સપોર્ટ કરે છે જે હુમલાની સપાટી ઘટાડે છે અને કામગીરીને બલિદાન આપ્યા વિના દ્રઢતાને અટકાવે છે.


