Unix權限管理
Table of Contents
1 Unix權限管理
權限管理實際就是身份認證和訪問權限校驗,被受權的用戶可得到權限,反之,則否。 在 Unix 中用到權限管理的場合包括:less
- 登陸
- 進程對文件的存取訪問
第1點暫不予討論。函數
- 身份認證的過程實際就是:「系統」校驗「主體」是否符合「客體」所指望的身份的過程。在「進程對文件的存取訪問」的身份認證過程當中,內核擔當「系統」角色,進程爲「主體」,文件則爲「客體」。 那麼,認證的依據是什麼?主客雙方都須要提供某種類型的身份憑證!在「進程對文件的存取訪問」的認證過程當中,進程提供的身份憑證是有效用戶ID和有效組ID;文件提供的憑證則是屬主用戶ID和屬主組ID。
- 在提供差別化權限管理的系統中完成身份認證只是第一步,「客體」對不一樣「主體」的開放程度多是不一樣的,若是沒有訪問權限校驗的過程,則沒法提供這種特性。訪問權限校驗是指:在指定身份下,「客體」是否可知足特定類型的訪問申請。
2 進程權限
任意Unix進程可有以下「身份」:post
- 實際用戶ID、有效用戶ID、保存的設置用戶ID
- 實際組ID、有效組ID、保存的設置組ID
這些「身份「的訪問控制函數總結以下:ui
#include <unistd.h> uid_t getuid( ); // 獲取實際用戶ID uid_t geteuid( ); // 獲取有效用戶ID int setuid( uid_t uid ); // 設置實際用戶ID和有效用戶ID int seteuid( uid_t uid ); // 設置有效用戶ID gid_t getgid( ); // 獲取實際組ID gid_t getegid( ); // 獲取有效組ID int setgid( gid_t gid ); // 設置實際組ID和有效組ID int setegid( gid_t gid ); // 設置有效組ID
setuid 和 setgid 可按規則設置調用進程的實際和有效「身份」,這些規則以下:spa
- 以 setuid 爲例:
- 若調用進程具備超級用戶特權1,則將調用進程的實際用戶ID、有效用戶ID、保存的設置用戶ID都設爲uid
- 若調用進程的實際用戶ID或保存的設置用戶ID等於參數uid,則將調用進程的有效用戶ID設置爲uid
- setgid 的規則與 setuid 相似
3 文件權限
文件跟權限管理相關的兩條屬性分別是:進程
- 屬主,它指明瞭文件的歸屬,包括:
- 用戶ID
- 組ID
- 訪問控制權限,它指明瞭文件對不一樣身份的進程所容許的訪問操做,共包括三組:
- 對所屬用戶所容許的訪問操做: -rwx
- 對所屬組所容許的訪問操做: -—rwx
- 對其餘用戶所容許的訪問操做: -——rwx
4 進程對文件的存取訪問的權限校驗過程
- 若進程有效用戶ID爲0,則容許訪問
- 若進程有效用戶ID等於文件所屬者用戶ID,則按用戶訪問權限位進行訪問
- 若進程有效組ID等於文件所屬者組ID,則按組訪問權限位進行訪問
- 若以上都不匹配,則按其餘用戶訪問權限位進行訪問
Footnotes:
1 即,調用進程的有效用戶ID等於0get