linux中除了有常見的讀寫執行三種常見的權限外,還有3中特殊的權限,分別是SUID,SGID,Striky。在瞭解特殊權限以前,先解釋一下安全上下文的概念。linux
安全上下文:進程運行時可以訪問那些資源或文件,不取決與進程文件的屬主屬組,而取決與運行該命令的用戶身份的UID和GID,以該身份獲取各類系統資源。安全
特殊權限位: oop
SUID:對一個可執行文件,不是以發起者身份來獲取資源,而是以可執行文件的屬主身份來執行,也就是說不管誰來執行這個文件,他都有文件全部者的特權。若是全部者是 root 的話,那麼執行人就有超級用戶的特權了。ui
SUID: 運行某程序是,相應進程的屬主是程序文件自身的屬主,而不是啓動者。spa
chmod u+s FILE
chmod u-s FILE
若是FILE自己原來就有執行權限,則顯示爲s;不然顯示Scode
eg.blog
-r--------. 1 root root 865 7月 26 02:17 /etc/shadow -rwxr-xr-x. 1 root root 54048 6月 10 2014 /bin/cat 有一個叫hadoop的用戶,在hadoop用戶下 [hadoop@RedHat ~]$ cat /etc/shadow cat: /etc/shadow: Permission denied cat進程啓動起來之後,是以hadoop的身份運行的。而hadoop沒有訪問/etc/shadow這個文件的權限。因此訪問不到。 [root@RedHat data]# chmod u+s /bin/cat [root@RedHat data]# ll /bin/cat -rwsr-xr-x. 1 root root 54048 Jun 10 2014 /bin/cat 再切換到hadoop用戶下, [hadoop@RedHat ~]$ cat /etc/shadow
root:$6$DotZtyMiripQ.7bt$d171YFkJIRCfK/9G3A1qBLfOo4/ya6zZWxqyU5qEgaqE0hcM89Ig61:16585:0:99999:7::: bin:*:16231:0:99999:7::: daemon:*:16231:0:99999:7::: adm:*:16231:0:99999:7::: lp:*:16231:0:99999:7::: .... 訪問成功,在設置SUID後,cat進程起來之後,不在以hadoop的身份運行,而是以cat文件自身的屬主root來運行,而root用戶對/etc/shadow具備訪問權限。
應用場景:進程
寫一個腳本獲取某些系統的屬性的時候,就必須給SUID權限。 ip
[root@RedHat data]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwdhadoop
普通用戶也要能修改自身的登陸密碼,因此必須給SUID權限。
SGID:對於一個可執行文件,不是以發起者身份來獲取資源,而是以可執行文件的屬組的身份來執行。也就是說該文件具備所屬組的特權,任意存取這個組所能使用的系統資源。若一個目錄設置了SGID,則全部被複制到這個目錄下的文件,其所屬組都會被重設爲和這個目錄同樣,除非在複製時文件時加上-p參數,才能保留原來所屬組的羣組設置。
SGID:運行某程序是,相應進程的屬組是程序文件自身的屬主,而不是啓動者的基本組。
chmod g+s FILE
chmod g-s FILE
eg.
假設有develop, team, hadoop, hbase, hive幾個用戶要在一個公共目錄/tmp/project/下,建一個文件,相互都能訪問,相互並且能編輯。
在root用戶下 [root@RedHat tmp]# mkdir project [root@RedHat tmp]# groupadd developteam [root@RedHat tmp]# chown -R :developteam /tmp/project/ [root@RedHat tmp]# usermod -a -G developteam hadoop [root@RedHat tmp]# usermod -a -G developteam hive [root@RedHat tmp]# usermod -a -G developteam hbase [root@RedHat tmp]# id hadoop uid=1002(hadoop) gid=1002(hadoop) groups=1002(hadoop),1005(development),1007(developteam) hadoop有developteam組權限 在hadoop用戶下 [hadoop@RedHat project]$ touch a.hadoop [hadoop@RedHat project]$ ll -rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop 在hbase用戶下 [hbase@RedHat project]$ touch a.hbase [hbase@RedHat project]$ ll -rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop -rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase 新建的文件a.hadoop a.hbase都是屬於用戶的基本組,相互之間沒有寫權限。 給/tmp/project目錄添加SGID權限 [root@RedHat project]# chmod g+s /tmp/project/ [root@RedHat project]# ls -ld . drwxrwsr-x. 2 root developteam 4096 Jul 26 03:06 . 在hadoop用戶下 [hadoop@RedHat project]$ touch b.hadoop [hadoop@RedHat project]$ ll -rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop -rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase -rw-rw-r--. 1 hadoop developteam 0 7月 26 03:07 b.hadoop 在hbase用戶下 [hbase@RedHat project]$ touch b.hbase [hbase@RedHat project]$ ll -rw-rw-r--. 1 hadoop hadoop 0 7月 26 03:05 a.hadoop -rw-rw-r--. 1 hbase hbase 0 7月 26 03:06 a.hbase -rw-rw-r--. 1 hadoop developteam 0 7月 26 03:07 b.hadoop -rw-rw-r--. 1 hbase developteam 0 7月 26 03:07 b.hbase 發現新建的文件b.hadoop和b.hbase都屬於developteam組。hadoop和hbase能夠訪問修改對方建立的文件。可是這樣又有個缺陷,那就是hadoop和hbase可以刪除對方創建的文件。
STICKY:粘滯位,一般對於目錄而言。一般對於全局公共目錄來講,讓該目錄具備Sticky後,刪除只屬於本身的文件有效(可是仍能編輯修改別人的文件,除了root)。不能根據安全上下文獲取對別人的文件的寫權限。
Sticky:在一個公共目錄,每一個均可以建立文件,刪除本身的文件,但不能刪除別人的文件;
chmod o+t DIRECTORY
chmod o-t DIRECTORY
給/tmp/project目錄添加Sticky權限 [root@RedHat project]# chmod o+t /tmp/project/ [root@RedHat project]# ls -ld . drwxrwsr-t. 2 root developteam 4096 Jul 26 03:15 .
這三位特殊權限組成一個八進制的權限位s,u,t,用二進制表示:
SUID SGID STICKY 最靠前的權限位
000
001
...
110
111
chmod 1755 /backup/test,標紅的表示特殊權限位。
練習:新建一個公司的開發組developteam。有三個成員hadoop hbase hive,在工程目錄/tmp/projct下,能夠建立文件,能夠訪問修改其餘組員建立的文件,能夠
刪除本身建立的文件,可是不能刪除其餘組員建立的文件
useradd hadoop
useradd hbase
useradd hive
groupadd developteam
usermod -a -G developteam hadoop
usermod -a -G developteam hive
usermod -a -G developteam hbae
mkdir /tmp/project/
#chmod g+w /tmp/project
chomd g+s /tmp/project
drwxrwsr-x. 2 root development 4096 6月 29 23:10 /tmp/project/
chomd o+t /tmp/project
drwxrwsr-t. 2 root development 4096 6月 29 23:10 /tmp/project/
su hbase
cd /tmp/project
touch a.habse
ls -l a.habse
-rw-rw-r--. 1 hbase development 0 6月 29 23:10 a.hbase
su hadoop
cd /tmp/project
touch a.hadoop
ls -l a.hadoop
-rw-rw-r--. 1 hadoop development 0 6月 29 23:10 a.hadoop