Linux SUID、SGID、SBIT詳解


Linux SUID、SGID、SBIT詳解

linux對文件、目錄的權限控制可謂非常的細致,除了屬主、屬組、其他用戶對應的rwx權限;ACL權限控制;chattr對文件、目錄屬性的控制,還有今天要說的文件的特殊權限SUID、SGID、SBIT。

一、UNIX下關於文件權限的表示方法和解析

SUID 是 Set User ID, SGID 是 Set Group ID,SBIT是Sticky Bit的意思。

UNIX下可以用ls -l 命令來看到文件的權限。用ls命令所得到的表示法的格式是類似這樣的:-rwxr-xr-x 。下面解析一下格式所表示的意思。這種表示方法一共有十位:

9 8 7 6 5 4 3 2 1 0

- r w x r - x r - x

第9位表示文件類型,可以為p、d、l、s、c、b和-:

p 表示命名管道文件

d 表示目錄文件

l 表示符號連接文件

- 表示普通文件

s 表示socket文件

c 表示字符設備文件

b 表示塊設備文件

第8-6位、5-3位、2-0位分別表示文件所有者的權限,同組用戶的權限,其他用戶的權限,其形式為rwx:

r 表示可讀,可以讀出文件的內容

w 表示可寫,可以修改文件的內容

x 表示可執行,可運行這個程序

沒有權限的位置用-表示

例子:

ls -l myfile顯示為:

# ls -lh myfile 
-rwxr----- 1 root root 700M 3月   9 14:16 myfile

表示文件myfile是普通文件,文件的所有者是root用戶,所屬組root,文件只有1個硬連接,大小是700M,最后修改時間3月9日14:16。

所有者root對文件有讀寫執行權限,root組的成員對文件有讀權限,其他的用戶對這個文件沒有權限。

如果一個文件被設置了SUID、SGID、SBIT位,會分別表現在所有者或同組用戶的權限的可執行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者權限中可執行位被設置

2、-rwSr--r-- 表示SUID被設置,但所有者權限中可執行位沒有被設置

3、-rwxr-sr-x 表示SGID和同組用戶權限中可執行位被設置

4、-rw-r-Sr-- 表示SGID被設置,但同組用戶權限中可執行位沒有被社

5、drwxrwxrwt  表示SBIT黏着位被設置

其實在UNIX的實現中,文件權限用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位,哪個位置上的權限被授予則該位置為1,否則就為0,再將這12位數字每三位一組轉換成八進制就可以得到數值形式表示的權限,如:4755,只不過絕大多數文件沒有特殊權限,所以我們會忽略第一位數值將0755寫成755。

11 10 9 8 7 6 5 4 3 2 1 0

上面的-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、SGID、SBIT的詳細解析

1) SETUID 的功能

  1. 只有可執行的二進制程序才能設置SGID權限,對腳本無效;
  2. 命令執行者要對該程序擁有x(執行)權限;
  3. 程序在執行過程中(runtime)獲得該程序文件屬主的身份。有點靈魂附體的感覺,可以是普通用戶執行的程序擁有文件屬主身份;
  4. SETUID 權限只在該程序執行過程中有效,也就是說身份改變只在程序執行過程中有效。

例:

Linux 普通用戶是可以修改自己的密碼的,這不足為奇。但用戶的密碼是存在/etc/shadow這個文件的,如果你注意到shadow文件的權限你會發現所有用戶都無權查看和修改(當然root是超級用戶是有查看和修改的權限的),那么普通用戶是如何修改自己的密碼的呢?這就要歸功於SUID權限了。

# ls -l /etc/shadow
---------- 1 root root 1280 2月   5 15:47 /etc/shadow
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /usr/bin/passwd

可以看到/usr/bin/passwd擁有s權限,那么普通用戶執行passwd命令時實際上進程是以root身份運行的,所以才可以修改shadow文件達到修改密碼的目的。

SUID很有用,管理員可以授權普通用戶只有root才有權限使用的命令如:ping、tcpdump等。SUID也是相對危險的,如當vim被授權SUID權限,普通用戶將可以閱讀修改原本沒有權限的文件,例如/etc/shadow等等。

UNIX的內核是根據什么來確定一個進程對資源的訪問權限的呢?是這個進程的運行用戶的(有效)ID,包括user id和group id。用戶可以用id命令來查到自己的或其他用戶的user id和group id。

除了一般的user id 和group id外,還有兩個稱之為effective 的id,就是有效id,上面的四個id表示為:uid,gid,euid,egid。內核主要是根據euidegid來確定進程對資源的訪問權限。

一個進程如果沒有SUID或SGID位,則euid=uid egid=gid,分別是運行這個程序的用戶的uid和gid。例如kevin用戶的uid和gid分別為204和202,foo用戶的uid和gid為200,201,kevin運行二進制程序形成的進程的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。

  給文件加SUID的命令如下:

+ :在原有參數設定基礎上,追加參數。

- :在原有參數設定基礎上,移除參數。

= :更新為指定參數設定。

chmod u+s filename      設置SUID位
chmod 4755 filename     設置SUID位
chmod u=rwxs filename   指定文件所有者權限
chmod u-s filename      去掉SUID設置
chmod 755 filename    去掉SUID設置

2)SETGID 作用

SGID針對文件的作用

(1)如果是文件則只有可執行的二進制程序才能設置SGID權限;

(2)命令執行者要對該程序擁有x(執行)權限;

(3)程序在執行的時候,組身份升級為該程序文件的屬組;

(4)SETGID權限同樣只在程序執行過程中有效。

SGID針對目錄的作用

(1)普通用戶必須對此目錄擁有r和x權限,才能進入此目錄;

(2)普通用戶在此目錄中的有效組會變成此目錄的屬組;

(3)普通用戶對此目錄有w權限時,新建的文件默認屬組是這個目錄的屬組。

  給文件配置SUID的命令如下:

chmod g+s filename 設置SGID位
chmod 2755 filename 設置SGID位
chmod g=rxs filename 設置SGID位
chmod g-s filename 去掉SGID設置
chmod 755 filename  去掉SGID設置

3)SBIT 粘着位作用

(1)粘着位目前只對目錄有效;

(2)普通用戶要對該目錄擁有w和x權限,即普通用戶可以在此目錄擁有寫入權限,沒有w權限設置粘着位就失去了意義;

(3)想想有沒有這么一種場景,就是所有用戶都可以在此目錄創建文件目錄,也就是有w權限。但又不希望a用戶創建的文件不被b用戶刪除,除了root其他用戶只能刪除自己的文件。沒錯/tmp目錄就要具備這樣的要求。那是如何做到的呢?只要給/tmp/目錄賦予粘着位權限就可以了。只有root可以賦予粘着位權限。

#ls -ld /tmp
drwxrwxrwt. 16 root root 4096 3月   9 17:48 /tmp

  給文件配置SBIT的命令如下:

chmod o+t filename 設置SBIT黏着位
chomd 1755 filename    設置SBIT黏着位
chmod o-t filename  去掉SBIT設置

可能是出於安全的考慮,chmod命令使用數字表示權限來取消特殊權限可能會不生效,所以建議使用 + - 這種形式配置權限。

文件的特殊權限真的系統權限管理解決了不少問題,據說AT&T還為SUID/SGID申請了專利。

三、特殊權限帶來的安全問題

SUID雖然很好了解決了一些問題,但是同時也會帶來一些安全隱患。

因為設置了 SUID 位的程序如果被攻擊(通過緩沖區溢出等方面),那么hacker就可以拿到root權限。因此在安全方面特別要注意那些設置了SUID的程序。

通過以下的命令可以找到系統上所有的設置了suid的文件:

[root@myhost /]# find / -perm -04000 -type f -ls

對於這里為什么是4000,大家可以看一下前面的st_mode的各bit的意義就明白了。

在這些設置了suid的程序里,如果用不上的,就最好取消該程序的suid位。

四、為什么會有大寫的S和T

有時我們會看到權限位有大寫的S或者T而不是正常的小寫字母,這是為什么呢?我們實驗看下。

[root@CentOS7.9 tmp]# ls -ld testdir/
drwxrwxrwt 2 root root 6 3月   9 11:19 testdir/      #testdir 目錄當前權限正常
[root@CentOS7.9 tmp]# chmod o-rwx testdir/      #取代other用戶的rwx權限
[root@CentOS7.9 tmp]# ls -ld testdir/     
drwxrwx--T 2 root root 6 3月   9 11:19 testdir/      #other用戶最后一位權限有小寫的t變成了大寫的T

[root@CentOS7.9 tmp]# touch testfile
[root@CentOS7.9 tmp]# ls -ld testfile 
-rw-r--r-- 1 root root 0 3月   9 20:08 testfile
[root@CentOS7.9 tmp]# chmod u+s testfile     #給testfile加SUID權限(這里testfile只是個普通文件不是二進制文件,但這不影響實驗結果)
[root@CentOS7.9 tmp]# chmod g+s testfile      #給testfile 加SGID權限
[root@CentOS7.9 tmp]# ls -ld testfile    
-rwSr-Sr-- 1 root root 0 3月   9 20:08 testfile     #權限位有兩個大小的S

通過上面的示例可以看到 SUID、SGID、SBIT權限的設置需要文件的屬主、屬組和其他用戶有相應的權限配合,當特殊權限和這些權限不匹配時就會顯示為大寫S或大寫T,這時特殊權限是無效的,這一點需要注意。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM