跳轉到內容

Linux 文件權限管理 | chmod、chown 命令完全解析與最佳實踐

Linux File Permissions

Linux 操作系統中對權限的管理很嚴格。Linux 系統中不僅是對用戶與組根據 UID,GID 進行了管理,還對 Linux 系統中的文件,按照用戶與組進行分類,針對不同的群體進行了權限管理,用他來確定誰能通過何種方式和目錄進行訪問和操作。

理解並正確配置文件權限是 Linux 系統安全的基石。本文將全面解析 Linux 權限系統的工作原理和實際應用。

Linux 的文件權限詳解

權限共有 10 個字符,我們將它分為 4 大部分來理解:

表示文件的類型

-表示是一個文件
d表示是一個目錄
l表示是一個連接(理解為快捷方式)
c字符設備文件
b塊設備文件
ssocket 文件
p命名管道文件

用戶組類型

縮寫用戶組類型
uowner屬主 :當前用戶具有的對該文件的權限
ggroup當前組內其他用戶具有對該文件的權限
oother其他組的用戶具有的對該文件的權限
aall所有用戶(u+g+o)

權限類型

  • rRead
  • wWrite
  • xexecute 執行
  • -:無權限

針對目錄加執行權限,文件不加執行權限(因文件具備執行權限有安全隱患)

針對文件和目錄來說,r,w,x 有著不同的作用和含義

命令針對文件針對目錄
r讀取文件內容查看目錄下的文件列表
w修改文件內容刪除和創建目錄下的文件
x執行權限對除二進制程序以外的文件沒什麼意義可以 cd 進入目錄,能查看目錄中文件的詳細屬性,能訪問目錄下文件內容(基礎權限)

TIP

root 賬戶不受文件權限的讀寫限制,執行權限受限制

權限位完整解析

bash
# 查看文件權限
ls -l filename

# 示例輸出
-rwxr-xr-- 1 user group 1024 Jan 15 10:30 script.sh
^ ^^^ ^^^ ^^^
| |   |   |
| |   |   └─ 其他用戶權限 (r--)
| |   └───── 組權限 (r-x)
| └───────── 所有者權限 (rwx)
└─────────── 文件類型 (-)
權限項文件類型執行執行
字符表示(d|l|c|s|p)(r)(w)(x)(r)(w)(x)(r)(w)
數字表示42142142
權限分配文件所有者文件所屬組用戶其他用戶

用戶獲取文件權限的順序:先看是否為所有者,如果是,則後面權限不看;再看是否為所屬組,如果是,則後面權限不看。

權限的數字表示法

權限值計算

每個權限都有對應的數值:

  • r (讀) = 4
  • w (寫) = 2
  • x (執行) = 1
  • - (無) = 0

常見權限組合

權限字符串計算方式八進制值說明
rwx4+2+17完全控制
rw-4+2+06讀寫
r-x4+0+15讀執行
r--4+0+04只讀
-wx0+2+13寫執行
-w-0+2+02只寫
--x0+0+11只執行
---0+0+00無權限

三位權限碼示例

bash
# 755 = rwxr-xr-x
chmod 755 script.sh
# 所有者:rwx (7)
# 組:r-x (5)
# 其他:r-x (5)

# 644 = rw-r--r--
chmod 644 file.txt
# 所有者:rw- (6)
# 組:r-- (4)
# 其他:r-- (4)

# 600 = rw-------
chmod 600 private.key
# 所有者:rw- (6)
# 組:--- (0)
# 其他:--- (0)

修改文件權限

chownchange owner 的意思,主要作用就是改變文件或者目錄所有者。

chmod修改文件和文件夾讀寫執行屬性。使用權限:所有使用者
chown修改文件和文件夾的用戶和用戶組屬性。使用權限:root

chmod 命令詳解

mode 方式(符號模式)

bash
chmod who opt per file
who u g o a(all) (u 用戶 userg 用戶組 groupo 其他用戶a 所有用戶默認)
opt+ 添加某個權限 - 取消某個權限 = 賦予權限
perr w x X

示例:

bash
chmod u=rwx,g=r a.txt
chmod u+x,g+w,o+w test.log #r 讀,w 寫, x 執行

# 更多示例
chmod +x script.sh         # 所有人添加執行權限
chmod u-w file.txt         # 移除所有者寫權限
chmod go=r file.txt        # 組和其他用戶設為只讀
chmod a+x program          # 所有人添加執行權限

數字方式設置權限

命令語法

使用數字方式修改文件權限的基本語法如下:

bash
chmod xxx file

其中 xxx 是一個三位數,分別表示用戶、用戶組、其他用戶的權限。

權限對應關係表

權限數字值權限總和
rwx4217
rw-4206
r--4004
  • 0 表示無權限
  • 1 表示執行權限(x
  • 2 表示寫權限(w
  • 4 表示讀權限(r

權限示例

bash
-rwxr--r-- 1 root root 10 oct 16 02:55 yhp.log
權限類別權限字符串數值拆解權限總和
用戶權限rwx4+2+17
用戶組權限r--4+0+04
其他用戶權限r--4+0+04

權限組合示例:744

代表用戶擁有讀、寫、執行權限,組和其他用戶只有讀權限。

chown 命令詳解

基本語法

bash
chown [選項]... [所有者][:[組]] 文件...

常用用法

bash
# 修改文件所有者
chown user file.txt

# 修改所有者和組
chown user:group file.txt

# 僅修改組
chown :group file.txt
# 或
chgrp group file.txt

# 遞歸修改目錄
chown -R user:group directory/

# 參考其他文件的權限
chown --reference=ref_file target_file

實際應用場景

bash
# 1. Web 服務器文件權限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html

# 2. SSH 密鑰權限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys

# 3. 腳本文件權限
chmod 755 deploy.sh
chown deployer:deployers deploy.sh

# 4. 數據庫文件權限
chown mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql

修改權限示例

以下操作展示如何修改文件權限:

  • 所有人都加入寫入權限(+2)
  • 給用戶組加入寫入權限(+2)
  • 給其他用戶加入執行權限(+1)

權限組合結果:765

bash
chmod 765 a.txt

權限修改實戰案例

bash
# 案例 1:創建安全的私鑰文件
touch private.key
chmod 600 private.key
# 結果:-rw------- (只有所有者可讀寫)

# 案例 2:設置共享目錄
mkdir shared_folder
chmod 775 shared_folder
chown :developers shared_folder
# 結果:drwxrwxr-x (組成員可讀寫執行)

# 案例 3:Web 應用權限
find /var/www/app -type f -exec chmod 644 {} \;
find /var/www/app -type d -exec chmod 755 {} \;
chmod 600 /var/www/app/config/database.yml

# 案例 4:批量修改權限
# 將所有 .sh 文件設為可執行
find . -name "*.sh" -exec chmod +x {} \;

# 將所有配置文件設為只讀
find /etc/myapp -name "*.conf" -exec chmod 644 {} \;

特殊權限位

除了基本的 rwx 權限,Linux 還有三個特殊權限位:

SUID (Set User ID) - 4000

bash
# 設置 SUID
chmod u+s executable
chmod 4755 executable

# 效果:運行該文件時,以文件所有者的權限執行
# 常見於:passwd, sudo 等命令

ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ...
#     ^ SUID 位

SGID (Set Group ID) - 2000

bash
# 設置 SGID
chmod g+s directory
chmod 2775 directory

# 效果:
# - 對文件:以文件所屬組權限執行
# - 對目錄:新創建的文件繼承目錄的組

# 應用場景:共享協作目錄
mkdir /shared/project
chmod 2775 /shared/project
chown :developers /shared/project

Sticky Bit - 1000

bash
# 設置粘滯位
chmod +t directory
chmod 1777 directory

# 效果:目錄中的文件只能被所有者刪除
# 常見於:/tmp 目錄

ls -ld /tmp
# drwxrwxrwt ...
#           ^ Sticky bit

特殊權限組合示例

bash
# 同時設置多個特殊權限
chmod 6755 script.sh
# SUID (4) + SGID (2) + rwxr-xr-x (755)

# 查看特殊權限
stat filename
ls -l filename

高級權限管理技巧

1. umask - 默認權限掩碼

bash
# 查看當前 umask
umask
# 輸出:0022

# 計算默認權限
# 文件:666 - 022 = 644 (rw-r--r--)
# 目錄:777 - 022 = 755 (rwxr-xr-x)

# 臨時修改 umask
umask 027
# 文件:666 - 027 = 640 (rw-r-----)
# 目錄:777 - 027 = 750 (rwxr-x---)

# 永久修改(添加到 ~/.bashrc)
echo "umask 027" >> ~/.bashrc

2. ACL (Access Control Lists)

bash
# 查看 ACL
getfacl file.txt

# 設置 ACL
setfacl -m u:username:rwx file.txt
setfacl -m g:groupname:rx file.txt

# 刪除 ACL
setfacl -x u:username file.txt

# 遞歸設置 ACL
setfacl -R -m u:username:rwx directory/

3. 權限審計

bash
# 查找 SUID 文件
find / -perm -4000 -type f 2>/dev/null

# 查找 SGID 文件
find / -perm -2000 -type f 2>/dev/null

# 查找世界可寫文件
find / -perm -0002 -type f 2>/dev/null

# 查找無主文件
find / -nouser -o -nogroup 2>/dev/null

權限安全最佳實踐

1. 最小權限原則

bash
# ❌ 不安全:所有人可寫
chmod 777 important_file

# ✅ 安全:僅所有者可讀寫
chmod 600 important_file

# ✅ 適中:所有者讀寫,組只讀
chmod 640 important_file

2. 敏感文件保護

bash
# SSH 密鑰
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/*.pub

# GPG 密鑰
chmod 700 ~/.gnupg
chmod 600 ~/.gnupg/*

# 密碼文件
chmod 600 .env
chmod 600 config/secrets.yml

3. Web 服務器權限

bash
# Nginx/Apache 推薦權限
chown -R www-data:www-data /var/www
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;

# 上傳目錄特殊處理
chmod 775 /var/www/uploads
chown www-data:www-data /var/www/uploads

4. 定期權限檢查

bash
#!/bin/bash
# permission_audit.sh

echo "=== SUID Files ==="
find / -perm -4000 -type f 2>/dev/null

echo -e "\n=== World-Writable Files ==="
find / -perm -0002 -type f 2>/dev/null

echo -e "\n=== Unowned Files ==="
find / -nouser -o -nogroup 2>/dev/null

echo -e "\nAudit complete!"

常見問題排查

問題 1:Permission denied

bash
# 錯誤:Permission denied

# 診斷步驟
ls -l file.txt              # 檢查權限
whoami                      # 確認當前用戶
groups                      # 查看用戶組

# 解決方案
sudo chmod +r file.txt      # 添加讀權限
sudo chown $USER file.txt   # 更改所有者

問題 2:無法執行腳本

bash
# 錯誤:Permission denied

# 檢查執行權限
ls -l script.sh
# -rw-r--r-- (缺少 x 權限)

# 添加執行權限
chmod +x script.sh
# 或
chmod 755 script.sh

問題 3:目錄無法進入

bash
# 錯誤:cd: permission denied: directory

# 目錄需要執行權限才能進入
ls -ld directory
# drwxr-x--- (如果用戶不在組中,無法進入)

# 解決方案
chmod o+x directory         # 添加其他人執行權限
# 或
usermod -a -G groupname username  # 將用戶加入組

問題 4:權限遞歸問題

bash
# 遞歸修改時保留特殊權限
chmod -R u+rwX,go+rX,go-w directory/

# X (大寫) 只對目錄和已有執行權限的文件生效

總結

Linux 文件權限系統是系統安全的核心:

  1. 理解權限模型:用戶、組、其他用戶三層權限
  2. 掌握兩種表示法:符號模式和數字模式
  3. 善用特殊權限:SUID、SGID、Sticky Bit
  4. 遵循最小權限原則:只授予必要的權限
  5. 定期審計:檢查異常權限設置

關鍵命令速查:

bash
chmod 755 file        # 設置權限
chown user:group file # 更改所有者
ls -l                 # 查看權限
umask 022             # 設置默認權限掩碼
getfacl file          # 查看 ACL

下一步學習:

掌握權限管理,讓你的 Linux 系統更安全!🔒

最後更新於: