一、SUID shell
首先咱們要了解,在Linux中啓動一個程序或者啓動一個進程是須要有用戶的,一個文件的存在是要有用戶和組的,一個進程啓動後,它的屬主取決於進程的發起者,好比 我用root用戶啓動了一個 cat 進程,那麼cat 進程的屬主就是root,同理我用user1啓動more進程,more進程對應的屬主就是user1。其次,一個可執行文件或者一個程序是否能啓動爲進程,取決於它的發起者是否擁有可執行的權限。那麼問題來了,普通用戶對文件有可執行的權限,可是對其配置文件 或者做用於其餘文件沒有權限怎麼辦?好比普通用戶要修改本身的密碼,修改密碼就要用到passwd這個命令對吧,可是passwd這個命令它會把密碼寫到/etc/shadow,可是/etc/shadow這個文件只有root用戶可以寫,那麼普通用戶怎麼把本身的密碼寫到/etc/shadow裏的呢?這時咱們就要說下SUID的做用了。SUID它主要做用是設置了suid的可執行二進制文件在啓動爲進程後,其進程的屬主不在是啓動二進制可執行文件的用戶,而是二進制文件自己的屬主,也就是說設置了SUID權限的可執行二進制文件在啓動爲進程後,其進程屬主不在取決於發起者了,也就是說無論那個用戶去啓動它 ,其進程都是其可執行二進制文件的屬主。好比咱們給/bin/cat 設置SUID後 無論那個用戶均可以用cat查看root有查看權限,而普通用戶沒有查看權限的文件,也就說當其餘用戶執行cat這個二進制可執行文件時,系統會默認把權限識別成root用戶,當普通用戶用cat去查看一個本身沒有查看權限的文件時,系統會認爲是root在查看這個文件,全部當咱們給/bin/cat設置了SUID後,其餘用戶在用cat命令時 都會臨時變成root用戶。也就是由於這樣 普通用戶就能夠纔看本身自己沒有查看權限的文件。安全
設置SUID的文件要求有以下幾點:bash
SUID設置方法:ui
字母設置方式:chmod u+s file spa
取消SUID:chmod u-s file blog
數字設置方式:chmod 4755 在普通三位數字權限位以前,用4表明添加的SUID位繼承
取消SUID:chmod 0755進程
作個小驗證,就拿咱們上面說的給cat命令對應的可執行二進制文件設置SUIDrem
[user2@test project]$ whoami user2 [user2@test project]$ ll /etc/shadow ---------- 1 root root 1043 Oct 23 13:41 /etc/shadow [user2@test project]$ cat /etc/shadow cat: /etc/shadow: Permission denied
提示:咱們能夠看到在沒有設置SUID的狀況下 ,普通用戶更不就不能對/etc/shadow 進行查看的it
給cat 設置SUID
[root@test project]# whoami root [root@test project]# which cat /bin/cat [root@test project]# ll /bin/cat -rwxr-xr-x. 1 root root 47976 Nov 22 2013 /bin/cat [root@test project]# chmod u+s /bin/cat [root@test project]# ll /bin/cat -rwsr-xr-x. 1 root root 47976 Nov 22 2013 /bin/cat
提示:給文件設置suid必須是文件的屬主,這裏cat是root全部要用root去設置SUID,設置了suid後其文件對應的屬主可執行爲位上的x會變成s,若是是大寫S表示文件沒有可執行權限,設置SUID無效。
用普通用戶去使用cat命令查看普通用戶沒有查看權限的文件
[user2@test project]$ whoami user2 [user2@test project]$ ll /etc/shadow ---------- 1 root root 1043 Oct 23 13:41 /etc/shadow [user2@test project]$ cat /etc/shadow root:$6$ue2dy8rF$pW5rghiycQ1MFycSq0jjRfgb2wIXFm9Jl0h9hqNWfHOCX8NdHXW1HpN0Eb2q40Aw/kmQAUldxZsVQD504iv6c.:17685:0:99999:7::: bin:*:15980:0:99999:7::: daemon:*:15980:0:99999:7::: adm:*:15980:0:99999:7::: lp:*:15980:0:99999:7::: sync:*:15980:0:99999:7::: shutdown:*:15980:0:99999:7::: halt:*:15980:0:99999:7::: mail:*:15980:0:99999:7::: uucp:*:15980:0:99999:7::: operator:*:15980:0:99999:7::: 省略部份內容...
二、SGID
SGID屬性同SUID同樣,只是SUID做用於屬主,而SGID做用於屬組,SGID做用在二進制程序上時,執行權限的程序時此用戶將繼承此程序的所屬組權限,做用於目錄上時,此文件夾下全部用戶新建文件都自動繼承此目錄的用戶組。一樣在設置SGID的文件後,其組權限位上的可執行權限x會變成s,若是變成了S 說明其組權限位上沒有可執行權限,設置SGID無效。
不設置SGID普通用戶查看無權限查看的文件(仍是以上面cat的例子)
[root@test project]# ll total 4 ----r----- 1 root root 16 Oct 23 16:13 a.root [root@test project]# ll /bin/cat -rwxr-xr-x. 1 root root 47976 Nov 22 2013 /bin/cat [root@test project]# whoami root [root@test project]# cat a.root iamroot iamroot [root@test project]# su - user1 [user1@test ~]$ whoami user1 [user1@test ~]$ cd /tmp/project/ [user1@test project]$ ll total 4 ----r----- 1 root root 16 Oct 23 16:13 a.root [user1@test project]$ cat a.root cat: a.root: Permission denied [user1@test project]$
設置SGID後普通用戶纔看本身沒有查看權限的文件
[user1@test project]$ su - Password: [root@test ~]# whoami root [root@test ~]# ll /bin/cat -rwxr-xr-x. 1 root root 47976 Nov 22 2013 /bin/cat [root@test ~]# chmod g+s /bin/cat [root@test ~]# ll /bin/cat -rwxr-sr-x. 1 root root 47976 Nov 22 2013 /bin/cat [root@test ~]# su - user1 [user1@test ~]$ cd /tmp/project/ [user1@test project]$ ll total 4 ----r----- 1 root root 16 Oct 23 16:13 a.root [user1@test project]$ whoami user1 [user1@test project]$ cat a.root iamroot iamroot
提示:設置SGID的方式和SUID的方式同樣 只是SUID做用於user位,SGID做用於group。因此chmod g+s file 或者chmod g-s 數字表示法是 chmod 2755 file 在普通三位數字權限位以前,用2表明添加的SGID位
SGID做用於目錄上時,此文件夾下全部用戶新建文件都自動繼承此目錄的用戶組
在不設置SGID的目錄下建立文件,文件的屬主和屬組 默認是該用戶。
[user1@test project]$ ll -d drwxrwxr-x 2 root test 4096 Oct 23 19:53 . [user1@test project]$ mkdir test [user1@test project]$ touch user1 [user1@test project]$ ll total 8 ----r----- 1 root root 16 Oct 23 16:13 a.root drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test -rw-rw-r-- 1 user1 user1 0 Oct 23 19:54 user1
提示:能夠看出在沒有設置SGID的狀況下,在其目錄下建立文件或目錄時,文件和目錄默認屬組是其建立者,它不繼承其父目錄的屬組。
給目錄設置SGID,而後在其目錄下建立文件和目錄,其文件和目錄繼承父目錄屬組權限
[user1@test project]$ ll -d . drwxrwxr-x 3 root test 4096 Oct 23 19:54 . [user1@test project]$ su - root Password: [root@test ~]# whoami root [root@test ~]# cd /tmp/project/ [root@test project]# ll -d drwxrwxr-x 3 root test 4096 Oct 23 19:54 . [root@test project]# chmod g+s /tmp/project/ [root@test project]# ll /tmp/project/ -d drwxrwsr-x 3 root test 4096 Oct 23 19:54 /tmp/project/ [root@test project]# mkdir test1 [root@test project]# touch user11 [root@test project]# ll total 12 ----r----- 1 root root 16 Oct 23 16:13 a.root drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test drwxr-sr-x 2 root test 4096 Oct 23 19:59 test1 -rw-rw-r-- 1 user1 user1 0 Oct 23 19:54 user1 -rw-r--r-- 1 root test 0 Oct 23 19:59 user11 [root@test project]#
提示:從上面的示例能夠得出,在咱們設置SGID後,其組權限位上的執行權限x變成了s(小寫),他和SUID同樣,若是其組權限位上的可執行權限位變成了大寫的S ,表示其目錄組權限位上原來是沒有執行權限,固然咱們設置的SGID也是無效的。其次就是咱們給目錄設置了SGID後,在其目錄下建立文件或目錄都會繼承其父目錄的組權限,也就是說我父目錄設置了SGID,其組權限對應的是test,那麼其餘用戶在其目錄下建立文件都屬於test這個組裏的,同時擁有test組權限。
3.Sticky
前面咱們說了SUID和SGID,接下來咱們再說下Sticky,這個權限的主要做用是在一個公共目錄,每一個用戶均可以建立文件,刪除本身的文件,可是不能刪除別人的文件。這個權限只能用於目錄,當某個目錄擁有其Sticky權限 ,則其目錄下的文件和目錄只有root和其擁有者刪除,其餘用戶不能刪除,也就是說用戶只能刪除其本身自己屬主的文件,不能刪除其餘屬主的文件。若是一個目錄設置了其sticky權限,則其目錄其餘用戶組的執行權限x會變成t(小寫),它和SUID、SGID同樣若是對應位是位上的可執行x變成了大寫T ,那麼表示其目錄其餘用戶位上沒有可執行權限,固然設置的Sticky就無效。固然設置方法和SUID、SGID同樣 都是用chmod命令來設置,只是Sticky做用於目錄的其餘用戶位,字母設置方法 chmod o+t dir ,取消 chmod o-t dir 數字設置方法:chmod 1755(1表示Sticky) 固然取消就把其數字改寫成0.
不設置Sticky,刪除目錄裏文件
[root@test ~]# su - user1 [user1@test ~]$ whoami user1 [user1@test ~]$ cd /tmp/project/ [user1@test project]$ ll -d drwxrwsr-x 4 root test 4096 Oct 23 19:59 . [user1@test project]$ ll total 12 ----r----- 1 root root 16 Oct 23 16:13 a.root drwxrwxr-x 2 user1 user1 4096 Oct 23 19:53 test drwxr-sr-x 2 root test 4096 Oct 23 19:59 test1 -rw-rw-r-- 1 user1 user1 0 Oct 23 19:54 user1 -rw-r--r-- 1 root test 0 Oct 23 19:59 user11 [user1@test project]$ rm -fr * [user1@test project]$ ll total 0 [user1@test project]$
提示:能夠看出咱們普通用戶是能夠隨意刪除去不是本用戶屬主的文件,這樣會致使一個問題,就是在一個公共的目錄下,每一個用戶的文件不安全,由於每一個人均可以去刪除。
設置Sticky,刪除其下的目錄和文件
[user1@test project]$ mkdir test [user1@test project]$ touch user1 [user1@test project]$ su - Password: [root@test ~]# cd /tmp/project/ [root@test project]# mkdir root1 [root@test project]# touch root12 [root@test project]# ll total 8 drwxr-sr-x 2 root test 4096 Oct 23 20:27 root1 -rw-r--r-- 1 root test 0 Oct 23 20:27 root12 drwxrwsr-x 2 user1 test 4096 Oct 23 20:26 test -rw-rw-r-- 1 user1 test 0 Oct 23 20:26 user1 [root@test project]# ll -d drwxrwsr-x 4 root test 4096 Oct 23 20:27 . [root@test project]# chmod o+t . [root@test project]# ll -d drwxrwsr-t 4 root test 4096 Oct 23 20:27 . [root@test project]# su - user1 [user1@test ~]$ cd /tmp/project/ [user1@test project]$ ll total 8 drwxr-sr-x 2 root test 4096 Oct 23 20:27 root1 -rw-r--r-- 1 root test 0 Oct 23 20:27 root12 drwxrwsr-x 2 user1 test 4096 Oct 23 20:26 test -rw-rw-r-- 1 user1 test 0 Oct 23 20:26 user1 [user1@test project]$ rm -fr root* rm: cannot remove `root1': Operation not permitted rm: cannot remove `root12': Operation not permitted [user1@test project]$
提示:能夠看出當咱們給公共目錄設置了Sticky屬性後,其普通用戶是不能刪除其屬主不是本身自己的文件。Sticky屬性只針對目錄,對其文件不生效。
經過以上的示例得出幾點:
一、在給文件或目錄設置特殊權限時,其文件對應位上必須擁有可執行權限,不然設置特殊全無效。若是對應位上沒有可執行權限,設置了特殊權限會在對應位上顯示大寫的字母,表示其特殊權限無效。
二、SUID只能做用於可執行的二進制文件,對目錄無效。SGID可做用於可執行二進制文件和目錄,Sticky只能做用於目錄,對文件無效。
三、都是用chmod 進行受權。對於SUID和SGID都是+-s ,對於Sticky是+-t ,其中SUDI對應user位,SGID對應group位,Sticky對應other位,數字表示法,4表示SUID,2表示SGID,1表示Sticky。