一:linux UID,GID,EUID,EGID,SUID,SGID快速理解:
1. UID/GID 實際用戶ID和實際組ID,即登陸時候的用戶名,比如我是lirobins登陸,那么UID/GID 為lirobins/lirobins
2. EUID/EGID 有效的用戶ID和有效的組ID,它們指定了訪問目標的權限,SUID,SGID的設置(如setuid()函數或者chmod命令)會影響這個值。
3. SUID/SGID 針對文件而講述的概念,他可以修改當前進程的EUID/EGID
二:UINX 權限為講解:
S G T R W X R W X R W X
s - set user id enable
g - set user group enble
t - sticky
主要講解s/g enable
實例:
chmod 4777 file
file文件的屬性為rwsrwxrwx
chmod 2777 file
file文件屬性為rwxrwsrwx
三: 分析方法:
對它們的使用就是要始終建立UID/GID/EGID/EUID的當前值是如何的
實例1:
1)有程序apps要執行,當前登錄用戶為lirobins,apps文件的ls -l 后的用戶為lirobins,組為lirobins
此時UID=lirobins,GID=lirobins,EUID=lirobins,EGID=lirobins
2)現在apps程序要訪問文件rong_file,rong_file 文件的ls -l后的用戶為rong,組為home,按照當前現狀,lirobins用戶訪問不了rong的
3)如果apps源代碼里面增加了如setuid/setgid()函數之后,諸如如下
SUID 為rong的ID,那么此時apps程序(lirobins的進程),UID=lirobins,EUID=rong, GID=lirobins, EGID=liroibns,此時
apps程序有了rong的權限,當然就可以訪問rong_file了
4)同理,如果apps程序(lirobins的進程),SGID設置了home,那么UID=lirobins,EUID=lirobins, GID=lirobins, EGID=home,此時
apps程序也有了rong的權限,因為他們同組嗎,當然就可以訪問rong_file了
實例2:
1)有程序apps要執行,當前登錄用戶為lirobins,apps文件的ls -l 后的用戶為root,組為root,mode為rwsr--r--
此時UID=lirobins,GID=lirobins,EUID=root,EGID=lirobins
2)此時lirobins可以執行apps程序了,如果apps文件變為rwxr--r-- root root, 那么lirobins用戶但讓不能訪問apps文件,因為他沒有root權限,
實例3:這個例子有點繞,如果理解了實例1和實例2,小菜一碟
UNIX系統有一個/dev/kmem的設備文件,是一個字符設備文件,里面存儲了核心程序要訪問的數據,包括用戶的口令。所以這個文件不能給一般的用戶讀寫,權限設為:cr--r----- 1 root system 2, 1 May 25 1998 kmem
但ps等程序要讀這個文件,而ps的權限設置如下:
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
這 是一個設置了SGID的程序,而ps的用戶是bin,不是root,所以不能設置SUID來訪問kmem,但大家注意了,bin和root都屬於 system組,而且ps設置了SGID,一般用戶執行ps,就會獲得system組用戶的權限,而文件kmem的同組用戶的權限是可讀,所以一般用戶執 行ps就沒問題了。
四:總結,SUID/SGID就是向登陸用戶提供了一種能訪問文件的權限能力。