1. 程式人生 > >特殊權限 SUID、SGID、Sticky

特殊權限 SUID、SGID、Sticky

linux 權限 suid sgid sticky

. 前提

本篇主要講解SUID, SGID, Sticky三個權限的基本原理和應用.

為什麽要使用特殊權限?

比如系統中假如有超過四類人然而每一類人都需要一種獨特權限.只有三種獨特權限的基礎權限系統就會明顯不夠用.

特殊權限可以擴展系統基礎權限的功能,使得linux權限更加強大靈活.

在理解特殊權限之前,需要先具備幾個關於安全上下文的認知:

前提:進程有屬主和屬組;文件有屬主和屬組;

(1) 任何一個可執行程序文件能不能啟動為進程:取決於發起者對程序文件是否擁有執行權限;

(2) 啟動為進程之後,其進程的屬主為發起者;進程的屬組為發起者所屬的組;

(3) 進程訪問文件時的權限,取決於進程的發起者:

(a)

進程的發起者,同文件的屬主:則應用文件屬主權限;

(b) 進程的發起者,屬於文件的屬組;則應用文件屬組權限;

(c) 應用文件“其它”權限;

. SUID

  1. 權限設定方法:

    1. 字母表示法:

chmod u+s FILE...

chmod u-s FILE...

  1. 數字表示法:

chmod 4755 FILE 添加SUID權限到二進制程序文件(添加到DIR無意義)

在普通三位數字權限位之前,用4代表添加的SUID位

chmod 0xxx .... 可以刪除文件的SUID(無法刪除目錄的SUID)

  1. 文件權限表示:

# ll f1

-rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1

文件屬主的x權限,用s代替.表示被設置了SUID

如果屬主位沒有x權限,會顯示為大寫S,表示有故障(權限無效)

  1. SUID相關說明:

    1. 啟動為進程之後,其進程的屬主為原程序文件的屬主;

    2. 只能作用在二進制程序上,不能作用在腳本上,且設置在目錄上無意義 ;

    3. 執行suid權限的程序時,此用戶將繼承此程序的所有者權限;

  1. SUID工作原理

  1. 環境前提:

    1. linux中有一個二進制程序cat,屬主屬組均為root

    2. linux中有一個系統文件/etc/shadow,屬主屬組均為root

    3. 我們創建一個普通用戶叫user1

    4. user1具有對cat的執行權限

    5. user1 不具有對/etc/shadow的任何權限

  1. 默認情況下

    1. user1執行cat,系統創建一個cat進程,進程的屬主屬組取程序發起者

      ,也就是user1:user1

    2. cat進程訪問/etc/shadow,由於進程屬主屬組是user1:user1,/etc/shadow的屬組屬主都不匹配,所以被拒絕訪問.

  1. cat設置SUID之後

    1. user1執行cat.系統創建一個cat進程,進程的屬主取cat的屬主,屬組取程序發起者,就是root:user1

    2. cat進程訪問/etc/shadow,由於進程屬主是root,/etc/shadow的屬主匹配,所以被允許訪問.

  1. 舉例說明:

passwd命令是linux系統中用來修改密碼的命令.系統中所有用戶都可以使用.而passwd命令改密碼的行為是通過修改/etc/shadow文件來實現.

看一下/etc/shadow的文件權限:

# ll /etc/shadow

----------. 1 root root 1771 Nov 16 17:06 /etc/shadow

可見/etc/shadow對普通用戶沒有任何權限.

所以普通用戶默認無法使用文本編輯器打開或者編輯這個文件.

那為什麽通過passwd這個命令就可以編輯呢?

用ls命令查看passwd命令的源文件信息:

# ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd

我們發現passwd這個程序的屬主位的執行位不是x而是s,說明passwd被設置了特殊權限SUID.

於是普通用戶運行passwd命令,系統創建的passwd進程的屬主由默認為"程序發起者"變為了passwd的屬主.而passwd的屬主是root,所以普通用戶其實是在用root的權限修改/etc/shadow文件.最後passwd命令執行結束,passwd進程被關閉.

  1. 做個實驗:

給命令vim添加SUID,可以讓普通用戶自己把自己變為超級用戶.

看一下vim的原權限

# ll /usr/bin/vim

-rwxr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim

給vim加個SUID

# chmod u+s /usr/bin/vim

權限變為

-rwsr-xr-x. 1 root root 2289640 Aug 2 08:45 /usr/bin/vim

現在用普通用戶登錄

su quintin

嘗試使用vim編輯系統賬戶文件/etc/passwd

$ vim /etc/passwd

找到自己的用戶名一行

技術分享圖片

修改第三列自己的uid為0

root的uid不用改.

然後保存,提示只讀文件,使用w!強制保存,成功!

技術分享圖片技術分享圖片

我們知道普通用戶quintin對vim是有執行權限的,而對/etc/passwd則沒有編輯權限.

通常情況下quintin啟動vim後,系統會創建一個以當前用戶quintin為屬主屬組的vim進程,此時vim進程的屬主屬組為quintin:quintin,由於無論是屬主還是屬組都不具有對/etc/passwd的編輯權限,所以這個vim進程無權編輯/etc/passwd.

而給/usr/bin/vim設置了SUID之後,quintin或任何用戶啟動vim程序時,系統創建的vim進程的屬主則是取了/usr/bin/vim這個程序文件自身的屬主root,所以此時vim進程的屬主屬組為root:quintin. 系統檢查發現正好匹配了/etc/passwd的屬主,於是放行vim進程.

其他文本編輯器同理.

退出vim並重新登陸quintin帳戶

這時發現命令提示符已完全變為root,而且系統認為我就是root

技術分享圖片技術分享圖片

因為linux只通過uid判斷超級管理員,而quintin帳戶把自己的uid變成了超級管理員一樣的0,所以重新登陸之後,quintin具有了root的身份.

測試:

找一個屬主屬組都為root且other位無w的文件

# ll /app/f11

-rw-r--r--. 1 root root 0 Nov 17 20:18 f11

改個名字

# mv f11 f1

成功.

三. SGID

  1. 權限設定方法:

    1. 字母表示法

chmod g+s DIR/FILE...

chmod g-s DIR/FILE...

  1. 數字表示法 :

chmod 2755 DIR/FILE 添加SGID到目錄或文件

在普通數字權限位前,用2代表添加SGID位

chmod 0755 DIR/FILE 刪除文件的SGID,(目錄不受影響)

chmod 755 DIR/FILE 同上

  1. 文件權限表示:

# ll /app/f1

-rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1

文件屬組的x權限,用s代替.表示被設置了SGID

如果屬組位沒有x權限,會顯示為大寫S,表示有故障(權限無效)

  1. SGID相關說明:

    1. 作用在二進制程序上時:

執行sgid權限的程序時,此用戶將繼承此程序的所屬組權限

  1. 作用於目錄上時:

此文件夾下所有用戶新建文件都自動繼承此目錄的用戶組.

  1. SGID實例:

    1. 作用在二進制程序上時,原理同SUID,只是由user位變為group.

    2. 作用於目錄上時演示:

普通帳戶quintin/tmp中創建一個目錄叫quintindir,添加SGID.權限777

$ chmod 2777 quintindir/

$ ll -d quintindir/

drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/

切換到普通用戶user1,在quintindir目錄中創建一個文件和一個目錄

$ touch user1file

$ mkdir user1dir

$ ll

-rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file

drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir

結果顯示,user1在quintindir目錄下創建的文件和目錄都自動繼承了quintindir的屬組

而且新目錄的權限也繼承了SGID.

所以設定了SGID的目錄中的所有新建文件和目錄都會自動屬於quintin組.

. Sticky 粘滯位

  1. 權限設定方法:

    1. 字母表示法:

chmod o+t DIR...

chmod o-t DIR...

chmod +t DIR...

  1. 數字表示法:

chmod 1755 DIR

在普通數字權限位前,用1代表添加Sticky位

  1. 文件權限表示:

# ll -d tmp

drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp

文件other位的x權限,用t代替.表示被設置了Sticky

如果other位沒有x權限,會顯示為大寫T,表示有故障(權限無效)

  1. Sticky相關說明:

    1. 對於一個多人可寫的目錄,如果設置了sticky,則每個用戶僅能刪除和改名自己的文件或目錄

    2. 只能作用在目錄上.普通文件設置無意義,且會被linux內核忽略

    3. 用戶在設置Sticky權限的目錄下新建的目錄不會自動繼承Sticky權限

  1. Sticky實例:

  1. 目的:

我希望在系統中創建一個很多用戶可以共同使用的目錄,但是要求用戶之間不能互相刪除改變對方的文件.

  1. 實現:

root用戶先創建一個777權限目錄/app/tmp

普通用戶quintin和wang分別在其中創建幾個文件和目錄

技術分享圖片

這時候有個問題,就是目錄中的任何用戶都可以隨意刪除其他人的文件.

所以root要給/tmp這個文件夾設定一個Sticky位.

# chmod 1777 tmp

# ll -d tmp

drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp

設定完畢可見目錄tmp的other權限中的x位已經顯示為t.說明已設定成功.

  1. 測試

切換到quintin用戶,進入/app/tmp目錄

嘗試刪除或改名用戶wang的文件或目錄

改名文件

[quintin@centos7 /app/tmp]$ mv wangf1 aaa

mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted

改名目錄

[quintin@centos7 /app/tmp]$ mv wangd1 bbb

mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted

移動文件

[quintin@centos7 /app/tmp]$ mv wangf1 qdir1/

mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted

刪除文件

[quintin@centos7 /app/tmp]$ rm -f wangf1

rm: cannot remove ‘wangf1’: Operation not permitted

刪除目錄

[quintin@centos7 /app/tmp]$ rm -f wangf1

rm: cannot remove ‘wangf1’: Operation not permitted

以上所有操作均提示Operation not permitted,表Sticky權限已發揮作用.

  1. 提示:

普通用戶在設定了Sticky位的目錄下創建的子目錄不會繼承這個Sticky權限,所以要註意設定好自己目錄的權限.

. 總結:

  1. 作用範圍及功能:

    1. SUID:作用於文件(二進制程序)

此用戶將繼承此程序的所有者權限

  1. SGID:作用於文件(二進制程序)和目錄

    1. 對於文件:

此用戶將繼承此程序的所屬組權限.

  1. 對於目錄:

此文件夾下所有用戶新建文件都自動繼承此目錄的用戶組.

  1. Sticky:作用於目錄

設定後,目錄中的用戶只能刪除、移動或改名自己的文件或目錄


二進制文件

目錄

SUID

此用戶將繼承此程序的所有者權限

無意義

SGID

此用戶將繼承此程序的所屬組權限

此目錄下所有用戶新建文件都自動繼承此目錄的用戶組

Sticky

無意義

目錄中每個用戶僅能刪除、移動或改名自己的文件或目錄

  1. 添加權限方法及註意事項:

  1. 字母權限法很靈活,無論目錄還是文件都可以隨意添加刪除超級權限

chmod u+s ... 添加SUID

chmod g+s ... 添加SGID

chmod +s ...同時添加SUID和SGID

chmod -s ...同時刪除SUID和SGID

chmod o+t ...添加Sticky

chmod +t ...同上

  1. 數字權限表示法添加/刪除時:

    1. 數字權限法可以同時刪除文件的所有三種超級權限

chmod 0755 FILE

chmod 755 FILE

  1. 數字權限法只能刪除目錄的Sticky.不能刪除目錄的SUIDSGID.

  2. 數字權限法每次只能設置一種超級權限.添加權限時:

對於文件,會刪除掉原有的其他超級權限.

對於目錄,添加SUID或SGID時,Sticky會被刪除.

  1. 所有表示為大寫字母的權限均為無效(故障)權限,因為缺少了相應的x權限.

  1. 幾個權限位映射參考:

SUID: user, 占據屬主的執行權限位;

s: 屬主擁有x權限

S:屬主沒有x權限

SGID: group, 占據group的執行權限位;

s: group擁有x權限

S:group沒有x權限

Sticky: other, 占據ohter的執行權限位;

t: other擁有x權限

T:other沒有x權限


特殊權限 SUID、SGID、Sticky