1. 程式人生 > >Linux中文件的SUID、SGID、Sticky權限說明

Linux中文件的SUID、SGID、Sticky權限說明

執行權限 之前 style miss mon operator -- 二進制可執行文件 ota

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的文件要求有如下幾點:

  1. SUID只對可執行的二進制文件起作用,shell腳本設置後不生效。
  2. 如果設置了其suid後,其屬主位的可以執行權限x會變成s(小寫),如果是大寫S 那麽說設置的文件沒有可執行權限,設置的SUID無效。
  3. 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中文件的SUID、SGID、Sticky權限說明