***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個特殊權限位,即SUID、SGID、SBIT。
這里,我們先說說SUID,SGID和SBIT會放在后面的文章講解。
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權限也隨之消失
- 這個權限有風險,慎用