linux系統中的特殊權限之SUID(Set UID)



***linux系統中的特殊權限之SUID(Set UID)***
***linux系統中的特殊權限之SGID(Set GID)***
***linux系統中的特殊權限之SBIT(Sticky BIT)***

前言

在進入正題之前,讓我們來看一條簡單的linux命令

[root@centos7u6 ~]# ls -l
total 8
-rw-------. 1 root root 1409 Mar 13 12:22 anaconda-ks.cfg
drwxr-xr-x. 2 root root  119 Mar 28 20:13 test

以上面的test目錄為例,linux系統中的文件,有9位基本權限,即 rwxr-xr-x ,其中:

  • 左三位:定義屬主(owner)的權限
  • 中三位:定義屬組(group)的權限
  • 右三位:定義其他(other)的權限
    同時,每3位又分別代表着不同的權限,分別為:
  • r:readable, 讀
  • w:writable, 寫
  • x:excutable,執行
    有權限時分別用3個字母表示,這9個權限位,決定一個用戶了訪問文件時,對該文件具有哪些權限。
    但是除了這個9個權限位之外,linux系統中還有3個特殊權限位,即SUIDSGIDSBIT
    這里,我們先說說SUIDSGIDSBIT會放在后面的文章講解。

SUID的作用

當一個用戶運行一個程序時,如果這個程序擁有SUID權限,則當這個程序運行為進程時,進程的屬主不再是其發起者,而是這個程序文件自己的屬主
下面,為了更好的理解SUID的作用,我們用一個簡單的示例來展示。

進程安全上下文

當一個用戶發起一個進程去訪問一個文件時,這個進程是以該用戶的身份和權限對文件完成相關操作,這個過程基於一個簡單的權限匹配模型:

  • 第一步,判斷進程的屬主與被訪問文件的的屬主是否相同,
    • 如果相同,則直接應用屬主的權限去訪問文件;
    • 如果不同,則進入第二步;
  • 第二步,判斷進程的屬主與被訪問文件的屬組是否相同,
    • 如果相同,則應用屬主的權限去訪問該文件;
    • 如果不同,則進入第三步;
  • 第三步,應用其他(other)的權限去訪問該文件;

實例講解

默認的情況(不使用SUID)

這里我們使用less命令來進行簡單演示

  • #查看/bin/less命令的權限和屬主屬組
[root@centos7u6 ~]# ls -l /bin/less
-rwxr-xr-x. 1 root root 158240 Jul 31  2015 /bin/less
  • #安全起見,我先將/bin/less命令拷貝至/tmp/目錄下,以便后期修改其SUID權限
[root@centos7u6 ~]# cp /bin/less /tmp/
  • #這里注意,/tmp/less的權限同/bin/less一樣,屬主和屬組都是root
[root@centos7u6 ~]# ls -l /tmp/less 
-rwxr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
  • #現在切換至tom用戶,並使用less命令查看
    注意:這個地方,不要使用q退出less命令,以保證less進程存在
[root@centos7u6 ~]# su - tom
Last login: Fri Mar 29 23:32:38  on pts/1
[tom@centos7u6 ~]$ /tmp/less /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • #使用另一個終端,或者ssh登錄到這台主機,並查看進程
[root@centos7u6 ~]# ps aux| grep less
tom       56820  0.0  0.1 110308  1008 pts/1    S+   00:04   0:00 /tmp/less /etc/fstab
root      57040  0.0  0.0 112708   976 pts/2    R+   00:09   0:00 grep --color=auto less

總結:從以上幾步可以看到,默認情況下,雖然/tmp/less的屬主屬組均為root,但是tom作為其他用戶有執行權限,所以tom在使用/tmp/less命令時,發起的進程的屬主是tom,並不是root。這符合之前提到的進程的安全上下文。

使用SUID的情況

  • #現在,在剛才的默認情況的基礎上,我們給予/tmp/less特殊權限SUID,
    注意:文件的屬主的執行權限變成了小s,不再是基本權限中的x
[root@centos7u6 tmp]# chmod u+s /tmp/less 
[root@centos7u6 tmp]# ls -l /tmp/less 
-rwsr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
  • #繼續以tom用戶運行/tmp/less命令,並且不退出
[tom@centos7u6 ~]$ /tmp/less  /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • #再次用其他終端登錄這個主機並用ps aux查看進程
[root@centos7u6 tmp]# ps aux |grep less
root      57587  0.0  0.1 110308  1008 pts/1    S+   00:20   0:00 /tmp/less /etc/fstab
root      57676  0.0  0.0 112708   976 pts/2    R+   00:22   0:00 grep --color=auto less

總結:可以看到,當/tmp/less擁有了SUID權限后,雖然以tom用戶執行/tmp/less命令,但是/tmp/less的進程的屬主仍為root。
其實,SUID在linux中有一個非常常用的命令,使用了SUID權限,這個命令就是passwd

[root@centos7u6 tmp]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

passwd命令擁有了這一特殊權限,使得除了root之外的用戶去發起一個passwd命令的進程時,進程的屬主為root,擁有root權限,這樣就能夠修改自己的密碼了。不過,passwd是一個安全指數很高的命令,這保證了一個用戶(除root外)無法去修改用戶的密碼。

SUID的語法

  • 第一種方法
    chmod u+|-s FILENAME
    設置權限:chmod u+s /tmp/ls
    取消:chmod u+s /tmp/ls
  • 第二種方法
    SUID/SGID/SBIT三個特殊權限又形成了一個8進制權限位,所以在基於8進制賦權時,可以在默認的3位8進制數字左側再加1位8進制數字,來代表特殊權限。
    設置權限:chmod 4644 FILENAME
    取消:
SUID SGID SBIT 八進制權限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

判斷文件是否有SUID權限

SUID的權限展示位,在屬主的執行權限位上。

  • 如果有SUID
    • 屬主原本有執行權限,則屬主的執行權限位,顯示為小s
    • 屬主原本沒有執行權限,則屬主的執行權限位,顯示為大寫S
  • 如果沒有SUID
    • 屬主的執行權限位,仍然按其基本權限,顯示為x或者-
[root@centos7u6 tmp]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

使用SUID的注意事項

  • 只有可執行的二進制程序才可以設置SUID
  • 被設置SUID的文件屬主必須具備可執行(x) 權限
  • SUID的生命周期:當這個程序運行為進程時SUID有效,進程結束后,SUID權限也隨之消失
  • 這個權限有風險,慎用


免責聲明!

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



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