Linux上除了有普通的文件權(quán)限(r,w,x)以外,還包括的特殊權(quán)限: suid, sgid, sticky
安全上下文的規(guī)則
一個進程運行時它擁有的文件讀寫權(quán)限來自于啟動它的用戶的權(quán)限,因此進程也是有屬主和屬組的,和文件同理(linux上 一切皆是文件)。規(guī)則如下:
(1) 任何一個可執(zhí)行程序文件能否被啟動為進程, 取決于發(fā)起進程發(fā)起用戶對程序文件是否擁有執(zhí)行權(quán)限(只要ugo其中一個有即可)。
(2) 啟動進程后,進程的屬主為啟動用戶,進程的屬組為進程發(fā)起用戶的屬組。
(3) 進程讀寫文件的權(quán)限取決于進程啟動用戶的權(quán)限:
[1] 進程的發(fā)起用戶和文件的屬主一致,那么適用文件屬主權(quán)限;
[2] 進程的發(fā)起用戶屬于文件的屬組,則適用文件的屬組權(quán)限;
[3] 如果進程的發(fā)起用戶既不是文件的屬主也不屬于文件的屬組,那么適用文件的其他權(quán)限;
總結(jié): 安全上下文規(guī)則定義進程啟動用戶、進程文件、其他文件之間的權(quán)限使用規(guī)則。
SUID
SUID的作用是打破安全上下文的權(quán)限規(guī)則,可以用來提權(quán)或是降權(quán),他的應用規(guī)則如下:
(1) 任何一個可執(zhí)行程序文件能否被啟動為進程, 取決于發(fā)起進程發(fā)起用戶對程序文件是否擁有執(zhí)行權(quán)限(只要ugo其中一個有即可)。
(2) 啟動進程后,進程的屬主為進程文件的屬主。
例如,使用 ll which passwd, 可以看到passwd命令啟動文件的執(zhí)行位權(quán)限是s, 屬主是root, 意思是當passwd啟動時的進程屬主是root,也就是說該命令運行時是以root的身份來運行的。
SUID 權(quán)限設(shè)置
chmod u+s file...
chmod u-s file...
SGID
SGID 的作用對象是一個目錄。 功能和SUID的功能是不一樣的。它的適用規(guī)則如下:
(1) 默認情況下,用戶創(chuàng)建文件(目錄)的屬組為該用戶的基本組,一旦目錄被設(shè)置了SGID權(quán)限,那么對該目錄由寫權(quán)限的用戶在此目錄創(chuàng)建的文件(目錄)所屬組不再屬于基本組,而是該目錄的屬組。
SGID 權(quán)限設(shè)置
chmod g+s dir...
dhmod g-s dir...
sticky
sticky 作用對象是一個目錄。 是對于一個多人可寫的目錄, 如果設(shè)置了sticky權(quán)限, 每個用戶只能刪除自己(屬主)的文件。 從而消除sgud帶來的風險。linux上/tmp,/var/tmp 默認就有該權(quán)限。
sticky 權(quán)限設(shè)置
chmod o+t dir...
chmod o-t dir...
suid,sgid, sticky聯(lián)合權(quán)限設(shè)置
suid,sgid, sticky 和普通權(quán)限一樣,也是映射為一個八進制數(shù)字, 因此也可以使用八進制數(shù)字來設(shè)置
sticky 1
sgid 3
suid 4
示例: chmod 4777 /tmp/a.txt , 第一個是特殊權(quán)限位置
注意:
suid占據(jù)屬主的執(zhí)行權(quán)限位, sgid占據(jù)文件的group權(quán)限位,sticky占據(jù)o的權(quán)限位,
如果特殊權(quán)限顯示S, 表示該文件沒有執(zhí)行權(quán)限,如果是s表示該文件是有執(zhí)行權(quán)限的。