UID中RUID、EUID和SUID的區別


看UNIX相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個UID引出都是為了系統的權限管理。

下面分別用RUID, EUID,SUID來表示實際用戶ID,有效用戶ID,設置用戶ID。另外用戶ID是個整型數,為了說明方便真接使用了用戶名來代表不同的UID。先解釋一下這幾個ID的作用:

RUID, 用於在系統中標識一個用戶是誰,當用戶使用用戶名和密碼成功登錄后一個UNIX系統后就唯一確定了他的RUID.

EUID, 用於系統決定用戶對系統資源的訪問權限,通常情況下等於RUID。

SUID,用於對外權限的開放。跟RUID及EUID是用一個用戶綁定不同,它是跟文件而不是跟用戶綁定。

說明SUID的時候很多書都簡略的提了一下passwd這個程序,下面就拿這個例子來分析。我們知道linux系統的密碼都存在了/etc/shadow這個文件里。這個文件是如此的重要,在做任何修改之前最好先備份一下。查看/etc/shadow文件的屬性如下:

[root@localhost ~]# ll /etc/shadow

-r——– 1 root root 1144 Jul 20 22:33 /etc/shadow

從上可以看出/etc/shadow文件是一個屬於root用戶及root組的文件,並且只有EUID為root的用戶具有讀的權限,其它所有EUID都沒有任何權限。當你在steve用戶(EUID此時也為marisa)的shell下試圖用vim打開這個文件時會提示權限不允許。至於連root用戶也只有讀的權限我猜是為了不鼓勵root用戶使用vim類的編輯器去直接修改它,而要采用passwd命令來修改這個文件。如果你非要直接修改它,那么你可以使用chmod命令修改為屬性為root可寫,然后就可以修改了。

用過UNIX系統的人都知道,任何一個用戶都可以使用passwd這個命令來得新設定自己的密碼。但從上面已經知道,非root用記是無法讀這個文件的,那么普通用戶是如何做到修改這個文件的呢?我們知道passwd這個命令實際執行的程序是/usr/bin/passwd, 查看這個文件屬性如下:

-r-s–x–x 1 root root 21944 Feb 12  2006 /usr/bin/passwd;

對應文件存取標志的s位就是通常說的SUID位,另外可以看到所有用戶都有執行的這個程序權力。當steve用戶執行passwd命令的時候。Shell會fork出一個子進程,此時進程的EUID還是steve,然后exec程序/usr/bin/passwd。exec會根據/usr/bin/passwd的SUID位會把進程的EUID設成root,   此時這個進程都獲得了root權限, 得到了讀寫/etc/shadow文件的權限, 從而marisa用戶可完成密碼的修改。 exec退出后會恢復steve用戶的EUID為marisa.這樣就不會使marisa用戶一直擁有root權限。

我們可以測試一下,用root用戶把/usr/bin/passwd的SUID位去掉,如下:

[root@localhost ~]# ll /usr/bin/passwd

[root@localhost ~]# chmod u-s /usr/bin/passwd

[root@localhost ~]# ll /usr/bin/passwd

然后marisa用戶用命令passwd去更新密碼會提示如下錯誤:

[steve@localhost ~]$ passwd

Changing password for user marisa.

Changing password for marisa

(current) UNIX password:

passwd: Authentication token manipulation error

[marisa@localhost ~]$

如下圖:

clip_image001

這就是因為/usr/bin/passwd程序的SUID去掉后,marisa用戶雖然可以執行該程序,但因為/usr/bin/passwd/的SUID沒有設置,這樣exec后進程的EUID仍為marisa的原因。

也許有人會發現root用戶卻仍可以使用該用命令修改密碼,那是因為root用戶本身的EUID時就是root (也有可能只要發現是RUID是root就不檢查EUID了,直接可讀寫,root就是老大嘛), 可以讀取密碼文件。

另外也許有人會發現普通的文件文件普通的文本文件會也可以設置SUID位, 但這是沒有意義的,因為文本文件沒有地方執行seteuid()的系統調用來改變當用用戶的EUID。

最后,這里的對用戶ID的規則同樣也適用了組ID。

個人理解:uid是實際用戶id,每個文件都會有一個uid;用戶在登錄的過程中,使用的是uid。用戶在執行文件時,pID對應的uid就是用戶的uid;  euid是用戶的有效id,在執行文件的時候,由於權限的問題,某個進程的uid需要‘變為’其他用戶才可以執行,這時‘變身’后的用戶id及就是euid。在沒有‘變身’的情況下,euid=uid. suid標示一個文件可以被另一個文件使用‘變身’的策略使用它的權限,比如上面的/etc/passwd 文件,其他用戶只有執行的權限,但是沒有讀取得權限,其他非root用戶在執行的時候,由於文件設置了suid,則執行過程中euid可以被更改為root,這樣就可以訪問了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM