Linux進程的實際用戶ID和有效用戶ID

     本人對Unix下的進程的實際用戶ID和有效用戶ID一直都比較迷惑,沒有徹底搞清楚。最近溫習APUE(《高級UNIX環境編程》),終於對這兩個概念有了一個清晰的認識,看來經典著做絕對須要溫習多遍,才能領略其中的奧祕。編程

     在Unix進程中涉及多個用戶ID和用戶組ID,包括以下:測試

一、實際用戶ID和實際用戶組ID:標識我是誰(聽說這是一個變態的哲學問題,難死一片哲學家)。也就是登陸用戶的uid和gid,好比個人Linux以simon登陸,在Linux運行的全部的命令的實際用戶ID都是simon的uid,實際用戶組ID都是simon的gid(能夠用id命令查看)。
二、有效用戶ID和有效用戶組ID:進程用來決定咱們對資源的訪問權限。通常狀況下,有效用戶ID等於實際用戶ID,有效用戶組ID等於實際用戶組ID。當設置-用戶-ID(SUID
)位設置,則有效用戶ID等於文件的全部者的uid,而不是實際用戶ID;一樣,若是設置了設置-用戶組-ID(SGID)位,則有效用戶組ID等於文件全部者的gid,而不是實際用戶組ID。 ui

     Unix系統經過進程的有效用戶ID和有效用戶組ID來決定進程對系統資源的訪問權限。spa

     以上這些概念仍是比較的抽象,那麼我就動手驗證一下就很是清楚了。用戶以下代碼寫一個小的測試程序:.net

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>int main(void)
{
    printf("uid = %d, gid = %d, euid = %d, egid = %d\n", getuid(), getgid(), geteuid(), getegid());
}

這個程序很是簡單沒有什麼好說的。咱們編譯這個程序生成a.out程序。 unix

    經過上圖,咱們能夠看到:經過id命令看到當前登陸用戶爲simon,uid=1000,gid=1000。經過ls命令咱們能夠看出a.out程序沒有設置SUID和SGID(能夠參考個人博文Linux的特殊文件權限,來明確怎樣經過ls查看SUID和SGID位的設置狀況),全部者是simon,全部者阻也是simon。執行a.out咱們發現有效用戶ID等於實際用戶ID(1000),有效用戶組ID等於實際用戶組ID(1000)。code

     你可能注意到a.out的全部者simon,組也是simon,和實際用戶,實際用戶組是同樣的,這樣測試下來上面的結果說服力不夠。下一步咱們修改一下a.out全部者和組,再看結果。進程

發現結果和上面同樣,a.out進程的有效用戶ID等於實際用戶ID(1000),有效用戶組ID等於實際用戶組ID(1000)。資源

     下面咱們給a.out程序設置SUID,看看會有什麼結果。get

咱們發現設置a.out程序的SUID位以後,a.out進程的有效用戶ID等於文件全部者的UID(root的uid爲0),有效用戶組ID仍是等於實際用戶組ID(1000)。這樣程序就能夠訪問只有root才能訪問的資源了。注意這樣的程序很危險,編寫這樣的程序必定要當心。

     下面咱們設置a.out的SGID,看看會有什麼結果。

咱們發現設置a.out的SGID以後,a.out進程的有效用戶ID等於實際用戶ID(1000),有效用戶組ID等於文件全部者的用戶組ID(root組gid等於0)。這樣a.out進程就能夠訪問root組能夠訪問的全部的資源了。

     通過上面的描述想必你們對實際用戶ID和有效用戶ID有了一個比較清晰的認識。請你們自行分析passwd命令的實際用戶ID和有效用戶ID(passwd須要訪問root權限的資源/etc/passwd等),能夠參考Linux的特殊文件權限

來源:http://my.unix-center.net/~Simon_fu/?p=607

相關文章
相關標籤/搜索