在Unix進程中涉及多個用戶ID和用戶組ID,包括如下:
1、實際用戶ID和實際用戶組ID:標識我是誰。也就是登錄用戶的uid和gid,比如我的Linux以simon登錄,在Linux運行的所有的命令的實際用戶ID都是simon的uid,實際用戶組ID都是simon的gid(可以用id命令查看)。
2、有效用戶ID和有效用戶組ID:進程用來決定我們對資源的訪問權限。一般情況下,有效用戶ID等於實際用戶ID,有效用戶組ID等於實際用戶組ID。當設置-用戶-ID(SUID)位設置,則有效用戶ID等於文件的所有者的uid,而不是實際用戶ID;同樣,如果設置了設置-用戶組-ID(SGID)位,則有效用戶組ID等於文件所有者的gid,而不是實際用戶組ID。
以上來自:APUE(《高級UNIX環境編程》)
Unix系統通過進程的有效用戶ID和有效用戶組ID來決定進程對系統資源的訪問權限。
以上這些概念還是比較的抽象,那么下面寫一個小的測試程序:
這個程序非常簡單沒有什么好說的。我們編譯這個程序生成test 程序
通過id命令看到當前登錄用戶為root,uid=0,gid=0。通過ls命令我們可以看出test程序沒有設置SUID和SGID,所有者是root,所有組也是root。執行test我們發現有效用戶ID等於實際用戶ID(0),有效用戶組ID等於實際用戶組ID(0)。
你可能注意到test的所有者root,組也是root,和實際用戶,實際用戶組是一樣的。下一步我們修改一下test所有者和組,再看結果。
發現結果和上面一樣,test進程的有效用戶ID等於實際用戶ID(0),有效用戶組ID等於實際用戶組ID(0)。
下面我們給test程序設置SUID
發現設置test程序的SUID位之后,test進程的有效用戶ID等於文件所有者的UID(gkh的uid為500),有效用戶組ID還是等於實際用戶組ID(0)。這樣程序就可以訪問只有gkh才能訪問的資源了。