Linux與Unix二大操作系統編程的安全
由于有些讀者只在Windows上工作,所以這里要介紹一下*nix。UNIX和Linux的劃分在于其內核以及用戶(hù)空間上。大多數程序都可以在用戶(hù)空間里的內核之上運行。剛剛接觸Linux的程序員,尤其是有經(jīng)驗的UNIX開(kāi)發(fā)人員,有時(shí)候無(wú)法意識Linux并不只是是免費版本的UNIX;事實(shí)上,兩者的確存在一些很大的不同之處。從安全的角度講,大多數版本Linux都非常相似,因為它們都基于相同的內核和C庫。一個(gè)顯著(zhù)的不同之處是,Linux對按需動(dòng)態(tài)加載內核模塊提供了專(zhuān)門(mén)的支持。
除了UNIX和Linux以上的不同之處,不同版本的UNIX之間也存在很大的安全差別。對于轉到UNIX的Linux開(kāi)發(fā)人員來(lái)說(shuō),這些差別不太明顯,但是很重要。例如,有些和UNIX類(lèi)似的操作系統會(huì )進(jìn)行強制的訪(fǎng)問(wèn)控制,而有的則不會(huì )。
還有一個(gè)緊密相關(guān)的平臺:Free Software HURD宏內核的*nix,它有自己的安全特性。
有些UNIX平臺,其中最顯著(zhù)的是OpenBSD,在進(jìn)行缺省安裝的時(shí)候本身就要比其它的操作系統更加安全;如果為它們所寫(xiě)的應用程序還會(huì )運行在其他一些版本的UNIX系統上,那么這些應用程序仍然需要實(shí)現它們自己的安全特性,并遵照一些好的編程慣例。
對于開(kāi)發(fā)人員而言,理解線(xiàn)程和進(jìn)程是尤其重要的。在UNIX的變體里,線(xiàn)程常常會(huì )被單獨處理,而執行則由系統來(lái)計劃安排。而在Linux里,進(jìn)程和線(xiàn)程事實(shí)上沒(méi)有區別。在UNIX里,同一個(gè)進(jìn)程里的線(xiàn)程會(huì )共享內存,但是Linux的進(jìn)程會(huì )創(chuàng )建另外的進(jìn)程,并能夠定義哪些資源可以被共享,而哪些不能。Linux的開(kāi)發(fā)人員常常會(huì )用到“任務(wù)(task)”這個(gè)詞,而他們事實(shí)上是在談?wù)撨M(jìn)程。為了以最安全的方式讓?xiě)贸绦蚰軌虮灰浦?,開(kāi)發(fā)人員應該堅持使用標準的線(xiàn)程庫。
特別的,如果你希望應用程序能夠被移植,那么就要使用“fork”調用來(lái)創(chuàng )建新的進(jìn)程。要注意,如果可能的話(huà)要堅持使用fork,這一點(diǎn)很重要。不要使用“vfork”,它是由BSD開(kāi)發(fā)的一個(gè)優(yōu)化版本的fork(因此被廣泛使用),而且出于兼容性的考慮,也被引入了Linux。其原因很簡(jiǎn)單:vfork會(huì )讓子進(jìn)程共享(或者更準確地說(shuō),接管)父進(jìn)程的內存和控件,這會(huì )導致子進(jìn)程和父進(jìn)程之間的相互沖突。在有些版本的Linux里,vfork在特定情況下會(huì )被黑客攻破。
盡管Windows有這樣或者那樣明顯的和著(zhù)名的問(wèn)題,從某種角度上講,微軟的開(kāi)發(fā)人員實(shí)現編程安全要相對容易一些,因為他們所工作平臺的多樣性受到了限制。
UNIX和Linux的開(kāi)發(fā)人員,尤其是跨平臺的開(kāi)發(fā)人員,可能對安全具有特別的敏感性,因為它們的操作系統可能在缺省的條件下就更加安全;但是,不同版本的UNIX之間在安全上有很多的不同,其差別甚至要比UNIX和Linux之間的還要大。它們之間眾多的相同特性常常掩蓋掉了這些差別,而可移植性的因素則加劇了這些差別。沒(méi)有哪個(gè)Windows下的C或者VBASIC程序員,會(huì )認為他的或者她的應用程序會(huì )一成不變的只運行在UNIX平臺上,或者相反;但是在UNIX/Linux社區內部,要記住,由于應用程序可能會(huì )運行在不同的平臺上,所以它可能無(wú)法運行在相同的安全級別上,這一點(diǎn)很重要。
評論