Linux 系統是開放的,?其上安全機制、工具很多,不同的場景其安全目標和選擇的工具都不相同。以下從個人角度仿ATT&CK列出一些常見的安全機制和技術。
Linux?系統分層
邏輯上總體可以分為三層:硬件層、內核層、應用層。每層都有攻擊面和相應的安全技術。各層的安全技術相互配合形成體系化的防御。
紅色表示攻擊面,綠色表示安全機制
硬件
硬件是計算的基礎,也是安全的基石。硬件大致由主板、各種總線、CPU、內存、硬盤、外設組成。按照這幾個組件分析下攻擊面和安全技術。
主板??
主板是其他硬件組件物理上的base。物理安全不能忽視,歷史上發生過黑客直接替換存儲設備的案例,特定頻率的電磁波也能使某些硬件故障。??
主板上有CMOS,CMOS中代碼和配置是個攻擊面。其上的配置決定機器的功能和安全功能。如,是否啟用Secure Boot,SGX等安全配置。管理BIOS要設置管理密碼,開機使用要設置使用密碼。
BMC(Baseboard Management Controller),一般存在服務器上,監控機器、控制機器啟動、CMOS更新等,可以看作是單獨一個系統。要加強保護,如弱口令等。
硬盤
硬盤這個就挑硬盤的使用和自加密磁盤說說。
自加密磁盤(SED),一般是固態硬盤。存儲的內容是加密的,主控負責加密和解密,其作用防止數據物理泄漏。開機使用時,要輸入正確的密碼才能使用。
CPU
CPU安全分為兩個方面:1. CPU自身的安全,如 meltdown spectre等缺陷。2. CPU提供的安全特性。
僅在軟件層面上做安全有其不足,如保護功能有限、性能不足等?,F代CPU上也提供一些安全機制和功能。以12代intel CPU為例說明(ARM上也有類似的安全特性,按照發展來看,筆者比較看好ARM的CCA安全體系)。
TXT(可信執行技術) :是intel 實現可信計算平臺在CPU中提供的技術。可信計算是一套安全理論,涉及到CPU、TPM、主板、內核、開發庫、應用,還有一些intel未公開源碼的微碼。其使用也涉及到產品制造商、基礎架構和運維、開發等。發展很多年了,但基本沒有體系化使用,其中一些基礎功能也比較陳舊,不符合現在的安全發展。TPM大家接觸的較多。
說到TXT,可能會拿來與SGX比較。TXT是體系化的,平臺化的,面向公司的基礎架構,也有直接供運維和開發人員使用的TSS軟件棧和TPM工具。SGX嚴格來說是可信計算中的隔離執行功能,其使用只依賴CPU特性+內核支持+SDK,對于開發人員來說,相對比較容易使用(但是也不容易使用。在12代CPU中已經廢棄SGX功能)。
AES-NI:??CPU上的AES加解密指令,提高AES的性能。這個一般的加解密庫都使用了。
PCLMULQDQ:? 無進位乘法指令,提高加解密性能。
SHA Extensions:? sha1、sha256哈希算法的硬件加速指令。
Secure Key:?CPU上的隨機數產生指令。rdseed(產生隨機數種子)、rdrand。?在內核中沒有完全信任CPU的種子指令,只是作為熵源的一部分。
NX:??非執行位。標記某個頁是禁止執行的,如果違反了,產生異常。
Boot Guard Technology: 啟動保護技術,屬于安全啟動,其目的是保護啟動過程的完整性(信任鏈的傳遞),防止未經驗證的啟動代碼運行,例如BootKit。
SMEP & SMAP:阻止CPU在特權級別下執行用戶模式的代碼。RFLAGS寄存器中的AC標志清除時,阻止在特權級別下訪問用戶模式的內存。
UMIP:?一些指令只能在特權模式下執行。如SGDT、SIDT、SLDT、SMSW、STR。
MKTME: 多秘鑰全內存加密,與AMD的SME對應。這個筆者比較關注,內存安全進了一大步。
CET: 控制流加強技術。兩類: 1. 硬件影子棧,保護函數返回地址,如緩沖區溢出黑客利用。2. 新增ENDBRANCH(32位和64位)指令防御ROP/JOP/COP利用。gcc編譯時函數第一條指令是ENDBRANCH,運行時,CPU根據該指令保存/檢查相應的狀態,判斷是否惡意利用。
KeyLocker Technology:新增ENCODEKEY指令對key 進行wrap并返回一個handle,以后加解密使用這個handle即可。與使用TPM加解密原理相似。
Devil’s Gate Rock: BIOS保護技術。更新BIOS時,進行簽名、權限檢查等多項保護BIOS的技術集合。
MKTME、CET、Keylocker、Devil’s Gate Rock,這些技術只有在比較新的主板、CPU、內核中才能使用。
12代CPU廢棄的安全技術:MPX和SGX。
外設
每一種外設都是一個攻擊面。例如:WIFI、藍牙、USB類的設備。
WIFI:各種移動設備,車載,路由器,家居設備。這些設備如果驅動或者應用有漏洞、訪問接入控制策略不當,都能形成破壞和信息泄漏。如果拿個手機站在馬路上,可以看到車上各種WIFI熱點,如果有耐心走到車附近,很容易就能掃到行車記錄儀上二維碼中的密碼。
藍牙:這個危害同WIFI。例如藍牙鼠標、鍵盤。如果聯入系統的鼠標被偷走,盲點擊就可以形成破壞。
USB設備:這個是對不聯網系統破壞的重要通道。例如,U盤中的惡意文件。
這些外設,盡可能的減少,能物理割掉的割掉,不能割的封上,不能封的要禁止相應的驅動加載。使用的,要保持軟件更新,實施合適的接入控制策略。
各種總線
USB總線、火線、PCI等總線。
PCI總線可以傳輸、更改SED的口令,火線可以直接讀取物理內存,USB比較通用,較容易接入各種惡意物理設備。
安全物理設備
HSM、TPM都是用于安全目的芯片。TPM是可信計算中的組件,大多數計算機中都有,相對比較容易使用。openssl也有利用TPM的功能。
Ukey:? 使用系統時用外部設備進行認證。例如,CentOS登錄時,或者網銀登錄、玩游戲時都有相應的身份認證設備。
內核
內核大致由以下五部分組成:基礎組件(進程調度與管理、內存管理、進程間通信,一般裁減時都會保留)、文件系統和塊IO系統、網絡子系統、各種基礎庫、驅動和固件。還有安全子系統。重點說一說內核中的安全機制和技術。
自主訪問控制 & ACL
客體的擁有者決定其他用戶的權限。例如:ACL中配置的策略。Linux系統的 用戶/組/其他+ACL 組成基礎的訪問控制。ROOT作為管理身份,執行基礎訪問控制外的功能。
SETUID/SETGID/ NO_NEW_PRIV
這個是基礎訪問控制外的特例。如passwd、mount、各種沙箱程序,盡量減少這類程序就是了。說一說NO_NEW_PRIV,setuid/setgid和capabilites都是合法提權,在執行一些程序時,為了防止這些提權方法被濫用,可以使用prctl設置NO_NEW_PRIV。
capabilities
ROOT權限太大,要對ROOT進行分權。kernel v5.15中分成了41種具體的權限,如CAP_CHOWN、CAP_ADMIN、CAP_BPF等。在需要特權的可執行程序上設置特定的特權,在執行時就不需要ROOT賬戶了,如SOCKET_RAW,bpf操作。應用層開發庫libcap2比以前易用很多,但應用的不是很多。
MAC
強制訪問控制,相對自主訪問控制而言。簡單來說制定統一的規則,賦予主體與客體相應的標記,根據規則判斷動作是否允許。訪問控制模型有BRAC(基于角色的訪問控制,這個用的多)、BLP、BIBA。BLP主要關注機密性,其控制規則“上不可讀,下不可寫”。BIBA主要關注完整性,其控制規則“上不可寫,下不可讀”。
內核中的Selinux實現多級訪問控制,綜合了幾個訪問控制模型,是CentOS和Andriod上默認的強制訪問控制機制。
Apparmor:?是Ubuntu上基于路徑的MAC實現,其配置比Selinux容易理解。但Apparmor僅針對配置的程序進行訪問控制。
Smack:?簡單的訪問控制。Smack在Tizen OS(一種用在TV、Iot的操作系統)使用,其主要特點是實現了CIPSO協議。
Tomoyo:?日本人搞的強制訪問控制實現。Smack和Tomoyo相對較少使用。
LSM
Linux 安全模型是一套框架,實質是分布在內核代碼中多個地方的鉤子,本身沒有實現安全控制功能(現在的capabilites和IMA也在LSM框架中插入了hook)。在kernel V5.15中共有239個hook點。上面的Selinux、Apparmor就是實現不同hook點從而實現不同的訪問控制實現。
關于LSM是否可以同時使用多個訪問控制實現,歷史上有過反復,開始可以,后來不可以,現在又可以了。
YAMA:?用于控制ptrace、prctl使用的機制。例如是否允許調試、注入so庫,都可以通過設置yama實現,比較簡單實用。現在也是通過LSM實現的。
IMA:?完整性度量基礎設施,“計算”系統運行過程中文件、文件屬性、進程的完整性。對系統運行過程中所有進程(還有內核)計算出一個hash值存于TPM中的17號寄存器中,當向對方證明時使用。IMA很占用內存,基本沒有使用的。
LANDLOCK: 創建一個功能受限的環境,多用于沙箱。根據現在的代碼來看,實現的比較粗糙。但配合cgroup、namespace也許能實現功能不錯的沙箱。
lockdown:? Linux系統安全增強功能。在CentOS早期版本中叫runlevel,Ubuntu上早期是通過應用層腳本實現。例如,是否允許加載ko,是否允許訪問/dev/mem等等,這些原來允許使用但很危險的操作,可以通過lockdown限制。鎖住系統,提高系統安全級別,比原來更安全了。安全級別只能提高,不能降級,如果想降級,要重啟系統。一般用于IoT設備。
LoadPin:?確保進入內核地址空間的代碼來自同一個文件系統,該文件系統可以設置ro屬性。防止黑客引入ko攻擊系統。
內核自保護技術:?內核作為一個軟件,其本身也是攻擊目標。例如:
1. 減少攻擊面。以前導出的函數不再導出,以前老的系統調用被廢棄,增加seccomp機制過濾系統調用。一些關鍵信息不再向用戶空間導出,或者需要特權才能查看,如/proc/kallsym中符號的地址。內核空間數據復制到用戶空間時,先初始化為0;系統調用返回時,清除棧;釋放堆內存時,清除堆等等。
2. 執行代碼的內存不能同時具有執行和寫權限。
3. 一些數據設置為只讀屬性。
4. 內核模塊、固件、UEFI代碼驗證簽名。
5.?加強地址隨機化。棧緩沖區保護。運行時檢查計數器、整數是否溢出等。借鑒了pax項目的一些內存安全保護技術。
6. 使用安全編譯選項編譯內核。
Cgroup?&?namespace:?namespace是資源隔離技術,v5.15對8類資源進行隔離(pid、net、uts、user、cgroup、ipc、mnt、time)。Cgroup 是資源控制技術,例如cpu使用量,內存使用量等。它們是實現容器的基礎技術。其他資源控制技術如getrlimit、sched_setaffinity。
文件系統安全:?文件系統加密機制ecryptfs、dm-crypt、perfile加密。文件系統mount時只讀、文件使用量限制quota、文件屬性sticky位等。
SECRETMEM:?新版本內核中增加的隱私內存機制。在一個進程中申請的secret mem,在其他進程中不能使用ptrace訪問。
網絡安全方面:
1. Netfilter: 在這個基礎上可以設置防火墻規則。
2. Netlabel: 在ip數據包的選項中增加數據包標記,實現數據包的訪問控制
3. IPsec & wireguard進行安全通信。
4. KTLS:在TLS協議中,數據包加解密在內核進行,提高TLS的性能。
5. AF_PACKET & BPF 高效的抓包。XDP可實現抗D。
6. 負載均衡;重新實現TCP握手機制,增強抗SYN flood攻擊等
內核HOOK機制:ftrace & kprobe & livepatch & bpf 。利用它們可以實現自己的安全功能,觀測內核、進程事件。熱補丁修復內核漏洞。
內核審計機制:Audit、kmsg、acct、cn_proc、fanotify等。
以上大致是進入內核主線的安全技術,還有一些沒有進入主線如 grsec、tpe、lkrg、dpdk等等。一些發行版本,如Ubuntu也會有選擇的引入其中一些安全技術。
應用層
場景不同,選擇的工具也不同。下面就根據加固一個OS的基本原則說一下常用工具。
簡單(KISS原則)
設計簡單、使用簡單……
減少攻擊面
定制基線時,操作系統盡可能小,包含盡量少的軟件包。例如gcc、tcpdump、nc等不常用的軟件在生產系統上不要安裝。不用的內核ko禁止加載或者從生產系統上刪除。
一些可以裁減內核的系統,保持內核功能精簡。使用busybox代替coreutils包中的基礎工具,使用定制過的bash等等。
最小權限原則
最少的賬戶、賬戶最小的權限。/etc/passwd中不用的賬戶要刪除,是否允許登錄要控制等。使用sudo 控制賬戶執行的命令。如果允許網絡登錄,使用pam中的插件控制。sshd配置要盡可能嚴格,如禁止使用root登錄。
設置不同類型的賬戶,如管理賬戶、審計賬戶。每類賬戶其權限剛好夠用。
保持更新
軟件保持更新,可以修復軟件漏洞。策略更新,適用新的變化。如一些密碼要周期性更新。
事件審計
重要事件要記錄和監控。如登錄事件、服務重啟事件、配置更新事件。Linux上有各種日志記錄功能,一般都在/var/log下。很多安全工具都會讀取該目錄下的文件。
進行基礎的加固和監控
適當的分區及權限設置,適當的防火墻規則,適當的加解密措施,防止口令破解措施、2FA登錄認證等等。
看待Linux系統安全有不同的角度,以上根據系統分層列出Linux安全機制和技術,是靜態的。如果從事件活動角度,就可以把這些安全技術有機組合起來,形成防御功能。安全架構師,類似廚子,知道每項技術的優缺點,不迷信某個具體的技術,能根據具體場景,設計合適的安全架構,組合利用(或者開發)各種技術做出符合需求的佳肴。
審核編輯:湯梓紅
評論
查看更多