引言
在 Linux 系統中,權限控制是保障系統安全的核心機制。通過限制用戶對文件和資源的訪問,它能有效防止未授權操作,保護數據不被篡改或泄露。合理設置權限不僅有助于實現用戶隔離和最小權限原則,還能降低系統被濫用或攻擊的風險,是每位系統管理員必須掌握的基礎技能。
在 Web 服務管理中,權限控制尤為重要。多數情況下,即便攻擊者利用漏洞入侵,所獲得的權限也僅限于普通用戶級別。正是依靠 Linux 嚴格的權限機制,才能將 Web 漏洞的影響局限在最小范圍內,避免演變為更嚴重的系統級破壞。關于 Linux 系統中常見的權限提升手法,可以參考這個專欄:點擊查看。
用戶與用戶組在 Linux 中的記錄機制,可以參考這篇文章了解更多細節:Linux提權原理
ls -l 命令詳解
示例
-rwxr-xr-x 1 root root 25451544 Apr 19 15:22 d-eyes
字段 | 示例值 | 含義說明 |
---|---|---|
文件類型+權限 | -rwxr-xr-x | - 表示普通文件;rwx 為所有者權限,r-x 為組權限,r-x 為其他用戶權限 |
硬鏈接數 | 1 | 指向該文件的硬鏈接數量,普通文件通常為 1 |
所有者(用戶) | root | 文件所有者 |
所屬組(用戶組) | root | 文件所屬的用戶組 |
文件大小 | 25451544 | 文件大小(以字節為單位),約 24.3 MB |
修改時間 | Apr 19 15:22 | 文件最后修改時間 |
文件名 | d-eyes | 文件的名稱 |
Linux 權限基礎
用戶、用戶組與其他用戶的權限
在 Linux 中,每個文件或目錄都歸屬于一個特定的用戶(owner)和用戶組(group)。系統通過權限位將訪問控制劃分為三類主體:文件所有者(用戶)、所屬用戶組成員以及其他用戶(others),每類主體都可以擁有各自的權限設置。
?? :除去最前面的文件類型符號,后面的每三個字符依次表示所有者、用戶組和其他用戶的權限。
這種三段式的權限模型,使得 Linux 能夠靈活地控制資源的訪問,既能保護敏感數據,也能根據需要開放部分資源,確保系統的安全與多用戶協作效率。
權限的類型
在 Linux 中,每個文件或目錄的權限由三種基本類型組成:
- r(read)讀權限
- 對文件:允許查看文件內容
- 對目錄:允許列出目錄中的文件和子目錄
- w(write)寫權限
- 對文件:允許修改或覆蓋文件內容
- 對目錄:允許在目錄中創建、刪除或重命名文件和子目錄
- x(execute)執行權限
- 對文件:允許將文件作為程序運行
- 對目錄:允許使用
cd
命令進入該目錄
查看與修改文件權限
使用 ls -l 查看權限
在 Linux 中,可以使用 ls -l
命令查看文件或目錄的權限信息,輸出內容包括權限、所有者、用戶組、文件大小和修改時間等。若加上 -a
參數(即 ls -la
),還能查看隱藏文件的權限情況。需要特別注意的是,權限字段的最左側字符表示文件類型:-
表示普通文件,d
表示目錄,l
表示符號鏈接等。
使用 chmod 修改權限
符號法(適合讀寫改)
chmod u+x script.sh # 給所有者添加執行權限
chmod go-w file.txt # 移除用戶組和其他用戶的寫權限
chmod a+r config.cfg # 所有人添加讀權限
數字法(適合整體設置)
權限通過三位八進制數表示,每位分別對應所有者、用戶組和其他用戶。
- 讀(r)= 4,寫(w)= 2,執行(x)= 1,疊加計算
chmod 755 run.sh # 所有者 rwx,用戶組和其他用戶 rx
chmod 644 index.html # 所有者 rw,用戶組和其他用戶 r
在實際使用中,我常通過 chmod +x examp
給可執行程序添加執行權限。需要注意的是,不建議直接使用 chmod 777
這樣的權限設置,因為它會賦予所有用戶讀、寫、執行權限,等于完全開放,可能導致系統權限控制形同虛設,帶來安全隱患。
文件所有者與用戶組管理
在 Linux 中,每個文件或目錄都有一個所有者(user)和一個所屬用戶組(group),它們決定了該文件的訪問權限歸屬。合理設置文件的所有權是權限控制的重要組成部分。
文件所有者
文件的所有者通常是創建該文件的用戶,擁有對文件最全面的控制權限。所有者可以使用 chmod
修改權限,也可以通過 chown
更改所有權。
在 Linux 中,文件所有者對文件具有最高的權限控制能力。除非主動賦權,其他用戶無法查看、修改或執行該文件。這種機制是 Linux 用于保護用戶數據安全和隱私的核心方式之一。
只有在所有者顯式開放權限后,其他用戶才能訪問該文件。但如果系統僅區分“文件所有者”和“其他用戶”,那么一旦授權,所有非所有者用戶都將獲得訪問權限,這在實際使用中往往過于寬泛。
查看所有者
ls -l filename
第一個root所在的位置為文件所有者。
修改文件所有者
sudo chown newuser filename
用戶組
用戶組是 Linux 中用于歸類管理用戶的機制。每個文件或目錄都歸屬于一個用戶組,組內用戶可以根據設定的權限訪問或修改資源。通過用戶組,文件所有者可以僅向特定用戶開放權限,而非對所有其他用戶一視同仁。當文件所有者與部分用戶屬于同一組時,只需為該組設置權限,這些用戶即可訪問文件,而其他用戶仍被限制。這種方式在團隊協作中尤為實用,能夠實現團隊成員間資源共享,同時對非成員保持私有。
查看用戶組
# 查看當前用戶所屬的所有組
groups
# 查看指定用戶的所屬組
groups 用戶名
# 查看系統中所有用戶組
cat /etc/group
# 優化輸出
cut -d: -f1 /etc/group
修改文件所屬用戶組
sudo chown 用戶名:用戶組 文件名
sudo chgrp newgroup 文件名
特殊權限
除了基本的 r
(讀)、w
(寫)、x
(執行)權限外,Linux 還支持三種特殊權限,用于增強權限控制,常用于提升系統安全性或實現特定功能。下圖可以看到一些隱藏文件或系統文件設置了這些特殊權限,以確保它們在共享、執行或刪除時受到更嚴格的管理。
SUID(Set User ID)
SUID 設定后,用戶執行該文件時,將臨時以文件所有者的身份運行。常見于需要普通用戶執行部分系統操作的程序,如 passwd
。
chmod u+s 文件名
權限標識:所有者的執行位顯示為 s
,如 -rwsr-xr-x
SGID(Set Group ID)
SGID 對文件作用類似于 SUID,而對目錄則更常見,表示新建的文件將繼承目錄的所屬組。常用于共享目錄。
設置命令:chmod g+s 目錄名
權限標識:組執行位顯示為 s
,如 drwxr-sr-x
Sticky Bit
設置 Sticky Bit 后,目錄中的文件只能被其所有者或 root 刪除,即使其他用戶擁有寫權限。常用于 /tmp
目錄。
設置命令:chmod +t 目錄名
權限標識:其他用戶執行位顯示為 t
,如 drwxrwxrwt
用戶身份管理
身份切換
在 Linux 系統中,出于安全考慮,日常使用一般不建議直接以 root 用戶登錄。但某些操作需要 root 權限,這時可以通過用戶身份切換命令完成。常用命令有兩種:su
和 sudo
。
su命令(Switch User)
su [options] [username]
用于切換到指定用戶身份,若不指定 username
,則默認切換為 root
用戶。
常用參數說明:
-
或-l
:使用 login shell 的方式讀取目標用戶的環境變量(推薦使用)-m
:保留當前用戶的環境設置-c "command"
:僅執行一次命令后返回當前身份
區別說明:
su
:切換用戶但不加載目標用戶環境(non-login shell),如PATH
變量等不會更新su -
:切換并加載目標用戶完整環境(login shell),推薦使用
注意事項: 使用 su
切換到 root 時需要輸入 root 用戶密碼。完成操作后可使用 exit
返回原用戶。
sudo 命令(Superuser Do)
sudo
允許普通用戶在不知曉 root 密碼的情況下,臨時以 root 權限執行命令。前提是該用戶已被授權使用 sudo
,授權信息存儲在 /etc/sudoers
文件中。
執行流程:
- 系統檢查當前用戶是否在 sudo 白名單中(通過
/etc/sudoers
) - 若有權限,用戶輸入自己的密碼(root 用戶免密)
- 驗證通過后執行命令
sudoers文件配置
sudoers
文件用于配置哪些用戶或用戶組可以使用 sudo
以及他們能以何種身份執行哪些命令。
格式說明:
用戶名 主機名=(可切換身份:目標組) 可執行命令
示例:
testuser ALL=(ALL:ALL) ALL # 可切換為任意用戶身份,執行任意命令
testuser ALL=(root:root) ALL # 僅能以 root 身份執行任意命令
testuser ALL=(root:root) /usr/bin/passwd # 僅能以 root 身份執行 passwd 命令
這種權限分配機制保證了在保障系統安全的同時,也賦予用戶必要的操作能力。如果你有團隊管理需求,還可以通過用戶組與 sudoers 配合實現更細粒度的權限控制。
查詢用戶信息
Linux 提供了多種命令,用于查詢當前或指定用戶的相關信息,常見命令如下:
命令 | 功能說明 |
---|---|
id <user> | 顯示指定用戶的 UID、GID、所屬用戶組等信息(默認顯示當前用戶) |
who am i / who -m | 顯示當前登錄會話用戶的信息(來源于登錄終端) |
whoami | 顯示當前有效用戶的用戶名(可能與登錄用戶不同) |
w | 顯示當前系統所有登錄用戶的信息及其活動狀態 |
who | 顯示當前系統所有登錄用戶的信息 |
last <user> | 顯示指定用戶的歷史登錄記錄(默認顯示當前用戶) |
lastlog -u <user> | 顯示指定用戶最近一次登錄信息(默認顯示所有用戶) |
注:此處不再展示各命令的執行效果,建議讀者自行實驗。