1、SUID
首先我們要了解,在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的文件要求有如下幾點:
- SUID只對可執行的二進制文件起作用,shell腳本設置后不生效。
- 如果設置了其suid后,其屬主位的可以執行權限x會變成s(小寫),如果是大寫S 那么說設置的文件沒有可執行權限,設置的SUID無效。
- SUID對目錄設置無意義。
SUID設置方法:
字母設置方式:chmod u+s file
取消SUID:chmod u-s file
數字設置方式:chmod 4755 在普通三位數字權限位之前,用4代表添加的SUID位
取消SUID:chmod 0755
做個小驗證,就拿我們上面說的給cat命令對應的可執行二進制文件設置SUID
[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 進行查看的
給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::: 省略部分內容...
2、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屬性只針對目錄,對其文件不生效。
通過以上的示例得出幾點:
1、在給文件或目錄設置特殊權限時,其文件對應位上必須擁有可執行權限,否則設置特殊全無效。如果對應位上沒有可執行權限,設置了特殊權限會在對應位上顯示大寫的字母,表示其特殊權限無效。
2、SUID只能作用於可執行的二進制文件,對目錄無效。SGID可作用於可執行二進制文件和目錄,Sticky只能作用於目錄,對文件無效。
3、都是用chmod 進行授權。對於SUID和SGID都是+-s ,對於Sticky是+-t ,其中SUDI對應user位,SGID對應group位,Sticky對應other位,數字表示法,4表示SUID,2表示SGID,1表示Sticky。