天天看點

linux之檔案基本權限、隐藏權限、特殊權限set uid、set gid、sticky

linux下檔案的權限可分為基本權限,隐藏的權限和特殊權限三部份,而這些權限在不同的權限位置上表示對不同的使用者群體賦予了相應的權限,使用者群體又分為:檔案的所屬主、檔案的所屬群主、其他使用者

基本權限

用“ls -l”長檔案名的格式檢索install.log這個檔案後出現的“-rw-r--r--”就是表示此檔案的權限。

linux之檔案基本權限、隐藏權限、特殊權限set uid、set gid、sticky

這裡一共有10個字元,這10個字元可以分為4組:

第一組為第一個字元“-”表示檔案是一個普通的檔案檔案,當為“d”時表示為目錄,當為“l”小寫的L時,表示是一個連結檔案,當為“b”時可供存儲的裝置檔案,比如/dev/sda這樣的檔案,當為“c”時,表示是串行端口裝置檔案,如鍵盤、滑鼠裝置。

第二組是三個字元組成的一個組,此組是表示檔案的屬主,也就是檔案的擁有者所具有的權限,第二組,第三組,第四組都是“rwx”的一個組合。這裡的“rw-”表示檔案擁有者對此檔案具有可讀,可寫的權限,最後一位是可執行“x”的權限位,但這裡為“-”,則表示屬主對檔案沒有可執行的權限。

第三組表示檔案的所屬組擁有的權限,一個組中的成員可以有多個,linux下當建立一個使用者時,會預設建立一個同使用者名的基本組,而一個使用者除了基本組外還可以附加在一個或多個組上,那這些組就成了這個使用者的附加組。

第四組表示除了檔案擁有者和所屬組以外的使用者對此檔案的權限。

example:

/tmp/install.log檔案的屬主,屬組都為gentoo,權限為“640”,在“其他人”的權限位上沒有任何權限,是以不是使用者gentoo,不是組gentoo中的使用者對此檔案沒有檢視此檔案的權限

2. 隐藏權限

隐藏權限是用在一些比較特殊的環境,例如:我們不希望有使用者能修改系統的日志檔案,對日志我們系統隻能往裡增加内容,使用者不應該對日志檔案進行修改,不能删除檔案。再如:系統中有一個檔案對安全性要求非常高,這個檔案一旦建立後,不希望任何使用者對此檔案進行修改,删除此檔案

設定隐藏權限用chattr指令,使用風格與chmod相似,都可以用“+”“-”對檔案裝置相應的權限。

常用格式:

]# chattr [+|-]a filename

]# chattr [+|-]i filename

]# chattr -R {+|-]a 目錄名

]# chattr -R {+|-]i 目錄名

對install.log檔案給予了“a”(append)的權限後,使用者隻能追加内容到此檔案,不能删除、修改此檔案。

給檔案賦予“i”權限後,此檔案不能被修改,重命名,做連結,删除等操作。

3.特殊權限

特殊權限有Set UID,Set GID,sTicky三種類型

當檔案有特殊權限時,特殊權限會占用9位位組中相應的可執行位,把原應該是“x”的這個位強制占用,用相應的“s|S”或“t|T”來代替。賦予檔案特殊權限的方法與賦予檔案基本權限的指令一樣,也是chmod這個指令。

SUID的功能:

1、SUID權限隻能對二進制程式有效

2、執行此二進制檔案的使用者要對此二進制檔案擁有執行權限

3、SUID權限的有效時間是在執行一個二進制開始到指令執行結束

4、二進制程式的執行者在執行時會暫時擁有此程式所有者的權權限

舉例:

在rhel6.0中,/etc/shadow檔案權限如下

這表示除了root使用者外其他的使用者對此檔案是沒有任何權限的,但這個檔案是管理我們使用者密碼的檔案,當一個普通使用者登陸系統後,用passwd這個指令來更改自己密碼時,修改後的密碼不也是要寫入這個shadow檔案嗎?而明明這個檔案沒開放任何權限給普通使用者,普通使用者是怎麼實作密碼的更新呢?我們來看下passwd這個指令的權限

看見了吧,passwd這個二進制程式是擁有SUID權限的,對于“其他使用者”這個檔案也是開放了“x”可執行權限,是以一個普通使用者也能使用這個指令。當一個普通使用者運作passwd這個指令時,這個修改自身密碼的程序會暫時獲得passwd這個檔案的擁有都的權限,也就是root的權限,而root的權限是“rwx”,這裡的“x”被“s”位占用,但可執行權限依然存在,此時,進行的身份切換到了root,這樣當然能對/etc/shadow檔案進行更新,這樣普通使用者也能更換自身的密碼了。

SGID的功能:

"s"位出現在屬主的“x”位上時那檔案就擁有了SUID的權限,當“s”位出現在檔案屬組的“x”位上時,那檔案就擁有了SGID的權限。

1、二進制檔案和目錄都可擁有SGID的權限

2、程式的執行者對該檔案要擁有可執行的權限

3、在執行此程式時,程序會切換到此二進制檔案所組擁有的權限

舉例1:

/usr/bin/locate這個搜尋檔案的指令在執行時會去讀取/var/lib/mlocate/mlocate.db這個資料庫檔案,我們先來看看這兩個檔案的權限

mlocate.db這個檔案隻有屬主與屬組才有讀取的權限,當一個不是以slocate這個為組的普通使用者使用locage這個指令時,發現在屬組上擁有“s”位,那這個程序會切換到以組slocat的使用者來運作,當這個程序去讀取mlocate.db這個檔案時,發現程序是以組slocate的權限運作的,具有對檔案有讀取的權限,是以指令locate指令能正常讀取locate.db裡的資料。

當一個目錄具有SGID權限時,那此目錄具有如下的功能:

1、使用者對此目錄具有rx權限時,使用者可進入此目錄

2、使用者在此目錄上的群組不再是使用者的所屬的組,群組被切換成了目錄的群組

3、若使用者對此目錄具有可寫入的權限,那使用者在此目錄下就可以建立檔案,建立的檔案的屬主是使用者本身,但屬組就成了目錄的所屬群組

舉例2

假設有這樣一個需求:一個研發項目需要兩個部門的人來共同完成,部門A與部門B之間的檔案互相都可以修改,删除,但是其他部門的人沒有通路這些檔案的權限,那這樣我們怎樣來設定環境?

思路:1、建立共同的工作目錄/project,2、設定此目錄的通路權限為770,隻給屬主和屬組開放權限,這樣就拒絕了其他人通路此目錄,這樣隻要兩部門的使用者在進入這個目錄後能切換到屬組擁有的權限,那不是就有了“rwx”的權限了,這不就是SGID的作用所在?

那有沒有這樣一種思路一樣可以實作以上的要求?目錄/project同樣屬組為project組,我們在建立使用者gentoo與使用者slackware時把自己的基本組都指向project組,如果這樣這兩個使用者不是現時都具有project組的權限了?把上面做的操作全部删除後再做這個實驗。

此種方法中然也能達到要求,但是改變了預設的umask值,還是建議采用SGID,有SGID這樣好的工具為什麼不用呢?這個實驗颠覆了我以前一直有的想法,那就是一個基本組隻能屬于一個使用者,但就是這樣的,這裡我不是把gentoo與slackware兩個使用者的基本組都指向了project組了嗎?

sTicky的功能:

1、隻對目錄生效,當使用者對此目錄有rwx權限,也就是使用者對在此目錄下可建立,删除,修改檔案

2、使用者在此目錄下建立的檔案,隻有使用者本身與root使用者才能對檔案進行删除、修改操作。

看看/tmp這個目錄吧

最後整理一下SUID、SGID、STICKY的權限設定方法,既然是對檔案賦予權限,當然是用chmod指令,在基本的9位位組上,那幾個數字怎麼來定義的呢,比如預設建立目錄時,權限為“755”,第一個數字“7”代表屬主的權限,第二個數字“5”代表屬組的權限,第三個數字“5”代表其他人使用者的權限,轉換為相應的二進制後為

111 101 101 ----->755

rwx r-x r-x ----->有相應的權限就用“1”示,沒有權限就用0來表示

那我們的特殊權限怎麼表示呢,我們可以這樣了解,特殊權限位也是單獨的三位位組

111 -->7

sst -->表示屬主加上s權限,屬組加上s權限,其他使用者擁有了t的權限

11o -->6

ss- -->表示檔案擁有了SUID與SGID的權限

100 -->4

s-- -->表示檔案擁有了SUID的權限

使用舉例:

這裡出現了大“S”表示檔案在,因為特殊權限是占用“x”的位置,但這裡原有檔案沒有可執行的權限,是以加上特殊權限後“S”就表示原檔案沒有執行權限,與“s”做差別。

繼續閱讀