剛好看到 ByteByteGo 介紹了 Linux file permissions 的概念,趁這個機會系統複習一下 Linux 的權限概念。
基礎權限設定
- ByteByteGo
Linux 文件權限系統的基本概念,包括所有權和權限兩部分。
Ownership(所有權)
在Linux系統中,每個文件或目錄都被分配了三種類型的所有者:
- 所有者(Owner):所有者是創建文件或目錄的用戶。
- 組(Group):一個組可以包含多個用戶。組內的所有用戶對文件或目錄擁有相同的訪問權限。
- 其他(Other):指的是既不是文件所有者也不是所屬組成員的其他用戶。
Permission(權限)
文件或目錄有三種基本權限類型:
- 讀取(Read, r):讀取權限允許用戶讀取文件的內容。
- 寫入(Write, w):寫入權限允許用戶修改文件的內容。
- 執行(Execute, x):執行權限允許文件被作為程序運行。
如何設置這些權限
常見命令包括:
chmod
:更改文件的權限。chown
:更改文件的所有者。chgrp
:更改文件的所屬組。
例子
- 如果你想要給文件增加執行權限,可以使用
chmod +x 文件名
。 - 如果你想要移除寫入權限,可以使用
chome -x 文件名
。 - 如果你想更改文件的所有者,可以使用
chown 新所有者 文件名
。 - 如果你想更改文件的組,可以使用
chgrp 新組 文件名
。
特殊權限設定
在 Linux 系統中,setuid、setgid 和 sticky bits 是特殊的權限設定,用來控制文件和目錄的訪問權限。下面我將分別解釋這三種位的概念並給出實際例子:
Setuid(Set User ID)
設置對象是執行文件
setuid 主要用於提升程序執行時的權限,特別是讓普通用戶以文件擁有者(通常是root)的身份執行某些需要較高權限的操作。這在管理工具中非常常見,以保證安全性和功能的正常執行。
典型例子:
/usr/bin/passwd
:這個程序允許普通用戶修改他們的密碼,它需要訪問和修改只有 root 用戶可寫的/etc/shadow
文件。設置 setuid 可以使得普通用戶在執行此程序時,程序運行於 root 權限,從而安全地更新密碼。
1-rwsr-xr-x 1 root root 53640 Jan 10 10:23 /usr/bin/passwd
這裡 -rwsr-xr-x
中的 s
代表 setuid 位已設置,替代了所有者權限中的執行位 x
。
Setgid(Set Group ID)
設置對象是執行文件或是目錄
setgid 類似於 setuid,但它影響的是用戶組權限。當設置在目錄上時,該目錄下新創建的文件將繼承該目錄的組 ID,而不是創建者的主組 ID。這在共享環境中非常有用,可以保證文件的組權限一致。
典型例子:
- **共享文件夾:**在協作環境中,比如開發環境中的某個目錄,設置setgid可以保證該目錄下所有新創建的文件都屬於相同的組,這樣所有開發者都可以讀取和修改這些文件。
- **sftp 共享文件:**在 sftp 的共相資料夾
/srv/sftp/
,設置setgid 可以使所有用戶創建的文件保持一致的組權限。
1drwxrwsr-x 2 root sftp 4096 Jan 10 10:23 /srv/sftp/
這裡 drwxrwsr-x
中的 s
表示 setgid 已設置,替代了組權限中的執行位 x
。
Sticky Bit
設置對象是目錄
sticky bit 通常設置在共享目錄上。當設置了 sticky bit,它防止用戶刪除或重命名其他用戶擁有的文件,只有文件的所有者和 root 用戶才能刪除或重命名目錄中的文件,即使其他用戶有該目錄的寫權限也不行。
典型例子:
- /tmp 目錄:這是系統臨時文件的儲存地,所有用戶都可以創建臨時文件,但只有文件的創建者和 root 用戶應能夠刪除這些文件。這避免了一個用戶不小心或惡意刪除其他用戶文件的情況。
- Web 伺服器的某些臨時文件目錄:如果一個 Web 應用允許用戶上傳文件到共享目錄,使用 sticky bit 可以保護這些文件不被其他用戶非法移除或更改。
1drwxrwxrwt 14 root root 4096 Jan 10 10:23 /tmp
在權限 drwxrwxrwt
中的 t
表示 sticky bit 已設置。
如何設置和查看這些特殊權限
你可以使用 chmod
命令來設置這些特殊權限:
- 設置 setuid:
chmod u+s 文件名
。 - 設置 setgid:
chmod g+s 文件名
。 - 設置 sticky bit:
chmod +t 目錄名
。 - 設置移除 setuid:
chmod u-s 文件名
。
使用 ls -l
命令可以查看文件或目錄的權限,進而確認是否設置了這些特殊位。