3種特殊權限
在Linux系統(tǒng)中,有3種特殊權限,它們分別是Setuid(SUID)、Setgid(SGID) 和 Sticky Bit。
- Setuid權限:通過Setuid權限,普通用戶可以在執(zhí)行某些特定程序時,擁有與程序所有者相同的權限。也就是說,該程序在執(zhí)行時,會自動獲取其所有者的權限,而不是執(zhí)行者的權限。這通常用于一些需要root權限才能執(zhí)行的程序。
- Setgid權限:通過Setgid權限,執(zhí)行者可以在執(zhí)行某個程序時,獲得該程序所屬組的權限,而不是執(zhí)行者所在的組的權限。通常,Setgid權限用于一些需要共享訪問權限的目錄,比如一個共享的工作目錄。
- Sticky Bit權限:Sticky Bit權限通常用于某些共享的目錄,它可以防止普通用戶刪除其他用戶創(chuàng)建的文件。也就是說,一旦一個目錄被設置了Sticky Bit權限,只有該目錄的所有者和root用戶才能刪除該目錄中的文件。這樣可以避免其他用戶意外刪除其他用戶創(chuàng)建的文件,保證了文件的安全性和完整性。
場景實戰(zhàn)
- 假設有這樣一個二進制程序/usr/bin/passctl,這個程序只能被root用戶執(zhí)行,而我們希望普通用戶也能執(zhí)行該程序,但是又不想將該程序賦予root用戶以外的用戶特權。這時,我們可以使用Setuid權限來實現(xiàn)該目的。
# 將該程序的所有者設置為root用戶,并將該程序的權限設置為可執(zhí)行,但不允許其他用戶執(zhí)行該程序
chown root /usr/bin/passctl
chmod 700 /usr/bin/passctl
# 設置Setuid權限,以便普通用戶執(zhí)行該程序時可以獲得與root用戶相同的權限
chmod u+s /usr/bin/passctl
這時候,該程序?qū)⒁詒oot用戶的身份運行,并獲得與root用戶相同的權限了。比如有一個普通用戶tantianran,那么該用戶就可以像下面這樣運行該程序啦!
/usr/bin/passctl
注意,在實際工作中設置Setuid權限時,需要確保所設置的程序是安全的,避免潛安全風險。
- 假設有一個團隊正在開發(fā)一個 Web 應用程序,并且他們都是在同一個 Linux 服務器上工作。為了便于團隊成員之間共享文件和目錄,創(chuàng)建了一個名為 "webapp" 的共享目錄。此外,還希望確保任何新文件或目錄在創(chuàng)建時都具有與父目錄相同的權限。為了實現(xiàn)這個場景,可以使用 Setgid 權限來配置 "webapp" 目錄。
# 創(chuàng)建演示的目錄和用戶、組
[root@workhost ~]# mkdir -p /data/tmpdir/webapp
[root@workhost ~]# chmod 775 /data/tmpdir/webapp/
[root@workhost ~]# groupadd webappgroup
[root@workhost ~]# useradd webappdev
# 將 "webapp" 目錄的所有者設置為 Web 應用程序的主要開發(fā)者,并將其所屬組設置為 "webappgroup"。
[root@workhost ~]# chown webappdev:webappgroup /data/tmpdir/webapp
# 設置 "webapp" 目錄的 Setgid 權限,這將導致任何新創(chuàng)建的文件或目錄都將繼承 "webapp" 目錄的組權限。
[root@workhost ~]# chmod g+s /data/tmpdir/webapp
# 查看
[root@workhost ~]# ls -ld /data/tmpdir/webapp/
drwxrwsr-x 2 webappdev webappgroup 21 Apr 10 20:58 /data/tmpdir/webapp/
[root@workhost ~]#
如果權限中有小寫字母s,則表示 Setgid 權限已經(jīng)被設置
現(xiàn)在,團隊成員可以在 "webapp" 目錄中創(chuàng)建新文件和目錄,并確保這些文件和目錄都具有與 "webapp" 目錄相同的組權限。例如,如果開發(fā)者tantianran在 "webapp" 目錄中創(chuàng)建了一個名為 "main.go" 的文件。
[root@workhost ~]# usermod -g webappgroup tantianran
[root@workhost ~]# id tantianran
uid=1000(tantianran) gid=1001(webappgroup) groups=1001(webappgroup),1000(tantianran)
[root@workhost ~]#
[root@workhost ~]# su - tantianran
Last login: Mon Apr 10 20:55:24 CST 2023 on pts/0
[tantianran@workhost ~]$ cd /data/tmpdir/webapp/
[tantianran@workhost webapp]$ touch main.go
# 該文件的權限將如下所示:
[tantianran@workhost webapp]$ ls -l
total 0
-rw-r--r-- 1 tantianran webappgroup 0 Apr 10 20:58 main.go
[tantianran@workhost webapp]$
注意到該文件的所屬組為 "webappgroup",這是因為 "webapp" 目錄設置了 Setgid 權限,導致該文件繼承了組權限。此外,團隊內(nèi)其他成員也可以訪問該文件,因為 "webapp" 目錄的組權限允許組中的任何成員訪問它。
- 假設我們有一個名為“shared_directory”的公共目錄,用于存放團隊成員之間共享的文件。我們希望所有團隊成員都可以向該目錄上傳文件,但只有文件所有者和超級用戶才能刪除文件。
# 創(chuàng)建一個共享目錄“shared_directory”
[root@workhost ~]# mkdir /data/tmpdir/shared_directory
# 設置Sticky Bit權限
[root@workhost ~]# chmod +t /data/tmpdir/shared_directory
[root@workhost ~]# ls -ld /data/tmpdir/shared_directory/
drwxr-xr-t 2 root root 6 Apr 10 21:09 /data/tmpdir/shared_directory/
[root@workhost ~]#
# 創(chuàng)建兩個測試用戶賬號“user1”和“user2”,并將它們添加到同一用戶組
[root@workhost ~]# useradd user1
[root@workhost ~]# useradd user2
[root@workhost ~]# groupadd shared_group
[root@workhost ~]# usermod -aG shared_group user1
[root@workhost ~]# usermod -aG shared_group user2
[root@workhost ~]#
# 將共享目錄“shared_directory”的所有權更改為“root”用戶和“shared_group”用戶組
[root@workhost ~]# chown root:shared_group /data/tmpdir/shared_directory/
# 將目錄權限更改為“rwxrwxrwt”,這將允許所有團隊成員上傳文件到目錄中,但只有文件所有者和超級用戶可以刪除文件:
[root@workhost ~]# chmod 1777 /data/tmpdir/shared_directory/
[root@workhost ~]# ls -ld /data/tmpdir/shared_directory/
drwxrwxrwt 2 root shared_group 6 Apr 10 21:17 /data/tmpdir/shared_directory/
[root@workhost ~]#
# 測試
[root@workhost shared_directory]# sudo -u user2 touch test.go
[root@workhost shared_directory]# ls -l
total 0
-rw-r--r-- 1 user2 user2 0 Apr 10 21:21 test.go
[root@workhost shared_directory]# sudo -u user1 rm -f test.go
rm: cannot remove ‘test.go’: Operation not permitted # 會收到一個錯誤消息,提示沒有權限刪除該文件:
[root@workhost shared_directory]# touch main.go
[root@workhost shared_directory]# sudo -u user1 rm -f main.go
rm: cannot remove ‘main.go’: Operation not permitted
[root@workhost shared_directory]# sudo -u user1 touch conf.json
[root@workhost shared_directory]# sudo -u user2 rm -f conf.json
rm: cannot remove ‘conf.json’: Operation not permitted
[root@workhost shared_directory]#
這個場景實戰(zhàn)演示了如何使用Sticky Bit權限來控制公共目錄的刪除操作,以確保只有目錄所有者和超級用戶可以刪除其他用戶的文件。
最后的總結
- SUID權限(Set User ID on execution):當一個可執(zhí)行文件被設置了SUID權限時,當任何用戶執(zhí)行該文件時,該文件將以文件所有者的權限來運行,而不是執(zhí)行者的權限。SUID權限通常用于那些需要執(zhí)行特定操作,而這些操作只能由具有特定權限的用戶或組來執(zhí)行的程序,例如passwd命令。這可以幫助管理員在系統(tǒng)中實現(xiàn)更嚴格的訪問控制。
- SGID權限(Set Group ID on execution):當一個可執(zhí)行文件被設置了SGID權限時,當任何用戶執(zhí)行該文件時,該文件將以文件所屬組的權限來運行,而不是執(zhí)行者的權限。與SUID權限類似,SGID權限通常用于那些需要特定組的權限才能運行的程序。例如,在一個共享文件夾中,如果一個目錄設置了SGID權限,則新創(chuàng)建的文件將繼承目錄的組權限,而不是創(chuàng)建者的組權限,這可以確保在組共享文件夾中的文件訪問控制。
- sticky bit權限:當一個目錄被設置了sticky bit權限時,只有目錄的所有者、root用戶和文件的所有者才能刪除目錄中的文件。這種權限通常被用于公共目錄,以防止其他用戶意外刪除或修改其他人上傳的文件。當一個用戶上傳一個文件到該目錄時,他或她只能修改或刪除自己上傳的文件,而不能修改或刪除其他人的文件。
總而言之,言而總之,這些特殊權限可以幫助管理員更好地控制對文件和目錄的訪問,并確保系統(tǒng)的安全性和穩(wěn)定性。
本文轉(zhuǎn)載于WX公眾號:不背鍋運維(喜歡的盆友關注我們):https://mp.weixin.qq.com/s/zSWP-fr238SqmS-mkEQzFA