黃 沾,楊景賀
(中國(guó)電子科技網(wǎng)絡(luò)信息安全有限公司,四川 成都 610041)
隨著計(jì)算機(jī)和網(wǎng)絡(luò)的飛速發(fā)展,海量的數(shù)據(jù)存儲(chǔ)在各種設(shè)備中。其中,塊設(shè)備是最主要的存儲(chǔ)設(shè)備,攜帶著大量涉密文檔。倘若系統(tǒng)存在漏洞被未授權(quán)使用或者塊設(shè)備被盜、丟失,都會(huì)引起政府、企業(yè)或個(gè)人的重大經(jīng)濟(jì)和精神損失。如何有效地保護(hù)涉密文檔的安全性,尤其在計(jì)算機(jī)丟失或失竊后,防止機(jī)密信息非法泄露,對(duì)目前普遍存在的存儲(chǔ)安全提出了新的挑戰(zhàn)。在通用消費(fèi)者領(lǐng)域,Android智能手機(jī)操作系統(tǒng)在其3.0版本中提供了存儲(chǔ)加密功能[1],而微軟的Windows也推出了BitLocker功能[2],可以對(duì)整個(gè)磁盤(pán)進(jìn)行加密。但式,這些解決方案需要大量的用戶響應(yīng)(如輸入密碼),無(wú)疑不適應(yīng)于工業(yè)環(huán)境中運(yùn)行的設(shè)備,因?yàn)檫@些設(shè)備要求7×24 h運(yùn)行,無(wú)人工干預(yù)。因此,本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)適用于工業(yè)環(huán)境的非交互式全盤(pán)加密系統(tǒng),下面將從設(shè)計(jì)目標(biāo)、方案和實(shí)現(xiàn)3個(gè)方面分別進(jìn)行描述。
本系統(tǒng)的設(shè)計(jì)目標(biāo)是一個(gè)盡量利用現(xiàn)有硬件設(shè)施,在不增加硬件成本的基礎(chǔ)上,使用軟件方來(lái)提高設(shè)備存儲(chǔ)私密性,同時(shí)對(duì)現(xiàn)有應(yīng)用做到無(wú)縫銜接。
(1)兼容性:設(shè)計(jì)方案必須保持對(duì)現(xiàn)有設(shè)備的兼容性,如ARM平臺(tái)、X86平臺(tái)和龍芯平臺(tái)等。
(2)密鑰隨機(jī):每臺(tái)設(shè)備的密鑰都可以隨機(jī)設(shè)置,避免一臺(tái)主機(jī)被破解后所有主機(jī)都告破,形成事實(shí)上的“后門(mén)”。
(3)硬件綁定:每個(gè)存儲(chǔ)的訪問(wèn)都與該存儲(chǔ)所在設(shè)備綁定,將存儲(chǔ)通過(guò)物理方法取出直接訪問(wèn),或者放置到其他任何設(shè)備無(wú)法直接訪問(wèn)存儲(chǔ)。
(4)易用性:方案應(yīng)盡量減少對(duì)現(xiàn)有應(yīng)用的干擾,即現(xiàn)有應(yīng)用可以不做任何更改。
(5)非交互式:由于設(shè)備運(yùn)行要求7×24 h無(wú)人值守運(yùn)行,必須要求系統(tǒng)必須是非交互式的,與現(xiàn)有的加密系統(tǒng)有根本區(qū)別。
將系統(tǒng)分為MBR鏡像、Bootloader(這里為GRUB2)、內(nèi)核與文件系統(tǒng)和其他分區(qū)等,位置如圖1所示。
圖1 存儲(chǔ)分區(qū)
MBR鏡像位于是磁盤(pán)第一個(gè)扇區(qū)(512 Bytes),包含了分區(qū)表與GRUB2的stage1加載代碼。GRUB2鏡像位于MBR與實(shí)際分區(qū)間的空隙,由于設(shè)備本身沒(méi)有加解密設(shè)施,所以GRUB2這里未被加密。而內(nèi)核與文件系統(tǒng)及后面的分區(qū)都已被加密處理(圖1中陰影部分)。GRUB2會(huì)在啟動(dòng)過(guò)程中自動(dòng)獲取密鑰并將內(nèi)核與文件系統(tǒng)解密,然后再啟動(dòng)解密后的內(nèi)核。
基于設(shè)計(jì)目標(biāo),需要將密鑰存放于設(shè)備的硬件中,以達(dá)到與設(shè)備綁定的目的,同時(shí)存儲(chǔ)的信息必須保留。同時(shí),為了安全性,密鑰至少需要保留16 Bytes以上,以防止暴力破解。基于以上考慮,選擇網(wǎng)卡ROM存放密鑰。
在設(shè)備未加密前,需要進(jìn)行系統(tǒng)初始化工作。在進(jìn)入系統(tǒng)后:
(1)隨機(jī)生成密鑰并將密鑰寫(xiě)入網(wǎng)卡ROM中;
(2)調(diào)用cryptsetup工具,將未加密分區(qū)轉(zhuǎn)換為加密分區(qū)。
在GRUB2中,需要應(yīng)對(duì)分區(qū)加密與未加密兩種情況。最重要的是獲取密鑰并解密,因?yàn)榫W(wǎng)卡一般采用PCI接口與設(shè)備相連,而GRUB2提供了完善的PCI訪問(wèn)接口,可以較容易地進(jìn)行PCI設(shè)備寄存器訪問(wèn)。
在設(shè)備運(yùn)行過(guò)渡到內(nèi)核并切換到文件系統(tǒng)后,為了讓其他應(yīng)用程序能訪問(wèn)存儲(chǔ)分區(qū),需要再次將存儲(chǔ)解密。這里比較簡(jiǎn)單,獲取ROM以及解密都有現(xiàn)成的工具可用。
為了實(shí)現(xiàn)上述系統(tǒng),需要整合多個(gè)現(xiàn)有技術(shù)。下面從關(guān)鍵技術(shù)及其用法出發(fā),闡述功能實(shí)現(xiàn)的方法。
3.1.1 GRUB2
GRUB2(GRand Unified Bootloader 2) 是 原GRUB的升級(jí)版本,支持多個(gè)體系平臺(tái)和多種部署方式,同時(shí)內(nèi)置了對(duì)多個(gè)加密方法的支持,包括LUKS、geli等。此外,GRUB2支持密碼鎖定等常見(jiàn)安全措施。
3.1.2 LUKS
LUKS(Linux Unified Key Setup)是 Linux硬盤(pán)加密標(biāo)準(zhǔn),通過(guò)提供標(biāo)準(zhǔn)的磁盤(pán)格式,不僅可以促進(jìn)發(fā)行版之間的兼容性,還可以提供對(duì)多個(gè)用戶密碼的安全管理。
對(duì)于本方案而言,使用LUKS有以下幾點(diǎn)考慮:
(1)實(shí)現(xiàn)相對(duì)容易,在GRUB2中已有基本的LUKS模塊,實(shí)現(xiàn)了基本的LUKS加密分區(qū)讀取,后續(xù)只要獲取密鑰傳遞給LUKS模塊即可。
(2)支持多個(gè)密碼:LUKS支持增加和刪除用戶密碼,后續(xù)在系統(tǒng)更新時(shí)可隨時(shí)更換密碼,提高了安全性。
(3)LUKS作為廣泛應(yīng)用的加密標(biāo)準(zhǔn),安全性得到了良好驗(yàn)證,同時(shí)其對(duì)應(yīng)的工具cryptsetup功能強(qiáng)大、穩(wěn)定可靠。
密鑰的存放與獲取是本方案的關(guān)鍵,這里以網(wǎng)卡ROM作為密鑰存放點(diǎn)為例。實(shí)際使用中還可以將ROM中的信息做多重變換,如使用pbkdf2算法增加破解難度。
密鑰的設(shè)置是在文件系統(tǒng)啟動(dòng)后進(jìn)行,而密鑰的讀取同時(shí)存在于GRUB2與文件系統(tǒng)啟動(dòng)后。
所以,設(shè)置一個(gè)可執(zhí)行文件diskkey作為文件系統(tǒng)啟動(dòng)后密鑰的寫(xiě)入與讀取,而在GRUB2流程中將作為補(bǔ)丁打入GRUB2的LUKS模塊,替換原有的提示用戶輸入密碼部分。
3.2.1 diskkey實(shí)現(xiàn)
diskkey實(shí)現(xiàn)密鑰的讀取與寫(xiě)入,實(shí)現(xiàn)必須保密,防止對(duì)外泄露。diskkey的實(shí)現(xiàn)與設(shè)備高度關(guān)聯(lián),而且應(yīng)該不定時(shí)變換。
示例:
ethtool -e eth0 raw on offset 0 length 32
ethtool讀取網(wǎng)卡ROM信息中前32位信息作為密鑰輸出。
3.2.2 GRUB2實(shí)現(xiàn)
以Intel網(wǎng)卡芯片82540為例,其開(kāi)發(fā)手冊(cè)記錄了如何使用EEPROM Read register(EERD)寄存器來(lái)訪問(wèn)網(wǎng)卡ROM。
示例:
regs是寄存器基地址,根據(jù)手冊(cè)EERD位于0x14h,即第5個(gè)雙字的位置。regs[0x5]=eerd將想要訪問(wèn)的ROM地址賦予EERD寄存器,后續(xù)檢測(cè)EERD的DONE bit是否置位,置位表示網(wǎng)卡已經(jīng)將ROM內(nèi)容寫(xiě)入EERD寄存器。需要注意,該函數(shù)每次能夠讀取兩字節(jié)(一個(gè)字)長(zhǎng)度的ROM,需要按照密鑰存儲(chǔ)約定多次調(diào)用。而regs變量的獲得,可以通過(guò)調(diào)用grub2 pci接口相關(guān)API獲取。
設(shè)備啟動(dòng)后會(huì)加載GRUB2,而GRUB2必須判斷存儲(chǔ)是否已經(jīng)加密。如果未加密,則走初始化流程;如果已經(jīng)加密,則必須調(diào)用解密命令,再加載解密后的內(nèi)核與文件系統(tǒng)。
一個(gè)GRUB2配置文件示例:
GRUB2一開(kāi)始加載biosdisk和part_msdos兩個(gè)模塊,以便后續(xù)訪問(wèn)設(shè)備上的存儲(chǔ)及其分區(qū),然后加載LUKS模塊。LUKS模塊已經(jīng)經(jīng)過(guò)修改,不會(huì)再提示用戶輸入密碼,能自動(dòng)加載磁盤(pán)密碼。
if linux (hd0,msdos1)/vmlinuz這行嘗試直接加載分區(qū)上的內(nèi)核,如果成功,說(shuō)明磁盤(pán)還沒(méi)有加密,繼續(xù)加載initramfs,然后啟動(dòng)。如果加載失敗,系統(tǒng)嘗試使用cryptomount解密分區(qū)。解密后的分區(qū)用crypto0表示,如果linux指令依然無(wú)法訪問(wèn)內(nèi)核,則表示解密過(guò)程失敗,設(shè)備可能存在異常情況,系統(tǒng)進(jìn)行關(guān)機(jī)處理。
系統(tǒng)啟動(dòng)后,需要將原加密分區(qū)進(jìn)行解密,這樣對(duì)其他應(yīng)用不會(huì)造成干擾。解密過(guò)程主要使用cryptsetup工具[3],示例如下(DEVICE變量為L(zhǎng)UKS所在分區(qū)設(shè)備名):
cryptsetup isLuks判斷分區(qū)是否經(jīng)過(guò)LUKS加密。diskkey讀取加密密鑰,cryptsetup luksOpen完成解密過(guò)程,最后調(diào)用mount掛載加密分區(qū),后續(xù)使用與普通分區(qū)相同。
系統(tǒng)啟動(dòng)后,必須確保系統(tǒng)訪問(wèn)是授權(quán)情況。如果解密方式公開(kāi),意味著加密失效。所以,在現(xiàn)有Linux安全防護(hù)措施基礎(chǔ)上,對(duì)整個(gè)啟動(dòng)流程進(jìn)行了全方面的系統(tǒng)安全加固。
3.5.1 鎖定GRUB2
GRUB2是系統(tǒng)啟動(dòng)的第一步,可以任意指定內(nèi)核、文件系統(tǒng)、內(nèi)核參數(shù)等。所以,為了系統(tǒng)的安全啟動(dòng),必須鎖定GRUB2。GRUB2提供了鎖定其運(yùn)行配置文件的方法,使GRUB2只能按照指定的流程運(yùn)行,包括固定的內(nèi)核、內(nèi)核參數(shù)等。
示例:
set superusers="root"設(shè)置超級(jí)用戶為root,后面password_pbkdf2設(shè)置root密碼(即XXXX部分),root密碼調(diào)用grub-mkpasswd-pbkdf2命令生成。menuentry表示后面的啟動(dòng)命令無(wú)需認(rèn)證即可執(zhí)行。
最后達(dá)到的效果是menuentry中的啟動(dòng)流程可以無(wú)干擾執(zhí)行,而要修改啟動(dòng)項(xiàng)如修改內(nèi)核參數(shù),需要輸入root用戶密碼進(jìn)行認(rèn)證。
3.5.2 禁用init與rdinit內(nèi)核參數(shù)
由于GRUB2是未加密的,雖然在上一步已做鎖定GRUB2,但是仍然要堤防GRUB2配置文件被修改。必須假定GRUB2傳給內(nèi)核的參數(shù)已經(jīng)被修改,而內(nèi)核默認(rèn)提供了init(rdinit)內(nèi)核參數(shù)來(lái)自定義內(nèi)核啟動(dòng)的init進(jìn)程執(zhí)行文件路徑。通過(guò)修改init參數(shù),如直接修改為/bin/sh,可以直接繞過(guò)登錄認(rèn)證訪問(wèn)文件系統(tǒng),就直接暴露了diskkey的實(shí)現(xiàn),導(dǎo)致加密系統(tǒng)告破。由于使用initramfs啟動(dòng),對(duì)應(yīng)的是rdinit參數(shù),只需要禁用rdinit參數(shù)即可。解決辦法比較簡(jiǎn)單,將內(nèi)核中rdinit參數(shù)處理函數(shù)注釋掉即可,對(duì)應(yīng)的代碼位于init/main.c中,不做贅述。
3.5.3 系統(tǒng)固件加密
系統(tǒng)揭秘方法也在系統(tǒng)的升級(jí)固件中可以獲取,所以系統(tǒng)固件必須加密。由于各個(gè)系統(tǒng)實(shí)現(xiàn)不同,這部分不做展開(kāi)。
本文提出的非交互式全盤(pán)加密系統(tǒng)解決了在現(xiàn)有硬件設(shè)備存儲(chǔ)安全的問(wèn)題,同時(shí)系統(tǒng)還有很多需要改進(jìn)的地方,包括對(duì)現(xiàn)有安全硬件技術(shù)的支持(如UEFI Secure Boot、TPM)等,將是下一步的研究?jī)?nèi)容。