Linux 中的特殊權限: SUID、SGID 和黏性位

你是否曾经遇到过需要在Linux系统上执行任务,却遭遇到令人沮丧的访问拒绝的情况?那么,告别这些困扰,迎接Linux中特殊权限的世界吧!

本教程将带你掌握Linux中特殊权限的细节,包括粘着位(Sticky Bit)、设置用户ID(SUID)和设置组ID(SGID)。这些特殊权限提供了更高级别的安全控制。

继续阅读,以精确和自信地安全管理你的文件!

先决条件

在深入了解Linux中的特殊权限之前,请确保你拥有一台Linux机器。本教程使用Ubuntu 22.04 LTS(Jammy Jellyfish)进行实际演示。

在Linux中使用特殊权限执行文件(SUID)

Linux文件权限通常基于用户和用户组的权限来确定用户对文件的读取、写入或执行的能力。然而,在某些情况下,用户必须以文件所有者的权限而不是自己的权限来执行文件。

例如,考慮一個僅允許根用戶運行的程序,但普通用戶需要執行特定任務。在這種情況下,SUID 變得非常重要。

要查看如何設置 SUID 權限,請按照以下步驟進行操作:

1. 打開終端並執行以下命令來創建一個名為 A-user(任意)的用戶(useradd)並為其設置密碼(passwd)。

sudo useradd A-user
sudo passwd A-user
Creating a new user

2. 接下來,運行以下stat命令查看cat命令的現有權限。

stat /usr/bin/cat

請注意下面的訪問權限,因為您將需要它進行後續比較:

  • 0755 – 允許以其所有者的權限執行文件,當非特權用戶運行文件時提供提升的權限。
  • -rwxr-xr-x – 設置擁有者對文件的讀取、寫入和執行權限(rwx),而組成員和其他用戶可以讀取和執行文件(r-xr-x)。
Viewing access permissions of the cat command

3. 現在,運行下面的chmod命令,該命令不提供輸出,但在cat命令上設置了 SUID 位。

該命令允許cat命令以文件所有者的權限運行,而不是運行命令的用戶的權限。

? 請注意,使用SUID應謹慎進行,如果實施不當,可能會引入安全風險。請確保只將SUID應用於可信任的命令和文件。

sudo chmod u+s /usr/bin/cat

4. 設置SUID位後,運行以下stat命令,通過重新檢查cat命令的權限來驗證SUID位。

stat /usr/bin/cat

如果成功,您將看到以下內容,並將其與第二步中記錄的信息進行比較:

  • 0755變為4755,其中數字4表示SUID位。
  • -rwxr-xr-x變為-rwsr-xr-x,其中s分別表示用戶的執行(x)權限。
Verifying the SUID bit

5. 運行以下cat命令,測試當前登錄用戶對/etc/shadow文件的訪問權限。該文件是存儲加密的用戶密碼和相關信息的關鍵系統文件,只有root用戶才能訪問。

在Linux中,默認情況下,cat命令允許您查看文件的內容。但這種行為並不總是對每個文件都成立。

cat /etc/shadow

出現下面的消息,是因為當前用戶沒有訪問該文件的權限。

Viewing the /etc/shadow file’s content via a user without appropriate permissions

6. 現在,依次運行以下命令以切換(su)到新用戶(A-user),然後再次嘗試訪問/etc/shadow文件。

這次,cat命令以文件所有者(通常是 root)的權限運行,而不是執行該命令的用戶的權限。

# 切換到 A-user
su A-user
# 查看 /etc/shadow 文件的內容
cat /etc/shadow

由於您暫時授予了 A-user 讀取該文件內容的權限,您將獲得如下輸出。

Viewing the /etc/shadow file’s content

7. 執行以下命令以出退出當前用戶(A-user)並恢復cat命令的權限到原始狀態。

exit
sudo chmod u-s /usr/bin/cat
Removing the SUID bit from the cat command

8. 最後,運行以下命令來驗證已經移除了 SUID 位。

stat /usr/bin/cat

請注意,訪問權限中不再包含 SUID 位4s

Confirming the SUID bit removal

在 Linux 目錄中啟用協作工作流程(SGID)

通過 SUID 在 Linux 中執行具有特殊權限的文件無疑效果良好。但如果您的目標是協作工作流程,即多個用戶協作項目,該怎麼辦?通常,您必須確保新建文件繼承父目錄的組擁有權。

面對這種情況,SGID 顯然是一個改變局面的功能。這個強大的功能簡化了共享資源的管理,在 Linux 環境中增強了基於組的工作流程。

為了了解SGID的工作原理,您將創建一個群組,將用戶添加到其中,將SGID權限設置在一個目錄上,並按如下方式測試其功能:

1. 執行以下命令以以root用戶身份登錄並創建一個名為 demo (任意)的新群組。 這個群組是您用來測試SGID功能的。

這些命令不會

# 切換到root
sudo su
# 創建一個新群組
groupadd demo
Switching to root and creating a job

2. 接下來,運行下面的命令來創建兩個用戶( userA userB ),您將用這些用戶來模擬協作環境。

useradd -s /bin/bash userA
passwd userA

useradd -s /bin/bash userB
passwd userB
Creating users with passwords for simulating a collaborative environment

3. 創建新用戶後,運行下面的 usermod 命令,該命令不會產生終端輸出,但將用戶( userA userB )添加到 demo 群組中。

usermod -aG demo userA
usermod -aG demo userB

4. 現在,執行下面的每個命令,創建一個名為 /demo-dir (任意)的目錄,並將該目錄的用戶和群組所有權分別設置為 userA demo

?當成功時,這些命令不會產生輸出,這適用於整個教程。

# 創建一個目錄
mkdir /demo-dir
# 更改目錄的所有權
chown userA:demo /demo-dir

5. 接下來,運行以下 ls 命令來查看 /demo-dir 目錄的權限。

ls -ld /demo-dir/

以下輸出驗證 /demo-dir 目錄的使用者設置為 userA,群組設置為 demo

Viewing the /demo-dir directory’s permissions

6. 經過驗證的權限後,執行以下 chmod 命令,將 SGID 位設置在 /demo-dir/ 目錄上,如下所示:

  • g+s – Set the SGID bit on the /demo-dir/ directory.
  • o-rwx – Remove all permissions (read, write, execute) for others.
  • u+rwx – Grant read, write, and execute permissions to the owner.
  • g+rwx – Grant read, write, and execute permissions to the group.
chmod g+s,u+rwx,g+rwx,o-rwx /demo-dir/

7. 一旦設置了 SGID,執行以下命令驗證 /demo-dir 目錄的權限。

stat /demo-dir

如果成功,您將看到 SGID 位被設置,表示為數字 2 在八進制模式權限之前,以及群組所有者執行 (x) 權限位置上的 srws)。

Verifying the SGID bit set to the /demo-dir directory

8. 接下來,執行每個以下命令來為 userA 創建一個 /home 目錄。

mkdir /home/userA
chown userA:userA /home/userA

9. 執行以下命令切換 (su) 到 userA 並在 /demo-dir 目錄中創建一個名為 textA.txt(任意)的文件(touch)。

這些命令沒有輸出(這適用於本教程的整個過程),但您將在下一步驟中驗證文件的權限。

# 切換到 userA
su - userA
# 更改目錄
cd /demo-dir
# 創建文本文件
touch textA.txt

10. 執行以下 ls 命令查看 textA.txt 文件的權限。

ls -l textA.txt

以下,textA.txt檔案的群組擁有者是demo,這是創建者userA的主要群組。 demo群組的成員可以讀取和修改該檔案,而其他人只能讀取它。

為了確保/demo-dir目錄中的新檔案繼承目錄的群組擁有權,應在該目錄上設置一個SGID位,您將在以下步驟中介紹。

Verifying the textA.txt file’s permissions

11. 現在,調用以下命令以退出當前使用者(userA)並在/demo-dir目錄中設置SGID位(chmod g+s

# 退出userA
exit
# 將SGID設置為/demo-dir
chmod g+s /demo-dir
Setting the SGID bit to the /demo-dir directory

12. 一旦設置了SGID,執行以下命令來驗證您添加到/demo-dir目錄的SGID位。

stat /demo-dir

如下所示,您將注意到已添加SUID位2,並且在群組擁有者執行位置上有一個s。 此輸出確認已成功將SGID位設置為/demo-dir目錄。

Verifying the SGID is set to the /demo-dir directory

13. 接下來,切換回userA並在/demo-dir目錄中創建另一個名為testA.txt(任意)的檔案。

# 切換到userA
su - userA
# 變更目錄
cd /demo-dir
# 創建文本檔案
touch testA.txt

14. 創建後,運行下面的ls命令檢查新檔案(testA.txt)的擁有權。

ls -l testA.txt

如果SGID正常工作,輸出將顯示,儘管userA是擁有者,但由於在/demo-dir目錄上設置了SGID位,因此群組擁有權是demo

Verifying permissions of the testA.txt file

15. 現在,為userB創建一個/home目錄,以進一步測試SGID功能。

mkdir /home/userB
chown userB:userB /home/userB

16. 切換到userB並在同一個/demo-dir目錄中創建一個名為testB.txt(任意)的文件。

# 切換到userB
su - userB
# 更改目錄
cd /demo-dir
# 創建文本文件
touch testB.txt
Switching to userB and creating the testB.txt file

17. 查看(ls)新文件(testB.txt)的信息。

ls -l testB.txt

檢查textB.txt文件的擁有權。

Checking the ownership of the textB.txt file

在目錄中保護文件(粘性位)

在Linux目錄中啟用協作工作流程可以促進團隊合作和無縫協作。但是,當您必須為有效管理文件建立安全環境時,粘性位權限將派上用場。

通過設置粘性位,您基本上是將“城堡的鑰匙”交到文件所有者、目錄所有者或root用戶手中。這樣做可以確保只有他們有權刪除或重命名目錄中的文件,為敏感數據提供了額外的保護。

要設置粘性位權限,您必須首先使用以下步驟創建共享目錄:

1. 以 root 用戶登錄並創建一個(共享)目錄(mkdir),其中多個用戶可以創建文件。

# 切換到 root 用戶
sudo su
# 創建一個目錄(共享)
mkdir /shared-dir

2. 接下來,運行以下命令來更改/shared-dir目錄的權限,以授予所有人寫入權限。

1777中,第一個數字(1)設置粘性位,其餘的數字(777)使目錄對所有人可讀、可寫和可執行。

# 更改權限,設置粘性位
chmod 1777 /shared-dir
# 查看目錄的權限
ls -ld /shared-dir

以下是 Linux 系統中粘性位的特點或屬性:

Feature Function
Directory Protection When the Sticky Bit is set on a directory, it allows only the owner of a file within that directory to delete or rename their own files. Other users, even if they have write permissions to the directory, cannot delete or rename files owned by other users.
Shared Directories The sticky bit is handy for directories that are shared among multiple users. For example, on a system with a /tmp directory used by all users to store temporary files, setting the Sticky Bit prevents users from accidentally or maliciously deleting files owned by other users.

在權限字段的後半部分可以看到字母 ‘t‘,這表示粘性位被設置為/shared-dir目錄。

Viewing permissions of the /shared-dir directory

3. 切換到userA並在/shared-dir目錄中創建一個名為fileA.txt(任意)的文件:

# 切換到 userA
su - userA
# 創建一個文本文件
touch /shared-dir/fileA.txt

4. 退出 userA,切換到userB,並在同一個/shared-dir目錄中創建另一個名為fileB.txt(任意)的文件。

# 離開使用者A
exit
# 切換至使用者B
su - userB
# 建立文字檔案
touch /shared-dir/fileB.txt

5. 現在,退出 使用者B,切換到 使用者A,並嘗試刪除 使用者BfileB.txt 檔案。

# 退出使用者B
exit
# 切換至使用者A
su - userA
# 刪除使用者B的檔案
rm /shared-dir/fileB.txt

由於只有檔案擁有者才能進行更改或刪除檔案,您將獲得如下輸出。

Attempting to delete a file (fileB.txt) owned by another user (userB)

6. 最後,執行以下命令列表 (ls) 以列出共享目錄 (/shared-dir) 內的所有檔案。

ls /shared-dir/

如果 Sticky Bit 權限起作用,您將看到由使用者B創建的 fileB.txt 檔案安然無恙,並且尚未被刪除。

Confirming the fileB.txt file still exists

結論

隨著您結束對 Linux 中特殊權限的探索,您已經解鎖了一套強大的工具:SUID、SGID 和 Sticky Bit。憑藉這些知識,您現在可以精確調整訪問控制,並以精密方式保護您的檔案。

但不要停在這裡!為什麼不試著設置一個具有 SGID 的共享目錄,並試驗檔案如何繼承群組所有權?Linux 的世界是您的遊樂場,每一次嘗試都會使您精通以精湛技巧保護系統的藝術!

Source:
https://adamtheautomator.com/special-permissions-in-linux/