linux系統中文件的特殊權限
在上篇博客中敘述linux系統中文件的基本屬性,見http://vinsent.blog.51cto.com/13116656/1951574,這篇給大家帶來linux系統文件的特殊權限,包括SUID、SGID、Sticky(粘滯位)。
一、安全上下文
安全上下文指的是一類定義某個進程允許做什麽的許可和權限的集合。安全上下文的概念範圍很廣範,權限、特權、訪問令牌、完整性等級等等都包含在其中。這裏只簡要說說linux系統對文件的安全控制:
(1)進程有屬主和屬組,文件有屬主和屬組
(2)任何一個可執行程序文件能不能啟動為進程;取決於發起者對程序文件是否有執行權限
(3)啟動為進程之後,其進程的屬主為發起者,進程的屬組為發起者所屬得組
(4)進程訪問文件時的權限 ,取決於進程的發起者
進程的發起者,同文件的屬主:則使用文件屬性權限
進程的發起者,屬於文件的屬組;則使用文件屬組權限
使用的文件"其他"權限
二、文件的特殊權限
1、SUID
SUID的權限其實的相關性非常大,對普通文件和目錄幾乎沒有什麽用。SUID主要作用在二進制可執行文件上,且作用在文件的屬主位,表現為小 S ,例如我們所熟悉的可執行程序 passwd:
[[email protected] ~]# ll `which passwd` -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd #我們發現在屬主位有s存在,這就代表具有SUID權限
SUID-特點
SUID權限僅對二進制程序有效
執行者對於該程序需要具有 x 可執行權限
本權限僅在執行該程序的過程中有效
執行者具有該程序的所有者的權限
淺析:當其他用戶在執行二進制可執行程序時,一旦該程序加了SUID權限,那麽在執行該程序時將繼承原二進制可執行程序屬主的權限,上例中可執行程序/usr/bin/passwd的屬主和屬組均是root,如果沒有SUID權限,那麽普通用戶在執行pswwd命令時將無法修改無法修改自己的賬戶密碼,但實際生活中,每個普通用登錄後都可以使用passwd並修改自己的密碼,這就是因為有SUID權限在,普通用戶暫時使用了root的權限。
整個SUID的權限會生效是由於具有該權限的程序被觸發,二我們知道一個程序被觸發會變成進程,所以,執行者可以具有程序所有者的權限就是在該程序變成進程的那個時候,進程的概念在後續的篇章中會詳細說明。這就是為何執行了passwd後就具有root的權限,用戶在觸發passwd後,會取得一個新的得進程與PID。該PID產生是通過SUID給予該PID特殊的權限設置,例如我們使用vincent登錄系統並且執行passwd後,查看進程樹來理解一下!
[[email protected] ~]$ [[email protected] ~]$passwd Changing password for user vincent. Changing password for vincent. (current) UNIX password: # 使用ctrl+z+enter,可以讓passwd後臺執行 [1]+ Stopped passwd [[email protected] ~]$pstree -u #查看進程樹 init─┬─NetworkManager─┬─dhclient │ └─{NetworkManager} ...................# 省略中間部分 ├─sshd─┬─sshd───bash │ └─sshd───bash───su───bash(vincent)─┬─passwd(root) │ └─pstree | ├─trashapplet #我們發現passwd的執行者是root ├─udevd───2*[udevd] ├─udisks-daemon─┬─udisks-daemon │ └─{udisks-daemon} ├─wnck-applet └─wpa_supplicant [[email protected] ~]$
從上面的結果可以發現,執行pstree的權限是vincent這個一般用戶的權限,而passwd的權限是root的權限,而且的的確確,passwd是由vincent這個普通用戶所在bash衍生出來的,但權限不一樣罷了,這樣淺析你對對SUID權限應該有所領悟了。---------------------------------------------------------------------------------------------2、SGID
和SUID相比,SGID不止能作用在二進制可執行程序上,還能作用在目錄上。和SUID不同的是:SUID作用位是文件的屬主位,而SGID作用在文件的屬組上,也表現為s。用戶對文件是否能刪除,取決於該用戶對文件所在的目錄是否有寫權限;默認情況下,用戶創建文件時,文件的屬組是用戶屬組的基本組
[[email protected] ~]#mkdir vincent # 創建vincent目錄 [[email protected] ~]#ll -d vincent/ drwxr-xr-x. 2 root root 4096 Jul 31 10:16 vincent/ # 目錄基本權限文755,沒有SGID權限 [[email protected] ~]#chmod 2755 vincent/ # 給vincent目錄加上SGID權限 [[email protected] ~]#ll -d vincent/ drwxr-sr-x. 2 root root 4096 Jul 31 10:16 vincent/ # 權限添加成功,表現為s [[email protected] ~]#
SGID-特點
作用在二進制文件上,繼承二進制程序所屬組的權限
作用在目錄上,目錄內新建文件的所屬組自動繼承目錄所屬組
# .*.-----------SGID作用在目錄上------------.*.# [[email protected] app]#mkdir vincent # 創建vincent目錄 [[email protected] app]#chmod 2757 vincent/ # 賦予SGID權限,並給其他人賦予rwx權限 [[email protected] app]#useradd t1 # 創建兩個用戶t1,t2 用於後續試驗 [[email protected] app]#useradd t2 [[email protected] app]#groupmems -a t1 -g root # 添加用戶t1,t2的附加組為vincent目錄所在的組 [[email protected] app]#groupmems -a t2 -g root [[email protected] app]#su t1 # 切換到t1用戶 [[email protected] app]$cd vincent/ # 進入到vincent目錄下 [[email protected] vincent]$ls # 查看目錄內容,保證這是個空文件夾,防止幹擾 [[email protected] vincent]$touch t1.{1,2} # 創建兩個文件 [[email protected] vincent]$exit # 退出登錄 exit [[email protected] app]#su t2 # 切換到t2 用戶 [[email protected] app]$cd vincent/ [[email protected] vincent]$touch t2.{1,2} [[email protected] vincent]$ll # 查看目錄下的文件 total 0 -rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.1 # t1用戶的兩個文件屬主是t1 ,屬組是root繼承自父文件夾 -rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.2 -rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.1 # t2用戶的兩個文件,繼承了其父目錄的組 -rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.2 [[email protected] vincent]$\rm -rf t1.1 # t2用戶試著刪除t1的文件,因為定義了別名所以使用的\調用原始命令 [[email protected] vincent]$ll # 查看文件下的目錄發現,真的刪掉了t1用戶的文件, total 0 -rw-rw-r--. 1 t1 root 0 Jul 31 11:15 t1.2 -rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.1 -rw-rw-r--. 1 t2 root 0 Jul 31 11:16 t2.2 [[email protected] vincent]$
說明:給目錄賦予了SGID權限,那麽同組用戶能夠對改組內不同用戶創建的文件進行讀寫刪除操作,不過這依賴於目錄屬組的權限。
# .*.-----------SGID作用在二進制文件上------------.*.# [[email protected] ~]# ll /bin/cat #查看/bin/cat的文件,其屬主屬組都是root並且無SGID權限 -rwxr-xr-x. 1 root root 54048 Jul 23 22:14 /bin/cat [[email protected] ~]# su - test3 # 切換到用戶test3 Last login: Mon Jul 24 02:13:27 HKT 2017 on pts/1 [[email protected] ~]$ cat /tmp/1.txt #使用cat來查看文件,發現權限受限 cat: /tmp/1.txt: Permission denied [[email protected] ~]$ ll /tmp/1.txt -rwxrwx---. 1 root root 15 Jul 24 01:57 /tmp/1.txt [[email protected] ~]$ exit # 退出 logout [[email protected] ~]# chmod 2755 /bin/cat # 給二進制文件/bin/cat附加SGID權限 [[email protected] ~]# su - test3 Last login: Mon Jul 24 02:14:36 HKT 2017 on pts/2 [[email protected] ~]$ cat /tmp/1.txt # 發現能查看了 shishihishihih # 1.txt文件的內容為shishihishihih
說明:給二進制附加SGID權限,如果沒有SUID存在,其他用戶在使用該二進制可執行程序時將繼承其組的權限,上例中,cat程序就是如此,繼承了其組root的權限,所以普通用戶能夠使用。如果上例還不能讓你明白,那麽你用普通用戶查看/etc/shadow文件,發現不能查看(這是密碼文件,普通用戶當然不讓你看),但當你給cat命令加上SGID權限之後,你會發現普通用戶竟然能查看了,這就是在執行程序時使用了cat所在組(root)的權限,root用戶幾乎不受權限的控制。---------------------------------------------------------------------------------------------3、Sticky(粘滯位)
我們都知道如果一個目錄的權限是777那麽所有用戶都能對該目錄下的文件進行查看,刪除等操作,那麽這樣就存在一個隱患,張三用戶一生氣將李四用戶寫的程序文件全刪除了,這樣子李四幾個月的辛苦就白費了。基於這種考量,linux系統中加入了Sticky這種權限。
Sticky-特點
只對目錄有效
對於一個多人可寫的目錄,如果設置了sticky位。則每個用戶僅能刪除自己的文件,不能刪除別人的文件除了root(root人家可是天神)
[[email protected] ~]#cd /app # 進入到/app目錄 [[email protected] app]#chmod 777 vincent/ #設置vincent目錄的權限為777,便於後續試驗環境,生產中不建議給777權限 [[email protected] app]#touch vincent/1 # root用戶創建2個文件1,2 [[email protected] app]#touch vincent/2 [[email protected] app]#su t1 #切換到t1用戶並創建2個文件3,4 [[email protected] app]$touch vincent/3 [[email protected] app]$touch vincent/4 [[email protected] app]$exit exit [[email protected] app]#su t2 # 切換到t2用戶並創建兩個文件5,6 [[email protected] app]$touch vincent/5 [[email protected] app]$touch vincent/6 [[email protected] app]$ll vincent/ # 查看vincent下的文件,有6個文件 total 0 -rw-r--r--. 1 root root 0 Jul 31 12:46 1 -rw-r--r--. 1 root root 0 Jul 31 12:46 2 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:46 3 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:47 4 -rw-rw-r--. 1 t2 t2 0 Jul 31 12:47 5 -rw-rw-r--. 1 t2 t2 0 Jul 31 12:47 6 [[email protected] app]$\rm -rf 1 # 讓t2用戶刪除root創建的文件1,發現盡然沒報錯,估計是刪了 [[email protected] app]$exit exit [[email protected] app]#su t1 [[email protected] app]$cd vincent/ [[email protected] vincent]$\rm -rf 5 #切換到t1用戶,並刪除t2用戶創建的文件5,也沒報錯 [[email protected] vincent]$ll # 查看vincent目錄下的文件,果然1,5都被刪除了,太可怕了,普通用戶能刪root創建的文件 total 0 -rw-r--r--. 1 root root 0 Jul 31 12:46 2 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:46 3 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:47 4 -rw-rw-r--. 1 t2 t2 0 Jul 31 12:47 6 [[email protected] vincent]$
通過上例我們發現只要目錄的其他人有讀寫執行權限,那麽其他用戶都能對該目錄下的文件執行刪除操作。這太可怕了,一個匿名用戶盡然能隨意刪除別人的文件。那麽我們給vincent目錄加上Sticky位,再來看看還能如此"橫行"麽?
[[email protected] app]# [[email protected] app]#chmod o+t vincent/ # 給vincent目錄加上Sticky權限,表現為t [[email protected] app]#ll -d vincent/ drwxrwxrwt. 2 root root 4096 Jul 31 12:49 vincent/ [[email protected] app]#ll vincent/ # 查看vincent目錄下還有那些文件 -rw-r--r--. 1 root root 8 Jul 31 12:46 2 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:46 3 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:47 4 -rw-rw-r--. 1 t2 t2 0 Jul 31 12:47 6 [[email protected] app]#su t1 # 且換到t1用戶 [[email protected] app]$cd vincent/ [[email protected] vincent]$\rm -rf 2 # 試著刪除root用戶創建的文件 rm: cannot remove `2‘: Operation not permitted # 提示錯誤:操作受限 [[email protected] vincent]$exit exit [[email protected] app]#su t2 # 切換到t2用戶 [[email protected] app]$\rm -rf 6 # 刪除自己創建的文件6 ,結果不報錯,說明刪掉了 [[email protected] app]$ ll vincent/ # 再次查看文件,發現文件6被刪除了 -rw-r--r--. 1 root root 8 Jul 31 12:46 2 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:46 3 -rw-rw-r--. 1 t1 t1 0 Jul 31 12:47 4 [[email protected] vincent]$cat 2 # 試著查看root創建的文件2,發現可以,這是因為2的其他者位有r權限 wwwwwww [[email protected] vincent]$echo eeee >> 2 # 試著給文件2追加信息,發現操作受限,因為2的其他者位沒有w權限 bash: 2: Permission denied [[email protected] vincent]$
說明:通過上面的實例我們發現,當一個文件被賦予Sticky權限時,不同的用戶只能對該目錄下自己的文件其有權限,不能刪除其他用戶創建的文件;至於是否能對其他用戶的文件進行讀寫,這要看創建的文件對其他人是否有讀寫權限,註意通常寫操作需要配合執行權限來工作。
關於linux系統中文件的權限,基本讀寫執行權限在加上特殊權限SUID、SGID、Sticky也給大家聊了,還有一個擴展權限ACL(訪問控制列表),過兩天將帶給大家,敬請期待!
謝謝您的閱讀!!若有疑問可留言
本文出自 “vincent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1953889
linux系統中文件的特殊權限