Linux 有所謂「天生安全基因」嗎,整體安全性設計是否更優秀?

Linux 要是用戶激增,還會一如既往的安全嗎?


雖然這個說法跳過了是不是,不過我還是樂於回答一下這個問題,因為確實真的有人這麼說過。

為了回答這個問題,首先得知道什麼是「安全」。

那麼我們如何理解軟體的安全?表面上說,安全似乎是指的只發生預期的結果,而這個定義與軟體質量基本重合,也就是說,看起來高質量的,經過測試的軟體就是安全的。

其實這個定義不對。因為這個意義上的安全,默認了軟體只與用戶交互。

但現實中,與軟體交互的不但可以是用戶,還可以是另外一個軟體。用戶不但可以親自與操作系統交互,還需要下載其他軟體與操作系統交互。

實際上,對多數普(xiao)通(bai)用戶來說,系統安全的危害從來都不是來自系統的漏洞被攻破,而是來自其系統被安裝了惡意軟體。

這個時候就引發了一個新的問題:當我下載安裝一個軟體的時候,如何判定這個軟體沒有惡意行為?

安裝一個惡意的軟體,很輕鬆的就可以嚴重危害系統的安全。即便這個軟體經過了最充分的測試,也只能保證這個軟體的惡意被充分的表達,而不能保證它是安全的,所以 @Ivony 在這個問題上的觀點我不贊同,因為軟體是否經過充分測試,跟軟體是否安全沒有必然關係。一個最危險的惡意軟體,例如木馬或者後門軟體,又或者能夠掃描用戶硬碟,上傳用戶隱私的軟體,完全可能經過了非常充分的測試。但它仍然可能被用戶有意無意的安裝到操作系統中。

事實上,Linux 的所謂天生的安全基因的原因,與 AppStore 非常類似。它的安全基因在於:主流的發行版,例如 debian/ubuntu/openSUSE/fedora 等等,都會提供一個軟體倉庫,這個軟體倉庫實際上起了類似 AppStore 的作用。根據 Linux 的基因,軟體倉庫通常只收錄開源軟體,除了極少數的特殊用途的閉源軟體以外(例如某些顯卡驅動),這個我們先按下不表。

軟體倉庫里收錄的軟體基本上都是開源的並且經過 code review 的,雖然我們不能通過 code review 保證這些軟體運行沒有 bug,但至少可以保證這些軟體沒有明顯的主觀的惡意行為,例如上傳用戶隱私等等。。

開源不是為了檢查 bug,只是一種承諾;你敢開源,說明你承諾你的軟體不會有主觀上的惡意行為,畢竟將主觀惡意的代碼進行開源會聲名掃地。

如果一個用戶只安裝軟體倉庫中的軟體,不安裝任何第三方軟體,那麼 Linux 是安全的,這種安全,跟說不越獄的 iOS 安全的原理差不多。

從這個層面上來看,Linux 安全的前提是你只安裝軟體倉庫中的軟體,不自行安裝任何第三方軟體。Linux 不同發行版的 libc 不同,這造成了不同發行版很可能無法完整的實現二進位兼容,必須重新編譯。要想保證最大程度的兼容所有 Linux 發行版,軟體需要開源發布。這個基因更鼓勵你只安裝軟體倉庫里的軟體以及開源軟體。——同時,閉源的惡意軟體研發成本很高,要兼容所有 Linux 發行版代價很大。

Linux 對普通用戶是安全的嗎?不完全是,如果你安裝不明來歷的第三方閉源軟體,沒有人能夠保證其沒有惡意。如果你堅持安裝非軟體倉庫來源的軟體,那麼沒有人能夠保證你系統的安全。

為什麼 Linux 比 Windows 「相對安全」?其實,無非是因為 Windows (目前)沒有一個可信的軟體商店而已,當大家養成了到處到任意網站下載軟體隨意安裝的習慣時,任何系統都是危險的

實際上,即便 Windows 有軟體商店,開源軟體依然可能比閉源軟體更安全。因為閉源只能靠審核,而通過審核很難發現軟體中的主觀的惡意代碼。為了解決這個問題,現在的新移動操作系統會限制軟體做一些事情的許可權。畢竟,無法進行開源審核的情況下,只能用許可權來對軟體的可能的惡意行為進行一些限制。但對於 Windows 這樣的,絕大多數軟體不開源無法接受審查,而且具有無限制的許可權的情況,確實,這個系統上的第三方應用軟體不如 Linux 安全。


安全性並不完全由系統決定,更多地而是用戶。Win和Linux的安全性並沒有絕對的高下之分。
大多數人平時用Windows的習慣就像天天在用root跑Linux還隨便什麼東西都給777許可權好不好?Linux也這麼玩你試試?

所謂系統只不過是硬體管家而已,或者說是個平台而已,發揮怎樣的效用要看用戶怎麼使用,安裝什麼應用程序。

大多數用(xiao)戶(bai)口中的安全問題根本不涉及「系統」的問題。就像家是不是安全,絕大多數時候不在於房子是磚混結構還是框架結構,而是有人從來不鎖門還在家裡放煙花好不好!

嗯,等等,這個天生安全基因是誰說的?請先問是不是再問為什麼


首先安全是相對的。
因為開源,很多人就會去研究系統的實現過程。在研究的過程中就很容易發現問題。而這些人非常願意把他們發現的問題上報。日積月累問題就越來越少了。也就越來越安全了


「天生的安全基因」這種描述指代不明,姑且理解為「系統有整體安全性設計」。
和幾乎無安全性設計的DOS、Windows 95等相比,Linux可以說有「天生的安全基因」,但並不比Windows NT系列更多。
按照國際標準EAL評估,SUSE 10、RedHat 5等,和Windows 2000、Windows 7等,同屬於EAL4級。


樓上有一些奇怪的想法,比如:

  • 「 例如我, 連UAC都關了,何況輸入密碼這種逆天要求."
  • 「最安全的方法當然就是自己寫」 [1]
  • "Linux 要是用戶激增,還會一如既往的安全嗎?"

安全的需求來自資源的共享,保護不同用戶對私有資源的隱私、防篡改以及可用性。就自己的安全需求去請教一位安全專家,他會建議你從業務層面優化安全。君不見 TLS 的關注點並不在於緩衝區漏洞,而是利用公鑰加密體系構造一套可信的業務規範。至於操作系統,則屬於可信計算域的範疇,自己在業務上有所考量之後,你仍需要無條件地信任依賴的中間件、操作系統乃至硬體。因為後者任意的緩衝區溢出之類的漏洞或者後門就足以使所有安全業務形同虛設,這也是為什麼關鍵業務管理者需要有人盯著 CVE 即時打補丁,不然隨便哪個毛孩子掃著 CVE 就能搞一大片 0day 攻擊。追 CVE 這活很臟很累,這也是為什麼 Redhat/SUSE 這樣的公司永遠有市場。

沒錯,安全不是絕對的,也不容易做比較。但是就可信計算域的範疇而言, Linux,Windows 和 BSD 都是極為複雜的系統,複雜系統不可能保證邏輯的一致性,必然不可避免地成為滋生安全漏洞的溫床,安全漏洞必然存在,也必然有新的安全漏洞出現。那它們的不同就在於問題的發現與利用。廠商沒有發現問題,不等於問題不存在;廠商發現問題要好於危險人物發現它。那麼,就發現問題的能力而言,Linux 社區遠遠超過微軟公司和 *BSD 社區是毫無疑問的。

「Linux 要是用戶激增,還會一如既往地安全嗎?」 這句話的問題在於 Linux 的用戶早就遠遠大於 Windows,而開發者更是王之軍勢對 Assassin 軍團的差異。 前面提到追 CVE 很臟很累,但是 Linux 社區幾乎擁有無限的人力資源去 review 代碼,社區也可以給予實實在在的激勵,去發現更多的問題。不幸的是,商業公司裡面存在相反的負激勵:如果有人給你提安全問題,你首先會覺得他在故意找茬,如果承認這是我們的安全問題,今年的績效和獎金老闆會怎麼看?

當然,也有核心開發者曾對 Linus 的管理風格不滿,說他相比發布公告更喜歡 「悄悄地」 修安全漏洞,給人一種 「Linux暴露的安全漏洞較少」 的印象,造成有些毛孩子跟著 Kernel 最近的 commit message 搞 0day,而發行版廠商有時候會被動一步。你看,即使開放如 Linux 仍嫌開放得不夠。相比 Windows 呢?你要交很貴的支持費用,真的很貴哦;相比 *BSD 呢?不管代碼質量多高,社區里找不著幾個人去review去總是尷尬的事情。

可信計算域的安全是業務安全的後盾,但是如果基於可信計算域的安全而衍生出一股自大心理,才是最大的安全隱患。把自己的業務安全做好,絕對不容易!綜上,跟隨 「安全基因」 不是個好想法。

[1]: https://www.owasp.org/index.php/Avoid_security_by_obscurity


看到排名第一@Ivony 的回答,我都覺得下面各種評論紛紛跑題了,如果是按照問題的原本的意思,題主想問 「Linux 有所謂「天生安全基因」嗎,整體安全性設計」

這種問題跟testing, review都沒有什麼關係,而在於結構的設計,就好比未越獄iOS的安全性比未root的Android 要高,這是在系統架構層面就決定。

在軟體開發里,Quality, Security, Safety, 是有著截然不同的含義的,

Ivony 講的大多是Quality方面的問題,我很好奇,這是怎麼一個跑題的回答莫名其妙的被推到了第一位。

不過看了下面的評論,我為什麼有種感覺,評論的人里沒有什麼人真正正兒八經的按照流程開發過軟體,想當多的是走野路子出來的,從標準流程講:
1,bug/task ticket create
2,analysis
3, coding in progress unit test(誰說研發不做測試,你的unit test 都通不過,給測試測個毛線,review 個毛線)
4, code review
5, Finding fix,
6 testing test case create
7 test review,
8 Final review (by Project manager)

這僅僅還只是流程,其中任何一個環節發現了finding,都要被打回重做,而且每個流程都有相應的
測試統計工具,這些工具,很多是公司自己開發的,這才是合格軟體公司必備技能好吧。

爭執於review跟testing 如何誰比誰重要,在大的開發項目中簡直是很好笑的事情。

其中Free testing, Design validation testing 伴隨著項目的整個流程,特別是公司要是做外包項目,甲方看的不是你review的結果,而是關心testing report

其實這樣一個團隊配備下來,也不過二三十人,但基本具備了起碼的項目開發資格,不然,要是引入第三方評估,沒有這套流程的連risk management都通過不了好吧。

所以同學們你們別鬧了,糾結於testing 跟 review誰才是保證Quality的關鍵,會被業內人士笑死的好嘛


這是一種過時的觀點。

這種觀點的出發點在於,Linux是開源的,所有人都能看到代碼並發現裡面的問題。而不僅僅是商業公司僱用的一小撮開發人員。


但很不幸的是,這一觀點的一個很重要的前提條件是錯誤的,也就是我上面加粗的那一段文字:

看到代碼並發現裡面的問題

簡單來說,現代軟體的複雜性使得通過代碼發現里裡面的安全漏洞是一件不可能完成的任務。很顯然拋出這種觀點的人還認為代碼質量取決於開發人員的能力和足夠多的review

很不幸的是這一觀點已經過時了,現代軟體開發實踐告訴我們,事實上軟體的質量很大程度上取決於測試的覆蓋


是的,也許你會認為人是一種非常聰明的動物,大神級別的程序員犯低級錯誤的可能性為零,他們有著敏銳的直覺和嗅覺能夠準確的發現薄弱的代碼和其中的漏洞,並修復他們。將全球這些大神聚集在一起來review,我們就可以確保代碼萬無一失。

但很遺憾的是,事實上無論多優秀的程序員都是有可能犯錯的,只要是人,就一定會犯錯。而且人犯錯的可能性遠超電腦無數個數量級。換言之,即使把全世界所有的人叫來一起review代碼,恐怕犯錯的概率仍然可能比電腦要大


更何況,根據旁觀者效應,一個集體來承擔責任時,可能導致的結果比只有一個人的時候更糟糕。每一個的程序員都相信地球上有著另外一些更優秀的程序員會進行review和測試,認真的檢查每一行代碼確保不會出現低級的錯誤,結果就是每一個人都不會認真的review和測試


所以,所謂的無限的review和測試資源其實只是一個幻象而已。


同時,商業公司中存在負激勵的說法是不正確的。但任何一個稍微專業的軟體公司,開發和測試的職能都是嚴格分開的,甚至日常測試和可信計算也是不同的團隊。

發現安全漏洞是安全團隊或者可信計算的業績,雖然對於開發人員而言這意味著不好的事情,但事實上任何一個正常點的公司都不會依賴開發人員自行發現漏洞,所以所謂的負激勵是不存在的。


============================補充回應============================

評論中的質疑真心不在點子上。事實上我沒有否認review和牛叉程序員的重要性,但是軟體的可靠性卻不是依賴於這些無法量化和計算的東西,這是一種過時的觀點

其實,一說到review就想到人肉review也是過時的觀點,現代軟體開發工具已經可以在很大程度上用規則引擎來代替部分review的工作


測試不能代替review,但反過來review也不能代替測試。最終決定軟體質量的很大程度上是測試覆蓋到的可能性,而非多麼牛逼的人來寫和review。

我並沒有說跑全了測試就是高質量的代碼,事實上跑全測試是最基本的要求,測試都跑不下來這代碼是不可能release的。認識到這一點,我們就會發現軟體最終的的質量(而非代碼的質量)很大程度上取決於測試的廣度,也就是說測試可以發現多少問題。

當然,良好的設計和高質量的代碼,可以提高我們的測試效率,例如代碼的可測試性,耦合性等等,我沒有說這些不重要,因為測試效率的提高使得我們可以用更少的測試獲得更大的覆蓋,所以說這些東西同樣重要,但最終決定軟體的可靠性的還是測試。

至於某位程序員用自己實際的經驗說商業公司的代碼簡直是一坨屎的論點,我不置可否。但事實上這個地球上有很多屎一樣的代碼,代碼是不是屎一樣和他是不是商業公司開發出來的關係不大。或許你看到的都是屎一樣的,其實很可能是因為你的Level決定了只能接觸到屎一樣的代碼


============================繼續補充============================

@pansz 的軟體生態的觀點我很贊同,我在這個回答裡面也認為目前面向消費市場的Windows操作系統最大的問題在軟體生態,而非操作系統本身。

但是我們也應當看到最近幾年微軟開始改變之前的一些做法,在伺服器市場上,除了繼續提供自家的全套解決方案,和少數合作夥伴提供的商用解決方案,也開始擁抱開源的解決方案。例如Download the Microsoft Web Platform就是這樣一個可信的軟體倉庫。

另外有人補充說這個提出這個觀點的人可能著眼點不是軟體本身安全質量,而是由於開源,美國國家安全局(NSA)的滲透和植入後門的可能性會有所降低。但這種安全我認為已經到了國家政治的層面,而不是商業決策所需要著重考慮的。同時為了消除這一顧慮,微軟公司也為各國政府提供了軟體的源代碼。

出於這種顧慮,所以我們國家一直希望有自主知識產權的操作系統,但目前結果都不盡如人意啊。


那是因為windows是你老師配置的,而linux是你自己安裝的。


Linux整體安全性設計確實很優秀,我所知道的有Linux內核安全模塊LSM,只提供安全介面,具體業務實現由其他安全模塊實現,比如selinux提供強制訪問控制,Capability機制將root許可權更細粒度劃分,這些安全模塊以棧的形式提供許可權管理………還有PAM,也是特別優秀的設計,將認證和其他業務邏輯分離,認證方案由系統管理員制定………還有最近比較火的Linux container,進程的隔離以及資源管理。


從一個角度看,Linux至少會比Windows、OSX、iOS、Android值得信任

  • NSA想在Linux中植入後門的難度比較高:至少它不能直接向開源社區提出這個要求。而它可以要求Apple、微軟、Google暗中配合,即使這些美國公司不願意合作也可以要求他們不要把整件事泄露出去

你天天用root用戶跑來跑去比windows還不安全呢,重要的是人,用linux的通常來說技術水平比windows要高出很多,現在的黑客黑你都是為了掙錢,黑linux用戶投入產出不成正比自然沒有黑客願意騷擾你了。


微軟如果在底層加入惡意代碼,需要嚴苛的條件才能觸發,逆向人員則很難調試出來,畢竟系統太龐大,隨便隱藏在哪裡我們也不知道。
這也是linux的優勢,代碼開源,有什麼小心思(一些開發人員喜歡沒事留後門)很難躲過檢測。

但是任何一台伺服器、PC,只要做好主動防禦和防火牆,惡意代碼一是只能本地破壞,二是本地破壞還沒完成就被攔截了,所以說安全是一種習慣,和基因倒沒有太多關係。

換言之,一個人生下來身體很健康,他就一定長命百歲嗎?


SELinux?


  1. @Ivony 的回答跑題了。 linux天生更安全指的是系統架構的設計。這個優勢是繼承自unix系的基因,有非常嚴格的許可權設置。相對於早期的windows操作系統優勢很大,但windows也在不斷改進,現在差別已經很小了。
  2. 我們常說的一句話是安不安全不在系統,在人。由於歷史傳承的原因,linux用戶要比windows用戶有更強的安全意識。Windows新加入的一些優良安全設計很多時候都派不上用場。最好例子就是上面的「例如我, 連UAC都關了,何況輸入密碼這種逆天要求」。用windows的大多都是小白,用linux的黑客多,你說攻擊哪個更容易。
  3. @Ivony 對開源的理解不夠全面。開源的目的並不完全是為了讓大家review code,而是使得發現問題儘快修補代碼成為可能。linux系統是開源的,一旦發現安全漏洞,管理員和社區可以迅速製作補丁解決問題,降低可能的損失。如果你用windows,你就只能把自己的命運交給微軟。linux社區對漏洞的應對速度是有目共睹的。而微軟出補丁的速度,取決於他們的心情...求人不如求己,開源使得自己解決問題(或者僱人解決問題)成為可能。從這個意義上講,linux確實天生更安全。

因為不易用.

隨意安裝個軟體, 就彈出框要求輸密碼, win做成這樣也肯定安全, 但是沒有幾個人受的了, 例如我, 連UAC都關了, 何況輸入密碼這種逆天要求.


是的,Linux有天生安全的基因。

  1. 學會linux很難, 一個vim,一個emacs就會讓很多人望而卻步。所以Linux天生就是有門坎的,不是什麼人都可以愉快的使用的。
  2. linux更新速度很快,要保持這種速度,就必須捨去商業上、圖形設計上繁瑣的爭爭吵吵,簡單的以code作為行還是不行的判斷依據,這從某種意義上,註定這個地方就是工程師說了算,而一個工程師說了算的地方,很難容忍不安全。
  3. Linux的開放策略,Linux的開放策略,導致了linux發行版本眾多,而人類的自尊心有使得大家必須去競爭,所以,當一個髮型版本有了安全問題,另一個髮型版本會快速解決,並告訴大家我們比他們安全。
  4. 面向大眾的反饋介面,Linux有良好的社區協作,全世界N多愛好者舍了霓虹燈的閃爍,舍了MM的投懷送抱,面對屏幕仔細的閱讀和散播第一手的代碼信息,沒有人懼怕問題。這恰恰好把問題扼殺在萌芽階段。

Linux生而安全,請放心使用。


linux開源,所以儘管有可能有bug,有漏洞,但不太可能會有故意的後門或者說不容易留後門。
所謂linux的安全性也是從這個角度來說的。


安全是相對的,並不是有Linux/GNU牌子的就代表代碼質量絕對可靠以及天生安全,參見最近的GnuTLS漏洞
但是開源確實代表每個人都能以公開公平公正的方法去討論一段代碼,發現不足。


對於已經存在的事物,「安全」只是相對的;對於不存在的事物,可以說相對安全。


可能Linux 本身就是由全世界頂級黑客們合作開發的。孩子還是自己的好。


推薦閱讀:

安全領域的 CTF (Capture the Flag) 競賽是怎麼組織?怎麼進行的?
安全團隊的 CTF 得分能代表哪方面的實力水平?
某國公安偵查到該國IM上一則關於搶劫的聊天信息,現實技術上是如何實現的?

TAG:Linux | 網路安全 | 計算機安全 |