linux下進程ID linux下set user id和set group id總結 linux下進程的各個ID總結 user ID in process APUE 第四章

    linux中每個進程有六個或者更多的ID與其關聯:

clip_image001

      real user id一般是從passwd文件中獲取的,一般是不會發生改變的,當然也可以改變。可以理解爲啓動該進程的用戶,即哪個用戶啓動了該進程,那麼該進程的real user id就是該用戶的id

      effective user id決定了進程訪問文件的權限,一般情況下是與real user id是相同的,但可以改變

      saved set-user-id 當該程序被執行時,save set-user-id是effective-user-id的一份copy

      user id和group id情況是類似的,通過介紹set-user-id即可瞭解set-group-id

      在系統中每個文件都有一個owner和group owner,這一般是通過stat結構中的st_uid來標記的。在文件的mode裏面有一位叫做set-user-id的位,在設置了該位後,程序運行的時候effective-user-id等於該文件的owner id(比較拗口)

      下面給出一個例子:

clip_image002

clip_image003

clip_image004

clip_image005

       從上面的例子中可以看出set-user-id的思想:當其他用戶運行我這個程序時,如果我設置了set-user-id位,那麼其他用戶就可以像我一樣運行該程序了(這裏主要是指對文件的訪問權)

      例如passwd程序是一個set-user-id程序(即設置了set-user-id位),這是因爲passwd程序在修改用戶密碼時需要訪問/etc/passwd文件,而該文件只有對root用戶是可寫的,其他用戶都是隻有讀權限。那麼在將passwd程序設計成set-user-id成後就可以方便了很多了。其他一般的用戶可以執行passwd程序,在執行的時候passwd進程的real-uer-id是用戶的id,而effective-user-id確實root用戶(因爲passwd的owner是root),而effective-uer-id決定着進程訪問文件的權限,這樣的話就使得其他一般用戶也可以通過passwd程序來修改自己的密碼了。

下面是網上找的一個類似總結:

http://abao.cn/?post=41

       process裏面有三個user id,剛開始真是一個令人感覺頭痛的地方。因爲很容易混淆。但是慢慢的,抓住了一些關鍵的原因和特點,就可以比較容易理解了。process的三個ID分別是real user id, effective user id, saved set-user-id。對於group有相同的情況,我們可以照下文類推。


      首先要注意的是,real user id是真正process執行起來的用戶user id,這個是比較清楚的,這個進程是哪個用戶調用的,或者是哪個父進程發起的,這個都是很明顯的。通常這個是不更改的,也不需要更改。


      然後要注意的是,當判定一個進程是否對於某個文件有權限的時候,要驗證的ID是effective user id,而非real user id。那effective user id是如何被設置進來的呢?


      Linux通常都不建議用戶使用root權限去進行一般的處理,但是普通用戶在做很多很多services相關的操作的時候,可能需要一個特殊的權限。爲了滿足這樣的要求,許多services相關的executable有一個標誌,這就是set-user-id bit。當這個ser-user-id bit=ON的時候,這個executable被用exec啓動之後的進程的effective user id就是這個executable的owner id,而並非parent process real user id。如果set-user-id bit=OFF的時候,這個被exec起來的進程的effective user id應該是等於進程的user id的。


      那這樣我們就清楚了,設定一個effective user id的意義在於,它可能和real user id不同。那麼爲什麼要設置一個saved set-user-id呢?它的意義是,它相當於是一個buffer,在exec啓動進程之後,它會從effective user id位拷貝信息到自己。對於非root用戶,可以在未來使用setuid()來將effective user id設置成爲real user id和saved set-user-id中的任何一個。但是非root用戶是不允許用setuid()把effective user id設置成爲任何第三個user id。
對於root來說,就沒有那麼大的意義了。因爲root調用setuid()的時候,將會設置所有的這三個user id位。所以可以綜合說,這三個位的設置爲爲了讓unprivilege user可以獲得兩種不同的permission而設置的。
      APUE的例子是,普通用戶去執行一個tip進程,set-user-id bit=ON,執行起來的時候,進程可以有uucp (executable owner)的權限來寫lock文件,也有當前普通用戶的權限來寫數據文件。在兩種文件操作之間,使用setuid()來切換effective user id。但是正是因爲setuid()的限制,該進程無法獲得更多的第三種用戶的權限。
其他東西

  •       saved set-user-id是無法取出來的,是kernel來控制的。
  • 注意saved set-user-id是進程中的id,而set-user-id bit則是文件上的權限。我用了比較長的時間才分清楚。

實驗 - 目的在於看看各種運行狀態下的uid和euid。

/* main.c */
#include <stdio.h>
#include <unistd.h>
void print_user_id(void);
void print_user_id(){
    printf("user id=%d/n", getuid());
    printf("effective user id=%d/n", geteuid());
}
int main()
{
    print_user_id();
}

之後編譯
gcc -o main main.c
直接run(當前的user id =1000)
$ ./main
user id=1000
effective user id=1000

用root的身份run(root user id =0)
$ sudo ./main
user id=0
effective user id=0
$ sudo chown mysql main
注意owner改了,但是當前用戶是沒有變的,所以和第一次run的結果一致。
$ ./main
user id=1000
effective user id=1000

設置set-user-id bit=ON,再試試看,就有效果了
$ sudo chmod u+s main
$ ./main
user id=1000
effective user id=112

發佈了71 篇原創文章 · 獲贊 11 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章