unix中的設置用戶ID位——set-uder-ID


與一個進程相關的ID

 -實際用戶ID與實際用戶組ID——登錄時參考口令文件(etc/passwd),表明我是誰

 -有效用戶ID、有效組ID與附加組ID——用於訪問文件的權限檢查

 -保存的設置用戶ID與保存的設置組ID——由exec函數保存


設置用戶ID位的使用

當執行一個程序文件時,進程的有效用戶ID通常實際用戶ID。但當對該文件設置了set-user-ID位(通常也叫s位)時,執行此文件時,進程的有效用戶ID設置爲文件所有者的用戶ID,而不管該進程的實際用戶ID是什麼。


舉例說明

unix或linux系統中的/etc/passwd文件所有者是超級用戶root,而且超級用戶才能對該文件進行寫操作。但是,實際上所有的用戶都可以將自己的新密碼寫入該文件,這裏就是set-user-ID位在起作用。


unix或linux系統中的/etc/passwd文件的信息:


修改密碼的命令/usr/bin/passwd信息:


因爲文件屬性設置了s位,那麼進程在執行此命令時,進程就獲得了root權限,而不管執行此命令的進程的實際用戶ID是什麼,這樣任何用戶都可以向/etc/passwd文件中寫入新密碼了。從而一個passwd文件便可以管理所用用戶的口令信息。


更進一步

access與open

open打開文件時,內核以進程的有效用戶ID與有效組ID對文件進行訪問權限測試;access則按實際用戶ID與實際用戶組ID進行權限測試。

舉例:access.c

  #include <stdio.h>
  #include <fcntl.h>
 
 int
 main(int argc, char *argv[])
 {
     if (argc != 2){
         printf("usage: a.out <pathname>");
         exit(1);
     }
     if (access(argv[1], R_OK) < 0){               //以實際用戶ID測試進程是否由讀權限
         printf("access error for %s", argv[1]);
     }
     else
         printf("read access OK\n");
     if (open(argv[1], O_RDONLY) < 0){             //以有效用戶ID測試進程是否由讀權限
         printf("open error for %s", argv[1]);
         exit(1);
     }
     else
         printf("open for reading OK\n");
     exit(0);
 }
執行過程解析:(a.out 編譯後生成的可執行文件)

1.


執行./a.out進程的有效用戶ID和實際用戶ID相同,都爲sunzhifeng,且是文件的所有者,所以都有讀權限。

2.

執行./a.out進程的有效用戶ID和實際用戶ID相同,都爲sunzhifeng,但文件所有者爲root且其他人無讀權限。所以access與open訪問都出錯

3.修改a.out文件的所有者爲root,且加上S權限。


當前進程的實際用戶ID爲”sunzhieng”,在執行“./a.out  /etc/shadow"時,由於a.out設置了S位,此時進程的有效用戶ID變成了a.out文件的所有者ID(即,root)。access函數以實際用戶ID——“sunzhifeng”去訪問,權限不夠,拒絕訪問;而open以進程的有效用戶ID——“root”去訪問文件,所以open能以只讀方式打開文件。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章