實際使用者ID,有效使用者ID及設定使用者ID

2021-06-01 12:40:20 字數 2399 閱讀 8290

原文:

看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此時也為steve)的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檔案的許可權, 從而steve使用者可完成密碼的修改。 exec退出後會恢復steve使用者的euid為steve.這樣就不會使steve使用者一直擁有root許可權。

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

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

-r-s--x--x1 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。

實際使用者ID,有效使用者ID及設定使用者ID

實際使用者id,有效使用者id和設定使用者id 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,...

實際使用者ID,有效使用者ID及設定使用者ID

實際使用者id,有效使用者id和設定使用者id 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,...

實際使用者ID,有效使用者ID及設定使用者ID

實際使用者id,有效使用者id和設定使用者id 看unix相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念並總結如下。說白了這幾個uid引出都是為了系統的許可權管理。下面分別用ruid,euid,suid來表示實際使用者id,...