『學了就忘』Linux許可權管理 — 55、檔案特殊許可權

繁華似錦Fighting發表於2021-11-30

1、檔案特殊許可權說明

Linux系統中,檔案特殊許可權有:SetUIDSetGIDSticky BIT

這三個檔案許可權不是太安全,是Linux系統應對特殊情況所準備的許可權,給Linux系統的一些特殊命令提供的。不推薦使用者手動來設定,尤其是SetUID。這三個選項瞭解一下就好。

我們之前說過umask值的時候,如下:

[root@localhost ~]# umask
0022

可以看到umask值是一個4位數,後三位是我們之間講過的基本許可權(讀寫執行),第一位我們之前空過去了,如果忘記了,可以檢視umask預設許可權文章內容

現在來說一下,第一位就是定義SetUID,SetGID,Sticky BIT,這三個特殊許可權的。

還有一點,我們之前說過,普通使用者是可以修改自己的密碼的,但是我們檢視下面兩個檔案,/etc/passwd檔案和/etc/shadow檔案。

image

我們知道/etc/passwd檔案存放著使用者的資訊,/etc/shadow檔案中存放著使用者的密碼。但是我們可以看到/etc/shadow檔案的許可權是000,也就是說普通使用者對這個檔案是沒有任何操作許可權的,不能看也不能開啟,也不能寫。

但是我們知道密碼的修改,最終是要寫入/etc/shadow檔案中的。那使用者對/etc/shadow檔案沒有任何許可權,那怎麼是把密碼最終寫入到/etc/shadow檔案中呢。

這個奧祕就是passwd命令中,我們檢視一下passwd命令。

image

可以看到所有者許可權中,有一個標識為小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檔案。

image

如果取消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檔案資訊,如下圖所示:

image

可以看到abc檔案的所有者許可權上有一個大S許可權。表示abc檔案沒有什麼作用,因為該檔案不是一個可執行檔案。可以理解成小s = 大s + x(執行許可權)

(2)命令執行者要對該程式擁有x(執行)許可權。

檢視passwd命令,普通使用者對於passwd命令是屬於其他人許可權組裡。其他人的許可權中是有執行許可權的。

image

SetUID許可權是,必須是使用者在執行的時候SetUID許可權才生效。

(3)命令執行者在執行該程式時獲得該程式檔案屬主的身份(在執行程式的過程中靈魂附體為檔案的屬主)

看上邊一中的《為什麼要給passwd命令設定SetUID特殊許可權?》問題,有解釋。

(4)SetUID許可權只在該程式執行過程中有效,也就是說身份改變只在程式執行過程中有效。

(5)注意:Linux系統自帶的命令賦予了特殊許可權,一般沒有什麼問題,很安全。最危險的是自己寫的指令碼賦予了特殊許可權,不建議手動賦予。

(6)有幾點建議:

  1. 關鍵目錄應嚴格控制寫許可權。比如//usr等;
  2. 使用者的密碼設定要嚴格遵守密碼三原則;
  3. 對系統中預設應該具有SetUID許可權的檔案作一列表,定時檢查有沒有這之外的檔案被設定了SetUID許可權。

3、檢測SetUID的指令碼

首先找一個全新的Linux系統,沒有被人操作過。通過指令碼在系統中查詢含有SetUIDSetGID的檔案。如果統一寫入一個模板檔案。

然後在定期或者不定期的執行該指令碼,存入一個臨時檔案,然後拿這個臨時檔案和上面的模版檔案進行對比,如果臨時檔案和模板檔案是一樣的,證明系統中沒有出現新的SetUIDSetGID許可權。如果有不同,則把該內容記錄下來。

[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也簡稱為SGIDSGID即可以針對檔案生效,也可以針對目錄生效,這和SUID明顯不同。

(1)針對檔案的作用

針對檔案,SGID的含義如下:

  1. 只有可執行的二進位制程式才能設定SGID許可權。
    SUID
  2. 命令執行者要對該程式擁有x(執行)許可權。
    SUID
  3. 命令執行在執行程式的時候,組身份升級為該程式檔案的屬組。
    # 檢視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組。
  4. SetGID許可權同樣只在該程式執行過程中有效,也就是說組身份改變只在程式執行過程中有效。

(2)針對目錄的作用

SGID針對目錄設定,含義如下:

  • 普通使用者必須對此目錄擁有rx許可權,才能進入此目錄。
  • 普通使用者在此目錄中的有效組會變成此目錄的屬組。
  • 若普通使用者對此目錄擁有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目前僅針對目錄有效,它的作用如下:

  • 粘著位目前只對目錄有效。
  • 普通使用者對該目錄擁有wx許可權(其他人位要有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:只能針對目錄。

這些許可權都是針對普通使用者的。

相關文章