轉自: http://www.linuxidc.com/Linux/2011-09/43194.htmlinux
看UNIX相關的書時常常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以至對這幾個概念一直只知其一;不知其二。今天好好區分了一下這幾個概念並總結以下。說白了這幾個UID引出都是爲了系統的權限管理。shell
下面分別用RUID, EUID,SUID來表示實際用戶ID,有效用戶ID,設置用戶ID。另外用戶ID是個整型數,爲了說明方便真接使用了用戶名來表明不一樣的UID。先解釋一下這幾個ID的做用:vim
RUID, 用於在系統中標識一個用戶是誰,當用戶使用用戶名和密碼成功登陸後一個UNIX系統後就惟一肯定了他的RUID.編輯器
EUID, 用於系統決定用戶對系統資源的訪問權限,一般狀況下等於RUID。測試
SUID,用於對外權限的開放。跟RUID及EUID是用一個用戶綁定不一樣,它是跟文件而不是跟用戶綁定。ui
說明SUID的時候不少書都簡略的提了一下passwd這個程序,下面就拿這個例子來分析。咱們知道linux系統的密碼都存在了/etc/shadow這個文件裏。這個文件是如此的重要,在作任何修改以前最好先備份一下。查看/etc/shadow文件的屬性以下:htm
[root@localhost ~]# ll /etc/shadowtoken
-r——– 1 root root 1144 Jul 20 22:33 /etc/shadow進程
從上能夠看出/etc/shadow文件是一個屬於root用戶及root組的文件,而且只有EUID爲root的用戶具備讀的權限,其它全部EUID都沒有任何權限。當你在steve用戶(EUID此時也爲steve)的shell下試圖用vim打開這個文件時會提示權限不容許。至於連root用戶也只有讀的權限我猜是爲了避免鼓勵root用戶使用vim類的編輯器去直接修改它,而要採用passwd命令來修改這個文件。若是你非要直接修改它,那麼你可使用chmod命令修改成屬性爲root可寫,而後就能夠修改了。ip
用過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文件的權限, 從而steve用戶可完成密碼的修改。 exec退出後會恢復steve用戶的EUID爲steve.這樣就不會使steve用戶一直擁有root權限。
咱們能夠測試一下,用root用戶把/usr/bin/passwd的SUID位去掉,以下:
[root@localhost ~]# ll /usr/bin/passwd
-r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd
[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-r-x–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd
而後steve用戶用命令passwd去更新密碼會提示以下錯誤:
[steve@localhost ~]$ passwd
Changing password for user steve.
Changing password for steve
(current) UNIX password:
passwd: Authentication token manipulation error
[steve@localhost ~]$
這就是由於/usr/bin/passwd程序的SUID去掉後,steve用戶雖然能夠執行該程序,但由於/usr/bin/passwd/的SUID沒有設置,這樣exec後進程的EUID仍爲steve的緣由。
也許有人會發現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,這樣就能夠訪問了 。