大部分屬性在檔案系統的安全管理方面起很重要的作用。
一 課前預備知識:檔案系統分類、檔案系統顯示許可權及其修改方式、對於所屬者、所屬組、其他使用者的認識及其定義
Linux 最早的檔案系統是Minix,但是專門為Linux 設計的檔案系統——擴充檔案系統第二版或EXT2被設計出來並添加到Linux中,這對Linux產生了重大影響。EXT2檔案系統功能強大、易擴充、效能上進行了全面最佳化,也是現在所有Linux發布和安裝的標準檔案系統類型。
每個實際檔案系統從作業系統和系統服務中分離出來,它們之間通過一個介面層:虛擬檔案系統或VFS來通訊。VFS使得Linux可以支援多個不同的檔案系統,每個表示一個VFS 的通用介面。由於軟體將Linux 檔案系統的所有細節進行了轉換,所以Linux核心的其它部分及系統中啟動並執行程式將看到統一的檔案系統。Linux 的虛擬檔案系統允許使用者同時能透明地安裝許多不同的檔案系統。
在Linux檔案系統中,作為一種特殊類型/proc檔案系統只存在記憶體當中,而不佔用記憶體空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。/proc檔案系統是一個偽檔案系統,使用者和應用程式可以通過/proc得到系統的資訊,並可以改變核心的某些參數。
在Linux檔案系統中,EXT2檔案系統、虛擬檔案系統、/proc檔案系統是三個具有代表性的檔案系統,本論文試圖通過對他們的分析來研究Linux檔案系統機制。並且在分析這三種檔案系統的基礎上對Linux檔案系統操作進行瞭解、研究(本論文選取了open和close兩種操作進行研究)。在第二部分中將介紹EXT2檔案系統;第三部分論述虛擬檔案系統的特點;第四部分簡要介紹/proc檔案系統;最後,介紹兩種具體檔案系統操作的實現。
編輯本段
EXT2檔案系統
在Linux中普通檔案和目錄檔案儲存在稱為塊物理裝置的磁碟或者磁帶上。一套Linux系統支援若干物理盤,每個物理盤可定義一個或者多個檔案系統。(類比於微機磁碟分割)。每個檔案系統由邏輯塊的序列組成,一個邏輯盤空間一般劃分為幾個用途各不相同的部分,即引導塊、超級塊、inode區以及資料區等。
引導塊:在檔案系統的開頭,通常為一個扇區,其中存放引導程式,用於讀入並啟動作業系統;超級塊:用於記錄檔案系統的管理資訊。特定的檔案系統定義了特定的超級塊;inode區(索引節點):一個檔案或目錄佔據一個索引節點。第一個索引節點是該檔案系統的根節點。利用根節點,可以把一個檔案系統掛在另一個檔案系統的非分葉節點上;資料區:用於存放檔案資料或者管理資料。
Linux最早引入的檔案系統類型是MINIX。MINIX檔案系統由MINIX作業系統定義,有一定的局限性,如檔案名稱最長14個字元,檔案最長64M位元組。第一個專門為Linux設計的檔案系統是EXT(Extended File System),但目前流行最廣的是EXT2。
第二代擴充檔案系統由Rey Card 設計,其目標是為Linux 提供一個強大的可擴充檔案系統。它同時也是Linux界中設計最成功的檔案系統。通過VFS的超級塊(struct ext2_sb_info ext2_sb)可以訪問EXT2的超級塊,通過VFS的inode(struct ext2_inode_info ext2_i)可以訪問EXT2的inode。
檔案系統EXT2的原始碼在/usr/src/linux/fs/ext2目錄下,它的資料結構在檔案/usr/src/linux/include/linux/ext2_fs.h以及同一目錄下的檔案ext2_fs_i.h和ext2_fs_sb.h中定義。
EXT2檔案系統將它所佔用的邏輯分區劃分成塊組(block group),如所示:
組0
組1
…………
組N
超級塊
組描述符表
塊位元影像
inode位元影像
inode表
資料區塊
編輯本段
邏輯分區
和很多檔案系統一樣, EXT2 建立在資料被儲存在資料區塊中的檔案內這個前提下。這些資料區塊長度相等且這個長度可以變化,某個EXT2 檔案系統的塊大小在建立(使用mke2fs)時設定。每個檔案的大小和剛好大於它的塊大小正數倍相等。如果塊大小為1024 位元組而一個1025 位元組長的檔案將佔據兩個1024 位元組大小的塊。這樣你不得不浪費差不多一半的空間。我們通常需要在CPU 的記憶體利用率和磁碟空間使用上進行折中。而大多數作業系統,包括Linux 在內,為了減少CPU 的工作負載而被迫選擇相對較低的磁碟空間利用率。並不是檔案中每個塊都包含資料,其中有些塊被用來包含描敘此檔案系統結構的資訊。EXT2通過一個inode 結構來描敘檔案系統中檔案並確定此檔案系統的拓撲結構。inode 結構描敘檔案中資料佔據哪個塊以及檔案的存取許可權、檔案修改時間及檔案類型。EXT2 檔案系統中的每個檔案用一個inode 來表示且每個inode 有唯一的編號。檔案系統中所有的inode都被儲存在inode 表中。 EXT2 目錄僅是一個包含指向其目錄入口指標的特殊檔案(也用inode表示)。
對檔案系統而言檔案僅是一系列可讀寫的資料區塊。檔案系統並不需要瞭解資料區塊應該放置到物理介質上什麼位置,這些都是裝置驅動的任務。無論何時只要檔案系統需要從包含它的塊裝置中讀取資訊或資料,它將請求底層的裝置驅動讀取一個基本塊大小整數倍的資料區塊。EXT2 檔案系統將它所使用的邏輯分區劃分成資料區塊組。每個資料區塊組將那些對檔案系統完整性最重要的資訊複製出來, 同時將實際檔案和目錄看作資訊與資料區塊。為了發生災難性事件時檔案系統的修複,這些複製非常有必要。
編輯本段
與windows比較
相同點
使用者和組
Linux是多使用者多任務作業系統而Windows是單使用者多任務作業系統。都可以由許多不同的使用者來使用,為每個使用者提供單獨的環境和資源。基於使用者身份來控制安全性。都可以以群組成員的方式來控制資源的存取權限,這樣在使用者數目較大時可以不必為每一個帳號設定許可權。
使用者和組可以集中管理,讓多個伺服器共用相同的使用者和驗證資料。
檔案系統
Linux和Windows都支援多種檔案系統。檔案資源可以通過NetBIOS、FTP或者其他協議與其他客戶機共用。可以很靈活地對各個獨立的檔案系統進行組織,由管理員來決定它們在何處可以以何種方式被訪問。
連接埠和裝置
兩種作業系統都支援各種物理裝置連接埠,比如並口、串口和 USB 介面。支援各種控制器,比如 IDE 和 SCSI 控制器。Linux 還支援很多“剛剛上市”的標準硬體。
網路
Linux和Windows都支援多種網路通訊協定,比如TCP/IP、NetBIOS和IPX。都支援多種類型的網路介面卡。都具備通過網際網路共用資源的能力,比如共用檔案和列印。都可以提供網路服務能力,比如 DHCP 和 DNS。
服務
Linux和Windows都提供服務。所謂服務,指的是那些在後台啟動並執行應用程式,可以為系統和遠程調用該服務的電腦提供一些功能。在系統引導的時候可以單獨控制並自動啟動這些程式。(注意:Linux 中沿用了 Unix 的習慣,稱這種應用程式為 daemon)
不同點
Linux 的應用目標是網路而不是列印
Windows最初出現的時候,這個世界還是一個紙張的世界。Windows的偉大成就之一在於您的工作成果可以方便地看到並列印出來。這樣一個開端影響了 Windows 的後期發展。
同樣,Linux 也受到了其起源的影響。Linux 的設計定位於網路作業系統。它的設計構想來自於 Unix 作業系統,因此它的命令的設計比較簡單,或者說是比較簡潔。由於純文字可以非常好地跨網路工作,所以 Linux 設定檔和資料都以文本為基礎。
對那些熟悉圖形環境的人來說,Linux伺服器初看可能比較原始。但是Linux開發更多關注的是它的內在功能而不是表面上的東西。即使是在純文字的環境中,Linux同樣擁有非常先進的網路、指令碼和安全能力。執行一些任務所需的某些表面上看起來比較奇怪的步驟是令人費解的,除非您認識到 Linux 是期望在網路上與其他 Linux系統協同執行這些任務。Linux的自動執行能力也很強,只需要設計批次檔就可以讓系統自動完成非常詳細的任務。Linux 的這種能力來自於其基於文本的本質。
可選的 GUI
Linux有圖形組件。Linux支援高端的圖形卡和顯示器,完全勝任圖形相關的工作。現在,許多數字效果藝術家在Linux工作站上來進行他們的設計工作,而以前這些工作需要使用IRIX系統來完成。但是,圖形環境並沒有整合到 Linux 中,而是運行於系統之上的單獨一層。這意味著您可以只運行 GUI,或者在需要時才運行 GUI。如果您的系統主要任務是提供Web應用,那麼您可以停掉圖形介面,而將其所用的記憶體和CPU資源用於您的服務。如果您需要在 GUI 環境下做一些工作,可以再開啟它,工作完成後再將其關閉。
Linux 有圖形化的管理工具,以及日常辦公的工具,比如電子郵件、網路瀏覽器和文檔處理工具等。不過,在 Linux 中,圖形化的管理工具通常是控制台 (命令列) 工具的擴充。也就是說,用圖形化工具能完成的所有工作,用控制台命令同樣可以完成。同樣,使用圖形化工具並不妨礙您對設定檔進行手工修改。其實際意義可能並不是特別顯而易見,但是,如果在圖形化管理工具中所做的任何工作都可以以命令列的方式完成,這就表示那些工作也可以由一個指令碼來實現。指令碼化的命令可以成為自動執行的任務。Linux 同時支援這兩種方式,並不要求您只用文本或者只用 GUI。您可以根據您的需要選擇最好的方法。
Linux 中的設定檔是人類可讀的文字檔,這與過去的 Windows 中的 INI 檔案類似,但與 Windows 的註冊表機制在思路上有本質的區別。每一個應用程式都有其自己的設定檔,而且通常不與其他的設定檔放在一起。不過,大部分的設定檔都存放於一個分類樹 (/etc) 下的單個地方,所以看起來它們在邏輯上是在一起。文字檔的配置方式使得不通過特殊的系統工具就可以完成設定檔的備份、檢查和編輯工作。
檔案名稱擴充
Linux不使用檔案名稱擴充來識別檔案的類型。相反,Linux根據檔案的頭內容來識別其類型。為了提高人類可讀性您仍可以使用檔案名稱擴充,但這對 Linux 系統來說沒有任何作用。不過,有一些應用程式,比如 Web 服務器,可能使用命名規範來識別檔案類型,但這隻是特定的應用程式的要求而不是 Linux 系統本身的要求。
Linux通過檔案存取權限來判斷檔案是否為可執行檔。任何一個檔案都可以賦予可執行許可權,這樣程式和指令碼的建立者或管理員可以將它們識別為可執行檔。這樣做有利於安全。儲存到系統上的可執行檔檔案不能自動執行,這樣就可以防止許多指令碼病毒。
重新引導是最後的手段
如果您使用Windows已經很長時間了,您可能已經習慣出於各種原因(從軟體安裝到糾正服務故障)而重新引導系統。在Linux思想中您的這一習慣需要改變。Linux在本質上更遵循“牛頓運動定律”。一旦開始運行,它將保持運行狀態,直到受到外來因素的影響,比如硬體的故障。實際上,Linux系統的設計使得應用程式不會導致核心的崩潰,因此不必經常重新引導(與Windows系統的設計相對而言)。所以除了Linux核心之外,其他軟體的安裝、啟動、停止和重新設定都不用重新引導系統。
如果您確實重新引導了 Linux 系統,問題很可能得不到解決,而且還會使問題更加惡化。學習並掌握 Linux 服務和運行層級是成功解決問題的關鍵。學習 Linux 最困難的就是克服重新引導系統的習慣。
另外,您可以遠程地完成Linux中的很多工作。只要有一些基本的網路服務在運行,您就可以進入到那個系統。而且,如果系統中一個特定的服務出現了問題,您可以在進行故障診斷的同時讓其他服務繼續運行。當您在一個系統上同時運行多個服務的時候,這種管理方式非常重要。
所有的 Linux 命令和選項都區分大小寫。
二 EXT2檔案系統的隱藏許可權
除了設定檔案或目錄的讀(r)、寫(w)、執行(x)許可權外,對於某些有特殊要求的檔案(如伺服器日誌)還可以追加隱藏許可權的設定。這些隱藏許可權包括: ①Append only (a) ② compressed (c) ③no dump (d)④ immutable (i) ⑤ data journalling (j) ⑥secure deletion (s) ⑦no tail-merging (t), ⑧undeletable (u) ⑨no atime updates (A), ⑩synchronous directory updates (D)
⑴synchronous updates (S), 同步更新
⑵ and top of directory hierarchy (T).和頂部的目錄階層
三 隱藏許可權的查看與修改
通過lsattr查看檔案的隱藏許可權。
[root]#lsattr --help
通過chattr設定檔案的隱藏許可權。
[root]#chattr --help
1、Lsattr命令
lsattr命令格式:
[root]#lsattr [-RVadlv] [files...]
參數或選項說明:
-R:遞迴列示目錄及檔案屬性。
-V:顯示程式版本號碼。
-a:顯示所有檔案屬性,包括隱藏檔案(.)、當時目錄 (./)及上層目錄(../)。
-d:僅列示目錄屬性。
-l:(此參數目前沒有任何作用)。
-v:顯示檔案或目錄版本。
2、Chattr命令
我們來舉一個例子:
[root]#touch chattr_test
[root]#chattr +i chattr_test
[root]#rm chattr_test
rm: remove write-protected regular empty file `chattr_test`? y
rm: cannot remove `chattr_test`: Operation not permitted
呵,此時連root本身都不能直接進行刪除操作,必須先去除i設定後再刪除。
chattr命令的線上協助詳細描述了各參數選項的適用範圍及bug提示,使用時建議兄弟們仔細查閱。
四 檔案的特殊許可權:SUID/SGID/Sticky Bit
結合前面介紹的UMASK值(0022),說明還存在一些特殊的許可權規範,這些許可權包括SUID/SGID/Sticky Bit,系統中就直接存在這樣的例子:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]$ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27768 Jul 17 2006 /usr/bin/passwd
1、SUID(Set UID)
a、Linux為了提高本機使用者帳號資訊的安全性,特別指定了/etc/shadow (影子檔案)以加密密碼的方式來儲存使用者的賬戶資訊,同時這個檔案的預設許可權是-r--------,限定只有superuser才能“強制”儲存,其他使用者沒有任何許可權。可是你會發現,為什麼我們可以以普通使用者的身份修改我們自己的使用者密碼呢,畢竟更新密碼就必然會寫入/etc/shadow檔案的?
b、參照前面的例子(/usr/bin/passwd),我們認為當檔案系統的“所有者許可權組合”的可執行位(x)被s(即rws------)取代時,構成特殊許可權規定Set UID,簡稱SUID。
c、SUID表示當請求執行包含SUID特殊許可權的程式時,能夠暫時擁有該程式所有者(對程式)的存取許可權。假設普通使用者A通過passwd命令更新自己的密碼,而/usr/bin/passwd的所有者是root (root,root),也就是說,當A請求執行passwd命令時,實際上是暫時獲得root(對/usr/bin/passwd)的執行許可權,並進一步更新/etc/shadow的內容。
d、需要注意的是,Linux規定SUID僅對系統中的二進位可執行檔設定有效,而且不可對Shell Script施加設定,畢竟Shell 指令碼只是對二進位可執行檔的調度組合,最終也是要遵從binary file的使用權限設定。
2、Set GID
相對於SUID,當所有者所在的使用者組(group)的許可權組合中可執行位(x)被s所取代時(例如---rws---),便構成Set GID的使用權限設定。SGID可以針對二進位檔案或目錄進行設定:
a.二進位可執行檔:則當請求執行該檔案(程式)時,請求執行者所在的使用者組(即effective group)將暫時獲得該程式(binary file)所屬的使用者組ID(group ID)的存取許可權.
b.目錄:假設目錄A,此時在A目錄下建立的檔案或子目錄所屬的使用者組ID,將自動被賦予A目錄的組ID
SGID主要用於多人組成的項目開發上,一般比較少用到。
3、 Sticky Bit
我們認為,當檔案系統“其他(others)”的許可權組合中可執行位(x)被t所取代時(例如------rwt),便構成Sticky Bit的使用權限設定。SBIT顧名思義可以起到限制訪問的作用,是容易理解而好用的設定,它只對目錄有效。當對一個目錄A施加了SBIT設定以後,並且使用者對A目錄有w和x許可權時,則使用者在A目錄下所建立的個人文檔(含目錄)只有使用者本身或root可以執行刪除、更名、移動等操作(是否可讀依實際許可權r而定)。
由前面所舉的/tmp目錄,我們做一下簡單的測試:
[root]#ls -dl /tmp
drwxrwxrwt 342 root root 36864 Jun 14 22:13 /tmp
[root]#cd /tmp
[root]#touch orange
[root]#chmod 777 orange (注意這裡設定orange許可權全開)
[root]#logout (退出root,並以普通使用者登入)
[console]$cd /tmp
[console]$rm orange
rm: cannot remove `orange': Operation not permitted
注意:SBIT一般僅針對目錄施加有意義。
五 特殊許可權的設定
接下來再簡單介紹以上幾種特殊許可權的設定方法。如果你已經掌握了用(八進位)數字來表示許可權的規則,再結合chmod命令進行設定就很簡單了。以下是SUID/SGID/Sticky Bit約定對應的八位元值:
*SUID 4
*SGID 2
*SBIT 1
設定時我們把表示特殊許可權的數字放在其他三位元字許可權的前面,現舉例如下:
[root]#touch banana ; ll banana
-rw-r--r-- 1 root 8083 0 Jun 16 18:16 banana
[root]#chmod 4775 banana ; ll banana
-rwsrwxr-x 1 root 8083 0 Jun 16 18:16 banana (注意SUID僅對二進位檔案有效)
[root]#chmod 6775 banana ; ll banana
-rwsrwsr-x 1 root 8083 0 Jun 16 18:16 banana (注意許可權組合)
[root]#chmod 1775 banana ; ll banana
-rwxrwxr-t 1 root 8083 0 Jun 16 18:16 banana (注意SBIT一般僅針對目錄有意義)
六 file命令來識別檔案類型
1、應用舉例:
[root]#file ~/.bashrc
/home/b/j/console/.bashrc: ASCII text
[root]#file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
[root]#file /usr/lib/python2.4/test/185test.db
/usr/lib/python2.4/test/185test.db: Berkeley DB 1.85 (Hash, version 2, big-endian)
2、file 是檢測檔案類型的命令。 file 命令的簡單用法就是: file 檔案名稱,例如: file data.txt data.txt: ASCII text 就告訴我們,data.txt 是一個text (即txt) 類型的檔案。 txt 檔案所採用的編碼是ascii編碼體系。 所以 text 是檔案類型;ASCII是編碼體系。
3、又如: file my.pdf my.pdf: PDF document, version 1.5 “PDF document“ 告訴我們 , my.pdf 是pdf類型的檔案。 版本執行的標準是:1.5 像ascii , version 1.5 這些都是與檔案類型密切相關的資訊。 如果需要更詳細的資訊,可以加參數:
如:file -i data.txt