linux uid 内核,Linux内核学习笔记: uid之ruid,euid,suid
s的本質是讓某個用戶在執行s權限的程序時,擁有該程序文件的屬主或者屬組一樣的訪問權限。屬主或者屬組取決于s的位置
一. Linux 文件權限的表示方法
文件權限用 12 個二進制位表示,如果該位的值是?1,表示有相應的權限:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第 11 位為 SUID 位,第 10 位為 SGID 位,第 9 位為 sticky 位,第 8-0 位對應于上面的三組 rwx 位。
上面的-rwsr-xr-x的值為: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值為: 0 1 0 1 1 0 1 0 0 1 0 0
給文件加 SUID 和 SUID 的命令如下:
chmod u+s filename 設置SUID位
chmod u-s filename 去掉SUID設置
chmod g+s filename 設置SGID位
chmod g-s filename 去掉SGID設置
另外一種方法是 chmod 命令用八進制表示方法的設置。如果明白了前面的 12 位權限表示法也很簡單。
普通數字方法:
SUID是4 ? SGID是2 ? ?SBIT是1
chmod 4755 filename
第一個7代表的就是這三個特殊命令,后面的755是普通權限。上面的命令把filename這個文件加入了SUID權限。
查看特殊權限的方法就是普通的ls命令:
SUID會在所屬用戶權限本應是x的地方顯示s
SGID會在所屬用戶組權限本應是x的地方顯示s
SBIT在其它用戶權限本應是x的地方顯示t
如果希望查找系統中所有具有特殊權限的文件,則:
find / -perm +7000
假如你有文件a.txt
#ls -l a.txt
-rwxrwxrwx
#chmod 4777 a.txt
-rwsrwxrwx ======>注意s位置
#chmod 2777 a.txt
-rwxrwsrwx ======>注意s位置
#chmod 7777 a.txt
-rwsrwxswt ======>出現了t,t的作用在內存中盡量保存a.txt,節省系統再加載的時間.
目錄的S(大寫)屬性使得在該目錄下創建的任何文件及子目錄屬于該目錄所擁有的組,目錄的T屬性使得該目錄的所有者及root才能刪除該目錄。還有對于s與S,設置SUID/SGID需要有運行權限(x),如果一個文件的屬主在chmod u+s file時沒有x可執行權限,用ls -l后就會看到S,證明你所設置的SUID/SGID沒有起作用。
假設要將一個文件權限修改為“-rwsr-xr-x”,由于s在用戶權限中,所以是SUID,因此,原先的755前面還要加上4,也就是4755,所以,用命令chmod 4755 filename 設置就可以了。此外,還可能出現S和T的情況。我們知道,s和t是替代x這個權限的,但是,如果它本身沒有x這個權限,修改為s或t時就會變成大S或大T,例如:執行chmod 7666 filename。 因為666表示“-rw-rw-rw”,均沒有x權限,所以最后變成“-rwSrwSrwT”。
二. SUID 和 SGID 的詳細解析
由于 SUID 和 SGID 是在執行程序(程序的可執行位被設置)時起作用,而可執行位只對普通文件和目錄文件有意義,所以設置其他種類文件的 SUID 和 SGID 位是沒有多大意義的。
首先講普通文件的 SUID 和 SGID 的作用。
如果普通文件 file 是屬于 foo 用戶的,是可執行的,現在沒設 SUID 位,ls 命令顯示如下:
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 file
任何用戶都可以執行這個程序。UNIX 的內核是根據什么來確定一個進程對資源的訪問權限的呢?是這個進程的運行用戶的(有效)ID,包括 user id 和 group id。用戶可以用 id 命令來查到自己的或其他用戶的 user id 和 group id。
除了一般的 user id 和 group id 外,還有兩個稱之為 effective 的 id,就是有效 id,上面的四個 id 表示為:uid,gid,euid,egid。內核主要是根據 euid 和 egid 來確定進程對資源的訪問權限。一個進程如果沒有 SUID 或 SGID 位,則 euid=uid egid=gid,分別是運行這個程序的用戶的 uid 和 gid。例如 kevin 用戶的 uid 和 gid 分別為 204 和 202,foo 用戶的 uid 和 gid 分別為 200 和 201,kevin 運行 myfile 程序形成的進程的 euid=uid=204,egid=gid=202,內核根據這些值來判斷進程對資源訪問的限制,其實就是 kevin 用戶對資源訪問的權限,和 foo 沒關系。
如果一個程序設置了 SUID,則 euid 和 egid 變成被運行的程序的所有者的 uid 和 gid,例如 kevin 用戶運行 myfile,euid=200,egid=201,uid=204,gid=202,則這個進程具有它的屬主 foo 的資源訪問權限。
SUID 的作用就是這樣:
讓本來沒有相應權限的用戶運行這個程序時,可以訪問他沒有權限訪問的資源
。passwd 就是一個很鮮明的例子。
SUID 的優先級比 SGID 高,當一個可執行程序設置了 SUID,則 SGID 會自動變成相應的 egid。
下面討論一個例子:
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 就沒問題了。但有些人說,為什么不把 ps 程序設置為 root 用戶的程序,然后設置 SUID 位,不也行嗎?這的確可以解決問題,但實際中為什么不這樣做呢?因為 SGID 的風險比 SUID 小得多,所以出于系統安全的考慮,應該盡量用 SGID 代替 SUID 的程序,如果可能的話。下面來說明一下 SGID 對目錄的影響。SUID 對目錄沒有影響。如果一個目錄設置了 SGID 位,那么如果任何一個用戶對這個目錄有寫權限的話,他在這個目錄所建立的文件的組都會自動轉為這個目錄的屬主所在的組,而文件所有者不變,還是屬于建立這個文件的用戶。
===================================================================================================================================
看UNIX相關的書時經常能遇到這幾個概念,但一直沒有好好去理清這幾個概念,以致對這幾個概念一直一知半解。今天好好區分了一下這幾個概念并總結如下。說白了這幾個UID引出都是為了系統的權限管理。
下面分別用RUID, EUID,SUID來表示實際用戶ID,有效用戶ID,設置用戶ID。另外用戶ID是個整型數,為了說明方便真接使用了用戶名來代表不同的UID。先解釋一下這幾個ID的作用:
RUID, 用于在系統中標識一個用戶是誰,當用戶使用用戶名和密碼成功登錄后一個UNIX系統后就唯一確定了他的RUID.
EUID, 用于系統決定用戶對系統資源的訪問權限,通常情況下等于RUID。
SUID,用于對外權限的開放。跟RUID及EUID是用一個用戶綁定不同,它是跟文件而不是跟用戶綁定。
說明SUID的時候很多書都簡略的提了一下passwd這個程序,下面就拿這個例子來分析。我們知道linux系統的密碼都存在了/etc/shadow這個文件里。這個文件是如此的重要,在做任何修改之前最好先備份一下。查看/etc/shadow文件的屬性如下:
[root@localhost ~]# ll /etc/shadow
-r——– 1 root root 1144 Jul 20 22:33 /etc/shadow
從上可以看出/etc/shadow文件是一個屬于root用戶及root組的文件,并且只有EUID為root的用戶具有讀的權限,其它所有EUID都沒有任何權限。當你在steve用戶(EUID此時也為steve)的shell下試圖用vim打開這個文件時會提示權限不允許。至于連root用戶也只有讀的權限我猜是為了不鼓勵root用戶使用vim類的編輯器去直接修改它,而要采用passwd命令來修改這個文件。如果你非要直接修改它,那么你可以使用chmod命令修改為屬性為root可寫,然后就可以修改了。
用過UNIX系統的人都知道,任何一個用戶都可以使用passwd這個命令來得新設定自己的密碼。但從上面已經知道,非root用記是無法讀這個文件的,那么普通用戶是如何做到修改這個文件的呢?我們知道passwd這個命令實際執行的程序是/usr/bin/passwd, 查看這個文件屬性如下:
-r-s–x–x 1 root root 21944 Feb 12? 2006 /usr/bin/passwd;
對應文件存取標志的s位就是通常說的SUID位,另外可以看到所有用戶都有執行的這個程序權力。當steve用戶執行passwd命令的時候。Shell會fork出一個子進程,此時進程的EUID還是steve,然后exec程序/usr/bin/passwd。exec會根據/usr/bin/passwd的SUID位會把進程的EUID設成root,?? 此時這個進程都獲得了root權限, 得到了讀寫/etc/shadow文件的權限, 從而steve用戶可完成密碼的修改。?exec退出后會恢復steve用戶的EUID為steve.這樣就不會使steve用戶一直擁有root權限。
我們可以測試一下,用root用戶把/usr/bin/passwd的SUID位去掉,如下:
[root@localhost ~]# ll /usr/bin/passwd
-r-s–x–x 1 root root 21944 Feb 12? 2006 /usr/bin/passwd
[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-r-x–x–x 1 root root 21944 Feb 12? 2006 /usr/bin/passwd
然后steve用戶用命令passwd去更新密碼會提示如下錯誤:
[steve@localhost ~]$ passwd
Changing password for user steve.
Changing password for steve
(current) UNIX password:
passwd: Authentication token manipulation error
[steve@localhost ~]$
這就是因為/usr/bin/passwd程序的SUID去掉后,steve用戶雖然可以執行該程序,但因為/usr/bin/passwd/的SUID沒有設置,這樣exec后進程的EUID仍為steve的原因。
也許有人會發現root用戶卻仍可以使用該用命修改密碼,那是因為root用戶本身的EUID時就是root (也有可能只要發現是RUID是root就不檢查EUID了,直接可讀寫,root就是老大嘛), 可以讀取密碼文件。
另外也許有人會發現普通的文件文件普通的文本文件會也可以設置SUID位, 但這是沒有意義的,因為文本文件沒有地方執行seteuid()的系統調用來改變當用用戶的EUID。
最后,這里的對用戶ID的規則同樣也適用了組ID。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的linux uid 内核,Linux内核学习笔记: uid之ruid,euid,suid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装comfast网卡驱动,电
- 下一篇: linux在shell中获取系统时间,l