1. 程式人生 > >linux中的setUID許可權

linux中的setUID許可權

 

setUID命令只能對檔案生效,對目錄不生效

在使用umask命令檢視系統預設許可權時,會出現4位數字的許可權代號,如下:

其中第一個0表示的其實就是檔案的特殊許可權,包括setUID,setGID,sticky BIT許可權,其於檔案的使用者對應的關係為:

特殊許可權名 對應使用者 對應許可權代號
setUID u(所有者) 4
setGID g(所屬組) 2
sticky BIT o(其他使用者) 1

 

當沒設定檔案的特殊許可權(包括setUID,setGID,sticky BIT許可權)時,對應的四位數字的第一位則為0。

1、setUID許可權的功能

  • 只有可執行(x)的二進位制程式才能設定setUID許可權
  • 命令執行者要對該程式擁有執行許可權(x)
  • 命令的執行者在執行該程式時會獲得該程式檔案的屬主身份(在執行程式的過程中靈魂附體為檔案的屬主)
  • setUID許可權只在該程式的執行過程中有效,也就是說身份改變只在程式執行過程中有效

2、給檔案設定setUID許可權

chmod 4755 檔名
#下面的這個是個例子
chmod 4755 abc
#或者
chmod u+s abc

結果如下:

可以看出賦予了setUID許可權後對應原來所有者身份的rwx變成了rws,也就是s取代了x,同時系統把檔名abc以紅底白字顯示(提示這個檔案是不安全的,有可能有安全隱患,也就是setUID許可權不安全)

如果給一個沒有可執行許可權的檔案賦予setUID許可權,那麼結果為:

即對應的rw-會變成rwS,這種大S許可權的(setUID許可權)檔案是不可執行的,沒什麼意義,因此需給檔案的屬主可執行許可權再賦予setUID許可權才有意義。

3、獲得該程式檔案的屬主身份的特性(危險)

在linux中使用者的密碼都放在/etc/shadow檔案下,而且該檔案的許可權都是0,即只有root使用者才能開啟該檔案,普通使用者開啟該檔案會提示許可權不足。(當然賦予了sudo許可權的使用者也能開啟)

那既然普通使用者不能訪問/etc/shadow檔案,那麼linux中的普通使用者自己怎麼修改自己的密碼呢?這裡就涉及到系統設計好的setUID許可權。如下:

對於/usr/bin/passwd命令,系統已經預先設定為了rwsr-xr-x許可權

所以普通使用者執行passwd命令期間,普通使用者將會得到passwd命令的屬主(root)的身份,因此就可以訪問/etc/shadow檔案,實現自身密碼的修改。

4、危險的setUID

如果系統中存在預設setUID許可權之外的帶有setUID許可權的檔案,則有可能被別人植入了木馬或者其他危險檔案,因此在一般的日常工作中,能夠不用setUID許可權就能完成的工作,就儘量不要使用setUID許可權。並且做好如下幾個方面的工作:

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

5、定時檢查系統中有無系統預設之外的具有setUID許可權的檔案指令碼

#!/bin/bash

find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜尋系統中所有擁有setUID和setGID的檔案,並儲存到臨時目錄setuid.check中
for i in $(cat /tmp/setuid.check)
#做迴圈,每次迴圈取出臨時檔案中的檔名
    do
        grep $i /home/fz/suid.log > /dev/null
        #比對這個檔名是否在模板檔案中
            if [ "$?" != "0" ]
            #檢查上一個命令的返回值,如果不為0,證明上一個命令報錯
                then 
                echo "$i isn't in listfile!" > /home/fz/suid_log_$(date +%F)
                #如果檔名不在模板檔案中,則輸出錯誤資訊,並把錯誤資訊報錯到日誌中

            fi
    done
rm -rf /tmp/setuid.check
#刪除臨時檔案

首先在檢查前,先把系統中自帶的setUID許可權的檔案找出來,並將其寫入/home/fz/suid.log檔案中,然後再執行此指令碼。