
首先我們要了解,在Linux中啟動一個程式或者啟動一個程序是需要有使用者的,一個檔案的存在是要有使用者群組的,一個程序啟動後,它的屬主取決于程序的發起者,比如 我用root使用者啟動了一個 cat 程序,那麼cat 程序的屬主就是root,同理我用user1啟動more程序,more程序對應的屬主就是user1。其次,一個可執行檔案或者一個程式是否能啟動為程序,取決于它的發起者是否擁有可執行的權限。那麼問題來了,普通使用者對檔案有可執行的權限,但是對其配置檔案 或者作用于其他檔案沒有權限怎麼辦?
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。
作者:Linux-1874
出處:https://www.cnblogs.com/qiuhom-1874/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.