您的觀點都很好,您是正確的,但是在對此感到憤怒之前,我們需要提醒自己linux安全模型是如何工作的以及它旨在保護什麼。
請記住,Linux安全模型在設計時考慮了多用戶終端或SSH服務器。 Windows在設計時考慮了最終用戶工作站(但我聽說最近的Windows對終端更友好)。特別是,Linux約定在將應用程序沙箱化到用戶方面做得更好,而在Windows中,任何重要的東西都作為系統運行,而Linux GUI(X Server)吸納了安全性,Windows GUI具有內置的UAC之類的功能。基本上,Linux首先是(並且一直以來都是)服務器,其次是工作站,而Windows則恰恰相反。
安全模型
就OS(即內核)而言,您有7個tty控制台和任意數量的SSH連接(也稱為“登錄會話”)-碰巧ubuntu附帶了腳本,可以在 tty7上自動啟動GUI
會話,但對於內核來說,它只是另一個應用程序。
登錄會話和用戶帳戶之間的沙盒關係非常好,但是Linux採取了一種安全的心態,您不需要保護用戶自己。在這種安全模型中,如果您的帳戶受到惡意軟件的破壞,這是一個丟失的原因,但是我們仍然希望將其與其他帳戶隔離開來,以保護整個系統。
例如,Linux應用程序傾向於創建一個低權限用戶,例如 apache
或 ftp
,這些用戶在不需要做有惡意的事情時就可以運行。如果攻擊者設法控制了正在運行的 apache
進程,則可以破壞其他 apache
進程,但在跳轉到 ftp
進程時會遇到麻煩
請注意,Windows在這裡採用了根本不同的方法,主要是通過約定,所有重要事物始終作為系統運行。與作為系統運行的惡意進程相比,Linux中的惡意服務具有更小的範圍來做壞事,因此Windows 需要付出更多的努力來保護具有管理員權限的人免受“他們自己”的侵害。 p>
GUI環境和非針對安全性的X Server都使這種安全模型陷入困境。在Windows中,當用戶進程請求特權升級時,內核會拋出一個特殊的受保護提示,其內存和鍵盤/鼠標總線與其餘桌面環境隔離。之所以可以這樣做,是因為GUI內置在OS中。在Linux中,GUI(X服務器)只是另一個應用程序,因此密碼提示屬於調用它們的進程,該進程以您的身份運行,與其他所有窗口和進程一樣以您的身份運行共享內存權限和輸入總線。
root提示符無法執行Iike鎖定鍵盤的操作,因為這些要么已經是root,要么需要完全重新設計X服務器(請參閱下面的Wayland)。 catch 22在這種情況下是將GUI與內核分開的缺點。但是,至少這與Linux安全模型保持一致。 ,我們可能不得不重寫很多東西。至少,內核需要具備GUI意識,以便能夠創建提示(今天還不是這樣)。另一個首選示例是GUI會話中的所有進程共享一個鍵盤總線。
看著我寫一個鍵盤記錄器,然後在另一個窗口中按一些鍵 :
➜〜xinput列表
⎡虛擬核心指針id = 2 [主指針(3)]⎜↳虛擬核心XTEST指針id = 4 [從屬指針(2)]⎜Logitech K400 Plus id = 9 [從屬指針(2)]⎜ETPS / 2 Elantech觸摸板id = 13 [從屬指針(2)]➜〜xinput測試9鍵釋放36鍵按下44 h鍵釋放44鍵按下40 e鍵釋放40鍵按下33 l鍵釋放33鍵按下33 l鍵按下39 okey釋放33鍵釋放39鍵按66鍵按31
任何正在運行的進程,都可以在另一個進程的提示符或終端中嗅探密碼,然後自己調用sudo(這直接是因為“無需保護您免受您的思維定勢),因此除非我們從根本上更改安全模型並大規模重寫各種事情,否則提高密碼提示的安全性是沒有用的。
(值得注意的是, Gnome似乎至少可以在鎖定屏幕和新會話上沙箱化鍵盤總線通過“切換用戶”輸入,因為在那裡鍵入的內容不會顯示在我的會話的鍵盤總線中)
Wayland
Wayland是旨在更換X11。它將鎖定客戶端應用程序,以使它們無法竊取信息或影響其窗口外的任何內容。客戶端可以在外部IPC外部彼此通信的唯一方法是通過控制所有客戶端的合成器。但是,這不能解決根本問題,而只是將對信任的需求轉移到了合成器上。
虛擬化和容器
如果您使用雲技術,則可以可能會上下跳動地說“ Docker是答案!”。的確,布朗尼為您指出。儘管Docker本身並不是真的要增強安全性(感謝@SvenSlootweg),但它的確指向使用容器化和/或虛擬化作為與當前Linux體系結構兼容的轉發。
兩個值得注意的Linux發行版都考慮到了進程間隔離:
Qubes OS ,該操作系統在多個虛擬機中運行用戶級應用程序,這些虛擬機被劃分為“安全域”,例如
Android ,它以單獨的低特權用戶身份安裝和運行每個應用程序,從而獲得了進程級隔離和文件系統隔離(每個
底線:從最終用戶的角度來看,期望Linux表現出正常的行為是合理的。與Windows相同,但這是其中一種情況,您需要稍微了解一下基礎系統的工作方式以及為什麼採用這種方式進行設計。只要更改密碼提示的實現由您擁有的進程擁有,就不會完成任何事情。在單用戶GUI工作站的環境中,要使Linux獲得與Windows相同的安全行為,就需要對操作系統進行重大的重新設計,因此不太可能發生,但是像Docker這樣的事情可能會在更多的Linux系統中提供前進的方向,
在這種情況下,重要的區別是Linux在較低的級別上被設計為多用戶服務器,並且他們決定不保護用戶免受自身的攻擊,而Windows被設計為單用戶工作站,因此您確實需要在登錄會話中具有進程間保護。同樣重要的是,在Windows中,GUI是操作系統的一部分,而在Linux中,GUI只是另一個用戶級應用程序。