Linux檔案許可權隱藏的細節深入分析

2021-05-01 15:22:05 字數 4717 閱讀 2383

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊:

$ stat file1

file: `file1'

size: 11904 blocks: 24 io block: 4096 regular file

device: 301h/769d inode: 355982 links: 1

access: (0755/-rwxr-xr-x) uid: ( 503/ jack) gid: ( 503/ general)

access: 2003-10-19 09:14:12.000000000 +0800

modify: 2003-10-14 20:41:21.000000000 +0800

change: 2003-10-19 18:56:25.000000000 +0800

$ lsattr file

----i--a----- file

可以看到,檔案許可權的含義是比較廣的,先來看-rwxr-xr-x,第一位是檔案的型別,它定義了使用者只能某種方式來操作檔案,後面九位是檔案的訪問控制資訊,linux的檔案許可機制將使用者分為三類:檔案屬主u(user)、檔案屬組g(group)和其它使用者o(other)。三類不同的使用者可以對檔案擁有三種不同級別的許可權:讀r(read)、寫w(write)和執行x(execute)。於是形成了九位的許可權資訊,分為三組,分別對應u,g, o。除此之外,使用者還可以設定setuid與setgid位來改變程式的執行身份。用lsattr命令則可以看到檔案的屬性,控制位包括 asacddiijsttu,這些也是能控制檔案的訪問的。

由於篇幅有限,不可能就這些一一進行分析,本文著力分析檔案許可權中w(write)的真正含義,挖出其背後隱藏的細節,力圖使讀者能正確用好這個關鍵的許可權位,不至於在系統管理中出現差漏。

為了能更直觀的說明問題,本文採用實驗操作的方式,一步一步的進行分析。為了簡化操作,我們用o(other)這組許可權來做實驗。實驗中用到的許可權位均屬於o(other), 進行操作的使用者均非root使用者,屬於o(other)。

在實驗之前,必須澄清乙個概念,目錄也是一種檔案,它主要包括了兩方面的資訊,該目錄下檔案的檔名稱與檔案inode編號,它們之間有一一對應的關係。不過目錄檔案比較特殊,不能用常規的方法進行讀寫,必須用系統的專用命令來操作。命令ls其實是對目錄檔案進行讀操作,命令mv,rm則是對目錄檔案進行寫操作。

好了,該說說w(write)的真正含義了,一句話,linux檔案許可權中的w是對該檔案的*內容*進行限定。下面的實驗可以驗證。

實驗1, 目錄檔案: /test(rwx), 普通檔案: /test/file(r--). 當前目錄:/test

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊:

$ echo "abc" >file

bash: file: permission denied

試圖對file的內容進行改寫, 但file的許可權是唯讀,很顯然,操作失敗。

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊: 

$ cat file

hello world!

沒有問題, 可以讀出file的內容。

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊: 

$ mv file file2

$ ls

file2

這是怎麼回事呢, file的許可權明明是唯讀啊, 請注意, 前面提到了, 檔案中的rw許可權只是針對當前檔案的內容進行限定, 檔名不屬於當前檔案的內容, 它是儲存在上一級的目錄檔案的內容中。而mv命令表面上是針對file的,其實是對/test的內容進行改寫,再看看/test的許可權, 是可寫的(rwx)。許多使用者為了保護檔案,將其許可權設成唯讀就不管了,這是非常危險的,誠然,可以達到保護檔案內容的目的(其實也未必,補充內容中有論述),但你卻不能保證檔案是否會被更名或被刪除,保險的方法是將檔案父目錄的許可權也設為唯讀。當然,也有其他的方法,比如用chattr +i命令或將檔案系統用ro方式掛載等等,但這些不在本文論述範圍。

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊: 

$ rm -f file2

$ ls

$

同樣的原因, 我們可以刪除file2, 與上一次操作不同的是,我們不是改寫/test的一條紀錄,而是在刪除/test的一條紀錄。

實驗2, 目錄檔案: /test(r-x), 普通檔案: /test/file(rw-), 當前目錄:/test

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊:

$ echo "abc" >file

$ cat file

abc

/test的許可權雖然是唯讀,但我們改寫的是file的內容, 它的許可權是可寫,當然沒有問題。

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊: 

$ mv file file2

mv: cannot move 'file' to 'file2': permission denied

$ rm -f file

rm: cannot remove 'file': permission denied

我們已經知道, 這兩條指令其實與file的許可權無關, 而是在改寫/test的內容, 當然操作失敗。通過前面幾個操作,我們應該要分清楚指令真正的操作物件是誰,這樣才能對檔案許可權作出正確的設定。

實驗3, 目錄檔案: /test(rwx), 普通檔案: /test/file(r--), 目錄檔案: /test/dir(r-x), 普通檔案: /test/dir/file(rw-), 當前目錄:/test

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊:

$ mv file file2

$ mv dir dir2

$ ls

dir2 file2

很順利, 因為/test/file與/test/dir的父目錄/test的許可權給的太寬鬆了,是rwx。

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊: 

$ rm -f file2

$ rm -rf dir2

rm: cannot remove 'dir2/file': permission denied

$ ls -r

.:dir2

./dir2:

file

到這裡, 我們已經絲毫不奇怪普通檔案/test/file2被刪除, 但具有同等地位的目錄檔案/test/dir2卻安然無恙。當執行rm -rf dir2時, 由於存在普通檔案/test/dir2/file, 系統便嘗試先刪除它, 也就相當於修改目錄檔案/test/dir2的內容, 但它的許可權是唯讀, 不能進行修改,也就相當於不能刪除/test/dir2/file, 又由於/test/dir2與/test/dir2/file有依存關係, /test/dir2也就自然會被保留下來。

回顧上乙個操作(mv dir dir2),為什麼目錄檔案/test/dir卻可以被更名呢?由於更名操作並不涉及到自身的內容被修改,修改的只是父目錄的內容,而進行刪除操作時,父目錄的內容固然要被修改,但也同時也要修改自身的內容(因為要刪除該目錄下的檔案),這就不被允許了。如果/test/dir2的許可權是可寫, 或者目錄下沒有子檔案, 那麼它的下場就和/test/file2一樣, 被刪除。

通過前面的幾個操作,可以看到,檔案有這麼幾個關鍵狀態:被讀、被改寫、被改名、被刪除、被執行。然而系統只區分三種許可權,即讀、寫、執行(rwx)。那麼改名與刪除這兩個操作是否系統就置之不理了呢?不是的,系統將這兩個操作歸入被操作檔案的上一級目錄來管理。那麼又是以何種方式來管理的呢?答案是目錄將其下的所有檔案看作是它的內容。這樣,當使用者更名或刪除某個檔案時,執行的是對上一級目錄的寫操作,屬於rwx三種許可權之一的w操作,並沒有逃出系統的管理範圍。

我們的大腦總是活躍的, 能想象出各種各樣的事情, 能把許多簡單的東西組合成很複雜東西, 上面幾個實驗不正是這樣嗎, 象這樣的實驗我們還可以設計出許多, 但做的越多, 腦子似乎越亂(我已經有一點了), 你能記的住這麼多嗎? ok, 我們也許能將它想的簡單一些, 只需注意兩個方面, 一是要清楚目錄的內容是什麼;二是要明白檔案許可權中的w(write)的真正含義。仔細想想, 不是嗎?

補充:

在實驗1中, 如果用vim對file進行編輯, 並且強制儲存(w!), 是可以成功的。這並不是說vim就可以繞開系統的安全機制,而是vim耍了乙個小小的把戲,它是先刪除這個檔案,而後又生成乙個同名的新檔案。但有乙個情況例外,就是當這個檔案有另外乙個硬鏈結檔案存在時,vim會拒絕強制儲存,仔細想想,當進行刪除操作後,檔案還存在,並沒有被真正刪除.

Linux檔案許可權操作的細節問題

1.儘管非擁有者對於該檔案具有rwx的許可權,但是任然不能對其使用這3個命令 chmod 修改許可權 chown 修改擁有者 chgrp 修改所屬組 只有檔案的擁有者才能使用。2.如果當前使用者對於乙個檔案沒有任何的許可權,但是編輯該檔案儲存的時候用wq 強制儲存 的操作是會將該檔案的所有者和所屬組...

Linux中的預設許可權與隱藏許可權(檔案 目錄)

乙個檔案 或目錄 擁有若干個屬性,包括 r w x 等基本屬性,以及是否為目錄 d 與檔案 或連線檔案 l 等屬性。此外,linux還可以設定其他系統安全屬性,使用chattr來設定,以lsattr來檢視,最重要的是可以設定其不可修改的特性,即便是檔案的擁有者都不能進行修改。這個屬性相當重要,尤其是...

linux檔案許可權說明(三)隱藏屬性

linux檔案系統在ext2以後,又擁有了一系列的隱藏屬性,它們的檢視主要依賴lsattr這個命令,其中 r引數用於遞迴顯示目錄及其下內容的隱藏屬性,a用於列出目錄中包含隱藏檔案在內的所有未見的屬性,d引數用於列出目錄本身的屬性。使用方式如圖 隱藏屬性的設定主要用chattr這個命令,它的引數使用方...