1、檔案特殊許可權說明
Linux系統中,檔案特殊許可權有:SetUID
,SetGID
,Sticky BIT
。
這三個檔案許可權不是太安全,是Linux系統應對特殊情況所準備的許可權,給Linux系統的一些特殊命令提供的。不推薦使用者手動來設定,尤其是SetUID
。這三個選項瞭解一下就好。
我們之前說過umask
值的時候,如下:
[root@localhost ~]# umask
0022
可以看到umask
值是一個4位數,後三位是我們之間講過的基本許可權(讀寫執行),第一位我們之前空過去了,如果忘記了,可以檢視umask
預設許可權文章內容。
現在來說一下,第一位就是定義SetUID,SetGID,Sticky BIT
,這三個特殊許可權的。
還有一點,我們之前說過,普通使用者是可以修改自己的密碼的,但是我們檢視下面兩個檔案,/etc/passwd
檔案和/etc/shadow
檔案。
我們知道/etc/passwd
檔案存放著使用者的資訊,/etc/shadow
檔案中存放著使用者的密碼。但是我們可以看到/etc/shadow
檔案的許可權是000
,也就是說普通使用者對這個檔案是沒有任何操作許可權的,不能看也不能開啟,也不能寫。
但是我們知道密碼的修改,最終是要寫入/etc/shadow
檔案中的。那使用者對/etc/shadow
檔案沒有任何許可權,那怎麼是把密碼最終寫入到/etc/shadow
檔案中呢。
這個奧祕就是passwd
命令中,我們檢視一下passwd
命令。
可以看到所有者許可權中,有一個標識為小s
的許可權,我們之前說的基本許可權,讀寫執行分別為rwx
。這個小s
許可權標識,就是表示該檔案有SetUID
特殊許可權。
為什麼要給passwd
命令設定SetUID
特殊許可權?
/usr/bin/passwd
命令擁有特殊許可權SetUID
,也就是在屬主的許可權位的執行許可權上是小s
。可以這樣來理解它:當一個具有執行許可權的檔案設定SetUID許可權後,使用者執行這個檔案時將以檔案所有者的身份執行。/usr/bin/passwd
命令具有SetUID許可權,所有者為root
(Linux中的命令預設所有者都是root
)
也就是說當普通使用者使用passwd
命令,更改自己密碼的時候,實際是在用passwd
命令所有者root
的身份在執行passwd
命令,root
當然可以將密碼寫入/etc/shadow
檔案(不要忘記root
這個使用者什麼事都可以幹),所以普通使用者也可以修改/etc/shadow
檔案,命令執行完成後該身份也隨之消失。
總結:passwd
命令有SetUID
許可權,為的就是普通使用者修改自己密碼的時候,執行passwd
命令能夠修改/etc/shadow
檔案。
如果取消SetUID
許可權,則普通使用者就不能修改自己的密碼了。
小s
許可權標識在所有者位的時候,特殊許可權位SetUID
。小s
許可權標識在所屬組位的時候,特殊許可權位SetGID
。小t
許可權標識在其他人位的時候,特殊許可權位Sticky BIT
。
2、設定SetUID
(1)只有可以執行的二進位制程式(自己寫的指令碼也可以,只要是執行檔案就行)才能設定SUID
許可權。
如果給非執行檔案賦值SetUID
,如下:
#給abc檔案賦值SetUID許可權
[root@localhost ~]# chmod u+s abc
# g+s是給組賦值SetGID許可權,和基本許可權賦值是一樣的。
檢視abc
檔案資訊,如下圖所示:
可以看到abc
檔案的所有者許可權上有一個大S
許可權。表示abc
檔案沒有什麼作用,因為該檔案不是一個可執行檔案。可以理解成小s = 大s + x(執行許可權)
。
(2)命令執行者要對該程式擁有x(執行)許可權。
檢視passwd
命令,普通使用者對於passwd
命令是屬於其他人許可權組裡。其他人的許可權中是有執行許可權的。
SetUID
許可權是,必須是使用者在執行的時候SetUID
許可權才生效。
(3)命令執行者在執行該程式時獲得該程式檔案屬主的身份(在執行程式的過程中靈魂附體為檔案的屬主)
看上邊一中的《為什麼要給passwd
命令設定SetUID
特殊許可權?》問題,有解釋。
(4)SetUID
許可權只在該程式執行過程中有效,也就是說身份改變只在程式執行過程中有效。
(5)注意:Linux系統自帶的命令賦予了特殊許可權,一般沒有什麼問題,很安全。最危險的是自己寫的指令碼賦予了特殊許可權,不建議手動賦予。
(6)有幾點建議:
- 關鍵目錄應嚴格控制寫許可權。比如
/
、/usr
等; - 使用者的密碼設定要嚴格遵守密碼三原則;
- 對系統中預設應該具有
SetUID
許可權的檔案作一列表,定時檢查有沒有這之外的檔案被設定了SetUID
許可權。
3、檢測SetUID的指令碼
首先找一個全新的Linux系統,沒有被人操作過。通過指令碼在系統中查詢含有SetUID
,SetGID
的檔案。如果統一寫入一個模板檔案。
然後在定期或者不定期的執行該指令碼,存入一個臨時檔案,然後拿這個臨時檔案和上面的模版檔案進行對比,如果臨時檔案和模板檔案是一樣的,證明系統中沒有出現新的SetUID
,SetGID
許可權。如果有不同,則把該內容記錄下來。
[root@localhost ~]# vi suidcheck.sh
#!/bin/bash
# Author:shenchao(E-mail:shenchao@atguigu.com)
# 搜尋系統中所有擁有SUID和SGID的檔案,並儲存到臨時目錄中。
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 做迴圈,每次迴圈取出臨時檔案中的檔名
for i in $(cat /tmp/setuid.check(臨時檔案))
do
grep $i/root/suid.list(模板檔案) >/dev/null
# 比對這個檔名是否在模板檔案中
if["$?"!="0"]
# 如果在,不報錯
then
# 如果檔名不再模板檔案中,則報錯。並把報錯報錯到日誌中
echo "$i isn't in listfile! " >> /root/suid_log_$(date +%F)
fi
done
# 刪除臨時檔案
rm -rf /tmp/setuid.check
以後如果我新給一個檔案賦予了特殊許可權
# 手工給vi加入SUID許可權
[root@localhost ~]# chmod u + s /bin/vi
# 再此執行檢測指令碼,就會把新檢測出來的特殊許可權記錄到一個檔案中。
[root@localhost ~]# ./suidcheck.sh
# 報錯了,vi不再模板檔案中。代表vi被修改了SUID許可權,檢視檔案。
[root@localhost ~]# cat suid-1og-2013-01-20
/bin/vi isn't in listfile!
4、設定SetGID
SetGID
也簡稱為SGID
,SGID
即可以針對檔案生效,也可以針對目錄生效,這和SUID
明顯不同。
(1)針對檔案的作用
針對檔案,SGID
的含義如下:
- 只有可執行的二進位制程式才能設定
SGID
許可權。
同SUID
。 - 命令執行者要對該程式擁有
x
(執行)許可權。
同SUID
。 - 命令執行在執行程式的時候,組身份升級為該程式檔案的屬組。
當普通使用者# 檢視locate命令 [root@localhost ~]# ll /usr/bin/locate -rwx-s--x 1 root slocate 35612 8月 24 2010 /usr/bin/locate # 檢視mlocate.db檔案 [root@localhost ~]# ll /var/lib/mlocate/mlocate.db -rw-r---1 root slocate 1838850 1月 20 04:29 /var/lib/mlocate/mlocate.db
user1
執行locate
命令時,會發生如下事情:/usr/bin/locate
是可執行二進位制程式,可以賦予SGID
,- 執行命令的使用者
user1
,對/usr/bin/locate
命令擁有執行許可權。 - 執行
/usr/bin/locate
命令時,組身份會升級為slocate
組,而slocate
組對
/var/lib/mlocate/mlocate.db
資料庫擁有r
許可權,所以普通使用者可以使用locate
命令查詢mlocate.db
資料庫。 - 命令結束,
user1
使用者的組身份返回為user1
組。
SetGID
許可權同樣只在該程式執行過程中有效,也就是說組身份改變只在程式執行過程中有效。
(2)針對目錄的作用
SGID
針對目錄設定,含義如下:
- 普通使用者必須對此目錄擁有
r
和x
許可權,才能進入此目錄。 - 普通使用者在此目錄中的有效組會變成此目錄的屬組。
- 若普通使用者對此目錄擁有
w
許可權時(也就是其他人許可權是7,普通使用者才能進入目錄),新建的檔案的預設屬組是,這個目錄的屬組。
不明白,看下面的例子。
# 進入臨時目錄做此實驗。因為臨時目錄才允許普通使用者修改
[root@localhost ~]# cd /tmp/
# 建立測試目錄
[root@localhost tmp]# mkdir dtest
# 給測試目錄賦予SGID
[root@localhost tmp]# chmod g+s dtest
# 檢視dtest/目錄,SGID已經生效
[root@localhost tmp]# ll -d dtest/
drwxr-sr-x 2 root `root` 4096 1月 20 06:04 dtest/
# 給測試目錄許可權,讓普通使用者可以寫,
# 注意許可權一定要是777,否則普通使用者進入不了目錄。
[root@localhost tmp]#chmod 777 dtest/
# 切換成普通使用者userl
[root@localhost tmp]# su - user1
# 普通使用者進入測試目錄,
# 如果上邊許可權不設定成777,測試普通使用者進不來。
[user1@localhost ~]$ cd /tmp/dtest/
# 普通使用者建立abc檔案
[user1@localhost dtest]$ touch abc
# abc檔案的預設屬組不再是user1使用者組,而變成了dtest組的屬組root
[user1@localhost dtest]$ ll
總用量0
-rw-rw-r-1 userl `root` 0 1月 20 06:07 abc
總結上邊例子的意思:也就是說,
root
使用者如果給目錄賦予了SGID
特殊許可權。那麼普通使用者(user1
)在該檔案中所建立的檔案的所有組不是user1
,而是這個目錄的所屬組。
提示:
SGID
針對目錄的作用本身沒有風險。就是賦予目錄的許可權是777有些風險,能不用就別用。
關於特殊許可權SGID
的針對目錄的作用,瞭解一下即可。
5、Sticky BIT
Sticky BIT
稱之為粘著位許可權,也簡稱為SBIT
。
SBIT
目前僅針對目錄有效,它的作用如下:
- 粘著位目前只對目錄有效。
- 普通使用者對該目錄擁有
w
和x
許可權(其他人位要有7許可權),即普通使用者可以在此目錄擁有寫入許可權。 - 如果沒有粘著位,因為普通使用者擁有
w
許可權,所以可以刪除此目錄下所有檔案,包括其他使用者建立的檔案。一但賦予了粘著位,除了root
可以刪除所有檔案,普通使用者就算擁有w
許可權,也只能刪除自己建立的檔案,但是不能刪除其他使用者建立的檔案。
說明:
/tmp/
目錄就有SBIT
特殊許可權[root@localhost ~]# ll -d /tmp/ rwxrwxrwt.4 root root 4096 2月 19 12:24 tmp # 看最後的其他人許可權是rwt
root
使用者在/tmp/
目錄建立一個abc
檔案[root@localhost tmp]# touch abc [root@localhost tmp]# ll -rw-r--r-.1 root root 0 2月 19 12:40 abc
user1
使用者在/tmp/
目錄建立一個bcd
檔案[user1@localhost tmp]$ touch bcd [user1@localhost tmp]$ ll 總用量0 -rw-r--r-.1 root root 0 2月 19 12:40 abc -rw-rw-r-.1 userl user1 0 2月 19 12:40 bcd
- 用
user1
使用者刪除root
使用者(或者其他使用者)在/tmp/
目錄中建立的abc
檔案,顯示無法刪除。[user1@localhost tmp]$ rm -rf abc rm:無法刪除"abc":不允許的操作
以上例子說的就是在一個許可權是777並且有
SBIT
特殊許可權的目錄中,每個使用者只能刪除自己建立的檔案,其他使用者建立的檔案我們刪除不了。
6、設定檔案特殊許可權
特殊許可權這樣來表示:
- 4代表SUID
- 2代表SGID
- 1代表SBIT
舉例:
# 賦予SUID許可權
[root@localhost ~]# chmod 4755/u+s ftest
# 賦予SGID許可權
[root@localhost ~]# chmod 2755/g+s ftest
# SBIT只對目錄有效,所以建立測試目錄,並賦予SBIT
[root@localhost ~]# mkdir dtest
[root@localhost ~]# chmod 1755/o+t dtest/
7、檔案特殊許可權:SetUID,SetGID,Sticky BIT區別
- SUID:只能針對執行程式。
- SGID:既可以針對執行檔案,也可以針對目錄檔案。
針對目錄是沒有風險的,針對執行檔案和SUID是一致的,都是有風險的。 - SBIT:只能針對目錄。
這些許可權都是針對普通使用者的。